[OS] 교착 상태 (Deadlock)
3줄 요약
교착 상태(Deadlock)는 자원을 점유한 채 다른 자원을 기다리며 모든 프로세스가 멈춘 상태
4가지 조건(상호 배제, 점유와 대기, 비선점, 원형 대기)이 모두 충족될 때 발생
예방·회피·검출·무시 등 다양한 해결 방식이 존재
💻 컴퓨터 구조 & 운영체제 시리즈
이 시리즈는 『혼자 공부하는 컴퓨터 구조+운영체제』 (강민철 저)
+ 인프런 강의를 기반으로 개인적으로 복습 및 정리한 기록입니다.
💥 교착 상태(Deadlock)
일어나지 않을 사건을 기다리며 프로세스의 실행이 멈추는 상태
- 대표 예시: 식사하는 철학자 문제
- 일정 시간 생각한다
- 왼쪽 포크가 사용 가능할 때까지 대기 → 가능하면 집어든다
- 오른쪽 포크가 사용 가능할 때까지 대기 → 가능하면 집어든다
- 두 포크를 모두 잡은 경우 식사를 한다
- 오른쪽 포크를 내려놓는다
- 왼쪽 포크를 내려놓는다
- 다시 1번으로 돌아간다
→ 모든 철학자가 동시에 한 손에 포크를 들고 다른 한 손의 포크를 기다리면 영원히 기다리는 상태가 발생
- 공유 자원을 점유한 프로세스들이 서로 자원을 기다리며 무한 대기
- 교착 상태는 시스템 자원의 비효율적 사용으로 이어짐
🔒 발생 조건 (4가지 모두 만족해야 발생)
상호 배제 (Mutual Exclusion)
→ 자원은 한 번에 한 프로세스만 사용할 수 있음점유와 대기 (Hold and Wait)
→ 자원을 점유한 상태에서 다른 자원을 기다리는 상황비선점 (No Preemption)
→ 다른 프로세스가 점유한 자원을 강제로 빼앗을 수 없음원형 대기 (Circular Wait)
→ 각 프로세스가 다음 프로세스가 점유한 자원을 기다리는 순환 구조
이 중 하나라도 제거하면 교착 상태를 방지할 수 있음
🧭 자원 할당 그래프
- 자원과 프로세스 간의 관계를 시각적으로 표현
- 프로세스는 원으로, 자원은 사각형으로 표현
- 사용할 수 있는 자원의 개수는 자원 사각형 내 ‘점’으로 표현
- 프로세스가 자원을 할당 받아 사용 중이라면 자원에서 프로세스로 화살표로 표시
- 프로세스가 자원을 기다리고 있다면 프로세스에서 자원으로 화살표로 표시
- 프로세스: 원 / 자원: 사각형 / 할당: 자원 → 프로세스 / 요청: 프로세스 → 자원
- 원형 구조가 발생하면 교착 상태 가능성
🛡️ 교착 상태 예방 (Prevention)
교착 상태 발생 조건 중 하나 이상을 제거
상호 배제 제거
→ 자원을 모두 공유 자원으로 만들기 (현실적으로 불가능)점유와 대기 제거
→ 프로세스가 모든 자원을 한 번에 요청하거나 아무것도 요청하지 않도록 설정 (자원 활용률 ↓)비선점 제거
→ 자원이 선점 가능해야 함 (CPU는 가능, 대부분 자원은 어려움)원형 대기 제거
→ 자원에 번호를 매겨 순서대로 요청 (설계 복잡성 ↑)
💡 교착 상태 회피 (Avoidance)
교착 상태가 발생하지 않도록 자원을 조심스럽게 할당
안전 상태 (Safe State)
→ 모든 프로세스가 순서대로 자원을 할당받고 종료할 수 있는 상태불안전 상태 (Unsafe State)
→ 교착 상태가 발생할 수 있는 상태은행원 알고리즘 (Banker’s Algorithm)
- 은행원 알고리즘
→ 시스템 자원의 최대 요청량을 기반으로 안전 상태를 유지하면서 자원 배분
- 은행원 알고리즘
🛠️ 교착 상태 검출 후 회복
교착 상태를 일단 허용하고, 이후에 해결
선점을 통한 회복
→ 특정 프로세스에서 자원을 회수하여 다른 프로세스에게 할당프로세스 강제 종료
→ 교착 상태에 있는 프로세스를 모두 또는 일부 강제 종료
🪶 교착 상태 무시: 타조 알고리즘
- 타조 알고리즘
- “교착 상태는 자주 발생하지 않으니 무시하자”
- 실제로 대부분의 운영체제는 검출도 회피도 하지 않고 방치
- 예: Linux, Windows
✅ 마무리 정리
교착 상태는 공유 자원을 둘러싼 프로세스 간 대기로 발생
4가지 조건이 모두 충족될 때 가능하며,
예방, 회피, 검출 및 회복 등 다양한 방식으로 대응 가능
📚 참고 자료
- 『혼자 공부하는 컴퓨터 구조+운영체제』 - 강민철 저
- 인프런 강의 - 혼자 공부하는 컴퓨터 구조+운영체제 기반 강의
읽어주셔서 감사합니다 🙌
내용이 도움이 되었거나, 틀린 부분이 있다면 댓글이나 GitHub Issue로 알려주세요 😊