1. 교착 상태(데드락)란?
💡 2개 이상의 작업이 동시에 이루어지는 경우, 다른 작업이 끝나기만 기다리며 작업을 더 이상 진행하지 못하는 상태
- 아사(기아) 현상과 다른점!
- 아사 현상은 잘못된 정책으로 특정 프로세스의 작업이 지연되는 문제
- 교착 상태는 여러 프로세스가 작업을 진행하다 보니 발생하는 자연적인 현상.
따라서 강압적으로 해결해야 함(like 교통정리)
- 식사하는 철학자🍴

이미지 출처: 위키백과
✔️ 둥근 식탁에 앉은 철학자들은 왼쪽에 있는 포크를 잡은 뒤 오른쪽 포크를 잡아야만 식사가 가능함
✔️ 철학자들은 음식을 먹기 위해 왼쪽 포크를 잡은 뒤 오른쪽 포크를 봄
✔️ 하지만 이미 왼쪽 포크를 들고 있는 다른 철학자가 있음
✔️ 결과적으로 오른쪽 포크를 아무도 잡지 못해 모두 굶어 죽음💀
2. 교착 상태 필요조건
💡 아래 네 가지 조건을 동시에 만족해야만 교착 상태가 발생함
1. 상호 배제
- 한 프로세스가 사용하는 자원을 다른 프로세스가 사용할 수 없는 상태
2. 점유와 대기
- 프로세스가 어떤 자원을 할당 받은 상태에서 다른 자원을 할당 받기를 기다리는 상태
3. 비선점
- 어떤 프로세스도 다른 프로세스의 자원을 강제로 빼앗지 못하는 상태
4. 원형 대기
- 점유와 대기를 하는 프로세스 간의 관계가 원을 이루어야 함
3. 교착 상태 해결 방법
1. 예방
- 교착 상태를 유발하는 네 가지 조건이 발생하지 않도록 무력화 하는 방식(부작용 있음)
✔️ 상호 배제 예방
- 시스템 내의 자원을 모두 공유하게 만든다?
- 임계 구역이 보호 받지 못하면 작업 결과가 달라짐!
- 결론: 사실상 어렵다
✔️ 비선점 예방
- 모든 자원을 빼앗을 수 있도록 만드는 방법
- 아사 현상 발생 가능
- 모든 자원이 선점 가능한 것은 아님 ex) 프린터기
✔️ 점유와 대기 예방
- 프로세스가 자원을 점유한 상태에서 다른 자원을 기다리지 못하게 하는 방법
== 전부 할당하거나 아예 할당하지 않는 방식
- 프로세스가 자신이 사용하는 모든 자원을 자세히 알기 어려움(추가로 필요한 자원이 생기면 확보하기 어려움)
- 자원의 활용성이 떨어짐
✔️ 원형 대기 예방
- 점유와 대기를 하는 프로세스들이 원형을 이루지 못하도록 막는 방법
- 자원에 번호를 붙이고 오름차순으로 할당함
- 자원에 번호를 어떻게 부여할지 문제가 됨(어떤 번호를 붙이는지에 따라 활용률이 달라지기 때문에)
2. 회피
- 프로세스에 자원을 할당할 때 어느 수준 이상의 자원을 나누어주면 교착 상태가 발생하는지 파악하여 그 수준 이하로 나누어주는 방법
- 교착 상태가 발생하지 않는 범위 내에서만 자원을 할당함
- 교착 상태가 발생하는 범위에 있으면 프로세스를 대기 시킴
2.1 은행원 알고리즘
- 은행에서 대출 금액이 가능한 범위 내(안정 상태)이면 대출을 허용하고 그렇지 않으면 거부되는 것과 비슷해서 이러한 명칭이 붙음
- 안정 상태: 모든 프로세스가 요청한 자원을 순서대로 할당받아 실행될 수 있는 상태
- 만약 P2가 자원을 요청하면 2만큼을 추가로 할당받고 실행을 종료한 뒤 6을 반환함
- 이런식으로 전체 작업을 완료할 수 있기 때문에 안정 상태임

- 사용 가능한 자원이 1인 상태인데 이는 현재 남은 자원으로는 어떤 프로세스도 끝낼 수 없다는 의미
2.2 교착 상태 회피의 문제점
1️⃣ 프로세스가 자신이 사용할 모든 자원을 미리 선언해야 함(정확하지 않을 수 있음)
2️⃣ 시스템의 전체 자원 수가 고정적이어야 함(시스템의 자원수는 유동적임. 고장이나 새로운 자원 추가 등등)
3️⃣ 자원이 낭비됨
- 프로세스에 따라 최대 자원을 사용하지 않고 종료되는 경우도 있음
- 교착 상태 회피에서는 실제로 교착 상태가 발생하지 않는데도 발생할 것이라고 예상하고 자원을 할당하기 때문에 교착 상태가 발생하지 않을 경우 자원 낭비가 됨
3. 교착 상태 검출과 회복
- 교착 상태의 발생을 인정하고 사후에 조치하는 방식
- 프로세스가 자원을 요구하면 일단 할당, 교착 상태가 검출되면 회복
선점을 통한 회복
- 교착 상태가 해결될 때까지 한 프로세스씩 자원을 몰아주는 방식
프로세스 강제 종료를 통한 회복
- 교착 상태에 놓인 프로세스 모두 강제 종료
- 교착 상태가 해결될 때까지 한 프로세스씩 강제 종료
- 교착 상태가 회복이 됐는지 안 됐는지 계속 확인하느라 오버헤드 발생
참조
📚 쉽게 배우는 운영체제
🧑🏻🏫 개발자를 위한 컴퓨터공학1: 혼자 공부하는 컴퓨터구조 + 운영체제