티스토리 뷰
데드락(DeadlocK)
시스템 자원에 대한 요구가 뒤엉켜서, 둘 이상의 프로세스가 다른 프로세스가 점유하고 있는 자원을 서로 기다리며 무한 대기에 빠지는 상황
데드락 발생 조건
상호 배제
- 한 번에 하나의 프로세스만 자원을 사용할 수 있음
- 사용중인 자원을 다른 프로세스가 사용하려면 해제될때까지 기다려야 함
점유 대기
- 다른 프로세스에 할당된 자원을 점유하기위해 대기하는 프로세스가 존재해야함
비선점
- 이미 할당된 자원을 강제로 뺏을 수 없음
순환 대기
- 대기 프로세스의 집합이 순환 형태로 자원을 기다리고 있어야함
해결 방법
예방(Prevention)
- 데드락이 발생하지 않도록 예방
회피(Avoidance)
- 데드락 발생 가능성을 인정하면서 적절하게 회피
탐지 및 회복(Detection & Recovery)
- 데드락 발생을 허용하나 이를 탐지하여 회복
데드락 예방
- 데드락 발생 조건 4가지 중 한 조건이라도 발생하지 않도록 방지(부정)하여 발생 가능성을 차단하는 것
- 시스템의 처리량이나 효율성을 떨어트리는 단점
- 상호 배제 조건 방지
- 한 번에 여러 프로세스가 공유자원을 사용할 수 있도록 허용
- 자원 동기화 문제가 발생할 수 있음
- 점유 대기 조건 방지
- 프로세스 실행에 필요한 모든 자원을 한꺼번에 요구하고 허용할때까지 작업을 보류
- 점유 대기 상황 자체가 발생하지 않도록 막아버림
- 비선점 조건 방지
- 높은 우선순위의 프로세스가 해당 자원을 선점할 수 있도록 함
- 순환 대기 조건 방지
- 순환형태가 아닌 일정한 방향으로 자원을 요구할 수 있도록 함
데드락 회피
- 예방보다 덜 제한적인 방법
- 자원을 할당한 후에도 시스템이 항상 안정 상태에 있도록 할당하는 방법
- 안정 상태(Safe state)
- 프로세스 들이 요청하는 모든 자원을, 데드락을 일으키지 않고 모두에게 차례로 할당할 수 있는 상태
- 안전 순서(Safe sequence)
- 데드락이 발생하지 않는 순서
- 불안정 상태
- 안전 상태가 아닌 상황
- 교착 상태(데드락)는 불안정 상태의 부분 집합
은행원 알고리즘(Banker's algorithm)
- 미리 결정된 모든 자원들의 최대 가능한 할당량을 바탕으로 시뮬레이션하여, Safe state에 들 수 있는지 검사
- 교착 상태 가능성을 미리 조사하는 것
e.g) 시스템이 총 12개의 자원을 가지고 있는 경우
프로세스 | 최대 자원 요청량 | 현재 할당중인 자원의 양 | 필요한 자원의 양 |
P0 | 10 | 5 | 5 |
P1 | 4 | 2 | 2 |
P2 | 9 | 2 | 7 |
12개의 자원 중 9개(5 + 2 + 2)의 자원을 현재 사용중이므로, 남은 사용가능한 자원은 3개
이때의 안전 순서(Safe sequence)는 <P1, P0, P2>
- 남은 3개의 자원 중 2개를 P1 프로세스에게 할당, 남은 사용가능한 자원은 1개
- P1이 작업을 마친 후 4개의 자원을 반납
- 5개의 자원(P1이 반납한 4개의 자원 + 남아있던 사용가능한 자원 1개)을 P0에게 할당
- P0이 작업을 마친후 10개의 자원을 반납
- P2에게 7개의 자원을 할당, 남은 사용 가능한 자원은 3개
- P2가 작업을 마친후 9개의 자원을 반납, 모든 프로세스가 작업을 마치고 사용 가능한 자원은 12개
만일 P2가 1개의 자원을 더 요청한다면?
- P2에게 총 3개의 자원(기존 할당된 자원 2개 + 새롭게 할당한 자원 1개)을 할당, 현재 남은 사용가능한 자원은 2개
- 2개의 자원을 P1에게 할당, 남은 사용가능한 자원은 0개
- P1이 작업을 마친 후 4개의 자원을 반납
- 사용 가능한 자원 4개를 P0에게 먼저 주든, P2에게 먼저 주든 작업을 마칠 수 없음
👉 P0, P2는 자원을 할당받기를 기다리며 교착상태에 빠지게됨
P2 한개의 자원을 더 요청했을때,
운영체제가 자원할당량을 사전에 파악하여 P2에게 할당하지 않고, P1이 먼저 끝나게 한다면 데드락이 발생하지 않음
👉 자원할당량을 사전에 파악하고 데드락을 회피
은행원 알고리즘을 사용할 때에는 미리 최대 자원 요구량을 알고, 할당할 수 있는 자원 수가 일정해야한다는 제약 조건이 있음
데드락 탐지 및 회복
데드락 예방이나 회피를 사용하지 않고, 데드락이 발생할 경우 이를 탐지하고 회복
- 탐지
- Allocation, Request, Available 등으로 시스템에 데드락이 발생했는지 탐색
- 현재 시스템의 자원할당상태를 가지고 파악
- 회복
- 순환 대기 에서 벗어나 데드락으로부터 회복
- 단순 프로세스 중단
- 교착 상태에 빠진 모든 프로세스를 중단
- 연산중이던 프로세스들이 모두 동시에 중단되어 결과가 폐기될 수 있음
- 프로세스를 하나씩 중단시키며, 탐지 알고리즘으로 데드락을 탐지하고 회복
- 매번 탐지 알고리즘을 호출 및 수행한다는 부담이 존재
- 교착 상태에 빠진 모든 프로세스를 중단
- 자원 선점
- 프로세스에 할당된 자원을 선점해서, 교착 상태를 해결할 때까지 그 자원을 다른 프로세스에게 할당
- 단순 프로세스 중단
- 순환 대기 에서 벗어나 데드락으로부터 회복
출처
'데이터베이스' 카테고리의 다른 글
[MySQL] Multi Column Index(복합 인덱스) (0) | 2024.09.25 |
---|---|
[MySQL] Clusterd Index와 Non-clustered Index, B-Tree (1) | 2024.09.24 |
데이터 이력관리 - 점이력, 선분이력 (0) | 2023.02.11 |
[Oracle] DUAL 테이블의 개념과 사용법 (0) | 2022.06.25 |
트랜잭션(Transaction)관리와 COMMIT과 ROLLBACK (0) | 2022.06.25 |
Comments