두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에 결과적으로 아무것도 완료되지 못하는 상태
다음의 조건들을 모두 충족할 경우 발생한다.
프로세스들이 필요로 하는 자원에 대해 배타적인 통제권을 요구한다.
프로세스가 할당된 자원을 가진 상태에서 다른 자원을 기다린다.
프로세스가 어떤 자원의 사용을 끝낼 때까지 그 자원을 뺏을 수 없다.
각 프로세스는 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있다.
현재 대부분의 운영 체제들은 교착 상태를 막는 것이 불가능하며, 교착 상태가 발생할 경우 제각기 다른 비표준 방식들로 교착 상태에 대응한다.
상호배제 조건의 제거
교착 상태는 두 개 이상의 프로세스가 공유가능한 자원을 사용할 때 발생하는 것이므로 공유 불가능한, 즉 상호 배제 조건을 제거하면 교착 상태를 해결할 수 있음
점유와 대기 조건의 제거
비선점 조건의 제거
비선점 프로세스에 대해 선점 가능한 프로토콜을 만들어 줌
환형 대기 조건의 제거
자원 사용의 효율성이 떨어지고 비용이 많이 소모됨
G = (V, E)
𝐴𝑣𝑎𝑖𝑙𝑎𝑏𝑙𝑒[𝑗] == 𝑘 → 𝑅𝑗의 𝑘개의 인스턴스 사용 가능
𝑀𝑎𝑥[𝑖][𝑗] == 𝑘 → 𝑇𝑖가 𝑅𝑗의 최대 𝑘개의 인스턴스 요청 가능
𝐴𝑙𝑙𝑜𝑐𝑎𝑡𝑖𝑜𝑛[𝑖][𝑗] == 𝑘 → 𝑇𝑖가 현재 𝑅𝑗의 𝑘개의 인스턴스를 현재 할당받고 있음
𝑁𝑒𝑒𝑑[𝑖][𝑗] == 𝑘 → 𝑇𝑖가 𝑅𝑗의 인스턴스를 𝑘개 더 요청할 것임
현재 system의 snapshot이 safety한가를 판별
💡 조건
- 5개의 스레드 집합: 𝑇 = {𝑇0, 𝑇1, 𝑇2, 𝑇3, 𝑇4}
- 세 가지 리소스 집합: 𝑅 = {𝐴, 𝐵, 𝐶}
- 각 자원 유형의 인스턴스 갯수: 𝐴 = 10,𝐵 = 5, 𝐶 = 7
현재 시스템의 snapshot
ex) A
Need[i][j] = Max[i][j] - Allocation[i][j]
(앞으로 요청할 자원 = 최대 갯수 - 이미 할당된 자원의 갯수)
시스템이 현재 안전한 상태(safe state)임을 증명
→ 실제로 〈𝑇1, 𝑇3, 𝑇4, 𝑇0, 𝑇2〉 또는 〈𝑇1, 𝑇3, 𝑇4, 𝑇2, 𝑇0>시퀀스가 안전 기준을 만족
Safety Algorithm을 이용하여 증명
1. 초기화
(3, 3, 2)
𝑇1=false, 𝑇3=false, 𝑇4=false, 𝑇2=false, 𝑇0=false
2. Finish[i] == false && 𝑁𝑒𝑒𝑑𝑖 <= Work (모든 항목에 대해)
1바퀴
- i=0, Need[0] = (7, 4, 3) <= (3, 3, 2) ∴ X
- i=1, Need[1] = (1, 2, 2) <= (3, 3, 2) ∴ O
〔Work = Work + 𝐴𝑙𝑙𝑜𝑐𝑎𝑡𝑖𝑜𝑛[i], Finish[i] = true〕
(5, 3, 2) = (3, 3, 2) + (2, 0, 0), T[1] = true- i=2, Need[2] = (6, 0, 0) <= (5, 3, 2) ∴ X
- i=3, Need[3] = (0, 1, 1) <= (5, 3, 2) ∴ O
〔Work = Work + 𝐴𝑙𝑙𝑜𝑐𝑎𝑡𝑖𝑜𝑛[i], Finish[i] = true〕
(7, 4, 3) = (5, 3, 2) + (2, 1, 1), T[3] = true- i=4, Need[4] = (4, 3, 1) <= (7, 4, 3) ∴ O
〔Work = Work + 𝐴𝑙𝑙𝑜𝑐𝑎𝑡𝑖𝑜𝑛[i], Finish[i] = true〕
(7, 4, 5) = (7, 4, 3) + (0, 0, 2), T[4] = true
2바퀴(아직 T[0], T[2]가 false)
- i=0, Need[0] = (7, 4, 3) <= (7, 4, 5) ∴ O
〔Work = Work + 𝐴𝑙𝑙𝑜𝑐𝑎𝑡𝑖𝑜𝑛[i], Finish[i] = true〕
(7, 5, 5) = (7, 4, 5) + (0, 1, 0), T[0] = true- i=2, Need[2] = (6, 0, 0) <= (7, 5, 5) ∴ O
〔Work = Work + 𝐴𝑙𝑙𝑜𝑐𝑎𝑡𝑖𝑜𝑛[i], Finish[i] = true〕
(10, 5, 7) = (7, 5, 5) + (3, 0, 2), T[2] = true
=> 모든 Finish[i]가 true → safety하다
T[1] → T[3] → T[4] → T[0] → T[2] 또는 T[1] → T[3] → T[4] → T[2] → T[1]순으로 실행하면 thread safety가 보장됨
위의 순서가 바로 safe sequence
💡 교착 상태를 무시했을 때 프로그램에서 발생하는 일
- 교착상태 문제를 무시하고 교착상태가 발생하지 않는다고 가정
- 문제를 무시하고, 교착상태가 시스템에서 결코 발생하지 않은 척 함
- 성능저하 → 시스템 중단 → 인위적인 재시작
- 유닉스와 윈도우를 포함한 대부분의 OS에서 사용하고 있는 방법
💡 wait-for graph
resource-allocation graph에서 변형된 형태
𝑅𝑒𝑞𝑢𝑒𝑠𝑡[𝑖][𝑗] == 𝑘 → 𝑇𝑖가 𝑅𝑗의 인스턴스를 𝑘개 더 요청
📖 참고
- [Wikipedia] 교착 상태
- https://www.inflearn.com/course/운영체제-공룡책-전공강의/
- Siberschatz et. al. 「Operating System Concepts」
- https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=and_lamyland&logNo=221197205167
- Banker's Algorithm