하나의 사다리를 상상해 보자.
한 명은 사다리의 위쪽에서 내려오려고 하고 한 명은 사다리의 아래쪽에서 올라가려고 할 때, 서로가 상대방이 비켜줄 때까지 하염없이 기다리고 있는 상황을 deadlock이라고 할 수 있다.
-wiki
deadlock이 발생하려면 4가지 조건이 모두 만족해야 한다.
3가지 방법이 존재하는데, 모두 이름 그대로다.
예방하거나, deadlock을 피하거나, deadlock이 발생하면 조치하기.
deadlock이 발생하려면 반드시 4가지 조건을 충족해야 했음.
== 4가지 조건 중 하나라도 충족하지 않으면 deadlock은 발생하지 않는다.
하나의 조건이라도 만족시키지 않게 자원을 할당해 보자.
mutual exclusion은 계속 이야기했듯이, 자원을 한 번에 하나의 프로세스에게만 할당하는 것이다.
자원의 mutual exclusion을 없앤다는 것은 모든 자원을 공유 가능하게 한다는 것인데, 당연히 현실적으로 불가능하다.
본질적으로 공유 불가능한 자원이 존재하기 때문이다.
프린터를 여러 프로세스가 공유한다고 생각하면, 이상한 출력물이 나올 것이다.
hold and wait는 한 프로세스가 자원을 이미 할당받은 상태에서 다른 자원을 기다리는 것이다.
이를 없애면, os는 특정 프로세스에 자원을 모두 할당하거나 모두 할당하지 않는 방식으로 배분한다. 이론적으로 deadlock을 해결할 수 있다.
<단점>
비선점 조건을 없애면, 현재 자원을 이용 중인 프로세스로부터 자원을 뺏어올 수 있다. CPU 같은 선점하여 사용할 수 있는 자원엔 효과적.
<단점>
모든 자원에 번호를 붙이고, 오름차순으로 자원을 할당하기.
<단점>
deadlock 발생 가능성이 있을 시 자원을 할당하지 않아 deadlock을 피함
ex. 총 자원이 12라고 가정해 보자.
프로세스 | 요구량 | 현재 사용량 |
---|---|---|
p1 | 10 | 5 |
p2 | 4 | 2 |
p3 | 9 | 2 |
총 자원: 12
할당한 자원(p1, p2, p3 현재 사용량의 합): 9
남은 자원: 3
p2가 필요한 자원 2개를 배분하면
프로세스 | 요구량 | 현재 사용량 |
---|---|---|
p1 | 10 | 5 |
p2 | 4 | 4 |
p3 | 9 | 2 |
총 자원: 12
할당한 자원(p1, p2, p3 현재 사용량의 합): 11
남은 자원: 1
p2는 요구량 전부를 받았고, 실행을 끝내면 자원을 반환
프로세스 | 요구량 | 현재 사용량 |
---|---|---|
p1 | 10 | 5 |
p2 | 4 | |
p3 | 9 | 2 |
총 자원: 12
할당한 자원(p1, p2, p3 현재 사용량의 합): 7
남은 자원: 5
p1에 남은 자원 5개를 배분
프로세스 | 요구량 | 현재 사용량 |
---|---|---|
p1 | 10 | 10 |
p2 | 4 | |
p3 | 9 | 2 |
총 자원: 12
할당한 자원(p1, p2, p3 현재 사용량의 합): 12
남은 자원: 0
p1이 실행을 끝내고 자원을 반환하면
프로세스 | 요구량 | 현재 사용량 |
---|---|---|
p1 | 10 | |
p2 | 4 | |
p3 | 9 | 2 |
총 자원: 12
할당한 자원(p1, p2, p3 현재 사용량의 합): 2
남은 자원: 10
p3에게 필요한 자원 할당하여 실행시킬 수 있음.
p2 → p1 → p3로 자원 배분 시 deadlock이 발생하지 않고 올바르게 작업을 종료할 수 있음.
→ safe sequence
나머지는 unsafe state.
deadlock의 발생 가능성을 허용하고, deadlock 발생 시 recovery 실시.
deadlock cycle이 없어질 때까지 프로세스들로부터 자원을 강제로 회수하는 방법
혼자 공부하는 운영체제