
시스템 안의 자원들이 각각 자원을 가지고 있으면서 다른 자원을 기다리고 있기 때문에
진행이 불가능한 상태인 데드락

P0은 A를 얻고 빼앗기고 P1은 B를 얻고 빼앗긴다
(자원은 세마포어같은 소프트웨어 자원일수도 하드웨어 자원일 수도 있다)
1번 프로세스 A, 2번은 B 가지고 안내놓으면 영원히 진행 안되는 데드락이 발생한다
데드락 원인
자원 동시충족 못할때, 가진자원 내놓지 않을 때
자원이 사용되는 절차 (참고)
자원 요청, 실제 할당, 사용, 다 썼으면 릴리즈

4가지 모두 충족해야 데드락 생긴다

동그라미가 프로세스
사각형이 자원
프로세스(동그라미) -> 자원(네모): 프로세스가 자원 기다림
자원(네모) -> 프로세스(동그라미): 프로세스가 자원 점유
내부 작은 동그라미는 인스턴스
1번 자원은 2번 프로세스 가지고 있고,
2번 프로세스는 2번 자원도 가지고 있고 3번 자원도 가지고 잇다
3번은 3번 프로세스가 가지고있다

위 그래프 보고 데드락 잇는지 없는지 확인 가능
왼쪽은 싸이클이 있어서 데드락 발생
싸이클이 없으면 데드락이 아님
싸이클 있으면 데드락일 가능성이 있다
오른쪽 따라가면 사이클 만들어졌는데
자원과 인스턴스가 2개씩 있기 때문에 데드락 가능성이 있다
하지만 데드락은 아니다. 하나는 무관하게 2번과 4번 프로세스가 가지고 있다
4번이 자원 쓰고 반남할 수 있다. 그러면 반납되는 자원을 3번한테 주면 화살표 바뀌면서 사이클 사라지게 된다
사이클과 무관한 자원이 있기 때문에 데드락 X

1, 2번은 미연에 데드락을 방지
3, 4는 방치

뮤추얼 익스클루젼 (상호배제)
배타적으로 자원을 쓴다는 조건
CPU가 자원을 공유할 수 없다
(이걸 방지할 수는 없다)
Hold and Wait
내가 가진 자원을 내어놓지 않으면서 충족못한 자원을 기다리는 그런 방식으로 인해 데드락 발생한다고 본다
- 필요한 자원이 모두 충족될 때 받는다
wait 상황이 안생기도록한다 => 균일하게 자원을 쓰지 않기 때문에 자원낭비 발생- 자원이 필요할 때 보유 자원을 다 던지고 다시 요청한다
자원 요청할 때 다른 자원 쥐고 있으면서 요청하는걸 허용 안함
일단 가진거 다 내놓고 요청
No Preemption (비선점)
자원을 빼앗지 않는다
자원 중에서 빼앗을 수 있는 자원과 없는 자원이 잇다
CPU나 메모리는 빼앗을 수 있는 자원
CPU는 빼앗는 스케줄링이 있었다(타이머 등)
빼앗아도 괜찮은 이유는 수행하고 있던 문맥을 세이브 했다가 복원해서 쓰기 때문에 다음에 얻었을 때 이후 시점부터 일 할 수 있다
허용되지 않는 자원인 경우 빼앗을 수 없다
노프림션의 조건이 되는 자원은 한정되어 있다
Circular Wait (환형 대기)
하나를 얻어야 다른 하나를 얻을 수 있게 순서를 두어 데드락을 방지한다
(2번 얻어야 5번 얻을 수 있게한다)
원점을 기다리는 친구가 있어서 싸이클대로 돌아갔을 때 데드락이 발생
이런 방법은 자원 이용률 저하와 기아현상 발생시키고 비효율적 방식이다
가용자원 있지만 데드락 때문에 사용하지 않기 때문

추가적인 정보 이용해서 데드락 막는 방법
추가적인 정보
프로세스마다 내 평생 자원 얼마나 쓸지 알려져있다고 가정했을 때,
평생 사용할 자원의 양(최대치)
요청 자원을 할당했을 때, 안전한지 판단 >
안전한 경우에 한해서 할당

자원을 요청햇는데 이 자원은 왼쪽 프로세스가 가지고 있다
먼저 2번 프로세스는 어느 누구도 가지고 있지 않다
2번 프로세스가 자원을 요청했을 때, 2번한테 줄 수 있다 (그림 3)
2번 자원은 2번 프로세스한테 가고, 2번 프로세스가 1번 자원을 요청했는데 1번 프로세스가 가지고 있다
(충족못한 프로세스 2번, 1번은 다 가지고 있는 상태)
1번이 반납할 수 있다고 하면 사이클이 사라지고 데드락이 아니게 된다
그런데 점선을 지금 요청해버리면 싸이클이 생겨서 데드락 발생
(당장 데드락은 아니지만) 점선까지 고려해서 자원을 줘버리면 사이클 생김
비록 가용자원이지만 위험하기 때문에 보수적으로 주지 않는다
가만히 있으면 데드락이 안생긴다
자원당 인스턴스가 하나밖에 없는 상황에서 데드락이 생길것같으면 아예 자원 안주는 (불완전한 상태 원천봉쇄)로 데드락 막는다


5개 프로세스 P
자원 3종류 A, B, C
각각의 인스턴스는 A 10개 B 5개 C 7개
현재 5개의 프로세스에 A, B, C가 어떻게 할당되었는지 보여줌
그 중에 이미 할당된 자원은
7 5 3 에서 0 1 0을 빼서 7 4 3
평생 최대 요청할 양에서 현재 할당된 양을 빼면 추가로 요청할 수 있는 양이 표시(맨 오른쪽 Need)
만약 이 상황에서 0번 프로젝트가 C를 하나 요청한다면 C는 가용자원으로 2개 남아있음
C 요청햇을 때 자원이 여유 있더라도 불안정한 상황이 생길 수 있으면 주지 않는다
가용자원은 3 3 2인데
추가 요청은 7 4 3
만약 0번 프로세스가 평생 최대 요청 자원을 지금 요청해버리면 가용자원을 가지고 충족이 되지 않는다
최악의 경우를 가정해서 할당된 자원 내어놓으면 데드락 발생
최대로 요청했을 때 요청이 여유있는 가용자원으로 처리되지 않으면 요청이 받아들여지지 않음
0번 프로세스 요청은 아무것도 안받아들여진다
1번은?
가용자원 다 가져가더라도 추가요청을 할 일 없음
언젠가는 종료가되고 할당 자원은 다 가용자원으로 내어 놓을 것이다
2번은?
추가요청 A는 6개
여유분 3개밖에 없기 때문에 받아들여지지 않는다
가용자원 확인해서 안전한 상태를 유지
안전하다는 의미는 가용자원만 가지고 프로세스 존재할 수 있는 시퀀스 존재하면 안전
가용자원 내에서 줄 수 있다면 안전
3 3 2 인데 1 2 2 요청하면 다 줄 수 잇음
종료되면 반납됨
A 2개가 추가로 반납
5 3 2 로 최대요청 처리할 수 있는게 3번 요청 0 1 1 그러면 3번 요청 다 줘서 본인 원하는 최대자원받아서 종료
그럼 또 내어놔서 3 2 2 에서 3+2+2 3+1 2+1
7 4 3
가용자원으로 처리가 돼서 0번도 처리
프로세스 종료되면서 점점 안전해지는 시퀀스 존재
시스템 상태는 세이프하다 라고 말할 수 있다
언제나 안전할 수 있게 자원을 할당한다
그 기준은 추가 요청자원과 가용자원 고려

데드락은 생기지 않고 세이프한 상태만을 유지

자원이 있다고 그냥 주는게 아니라 추가요청이 자원으로 충족되면 받아들인다


자원할당 그래프를 간단하게 하자면 자원을 빼고 프로세스만 가지고 그래프를 만들 수 있다
이 프로세스가 다른 프로세스를 기다린다고 만들어 버릴 수 있다
데드락 디텍션에서 wait-for 그래프를 만들어서 데드락이 생겼는지 빨리 찾을 수 있다

예제
프로세스 5개
자원 3종류
(평생 최대자원 얼마나 쓸지 관심사가 아니다)
여유자원이 있으면 무조건 준다 => 데드락이 아니다
Allocation
프로세스한테 할당된 자원
모든 가용자원이 프로세스한테 할당되어 있다
1번 프로세스는 A 두개를 가지고 있다
A 2개, C 2개를 요청 > 가용자원이 없기 때문에 자원을 줄수 없다
하지만 가용자원이 생길 때 줄 수 있게 된다
자원이 생기는 시기
요청 안 받은 프로세스들이 자원 내어놓아서 가용자원이 되면 그걸 전달해줄 수 있다
시퀀스
아무것도 요청 안한 프로세스가 가진 자원을 모아서 요청된 자원을 줄 수 있는 방법
자원을 다 줘서 할당된 일을 하고 내어놓는다고 가정
모든 프로세스가 요청한 것들이 가용자원 만들어서 끝까지 처리가 되면 데드락 상태가 아니다
데드락 디텍션과 뱅커스 알고리즘의 비교

2번 프로세스가 C를 하나 요청해 버리면
자원 요청 안된 프로세스는 0번 뿐
B를 하나 내어놓는다고 해도 나머지 프로세스 중에서 처리할 수 있는 프로세스 한 개도 없다
이와 같은 상황이라면 데드락


뱅커스 알고리즘은 항상 세이프


데드락을 무시하는 방법