프로세스가 작업을 진행하기 위해서는 필요에 따라 CPU, 메모리, 파일, 하드웨어 등 다양한 자원이 요구된다.
A프로세스와 B프로세스가 작업을 진행하기 위해서는 X자원과 Y자원이 요구된다. X자원은 A프로세스가 가지고 있고, Y자원은 B프로세스가 가지고 있다고 할 경우 각각의 프로세스는 요구 조건을 충족하지 못하므로 작업을 진행할 수 없다.
(병렬처리, 자원 공유 방식에 따른 부작용 중 하나이다)
이처럼 2개 이상의 프로세스가 서로 다른 프로세스의 작업이 끝나기만 기다리며 작업을 더 이상 진행하지 못하는 상태를 교착 상태(Dead Lock)라 부른다.
교착 상태가 일어나기 위해서는 아래 네 가지 조건이 모두 충족해야 한다. (모두 충족해도 발생하지 않을 수 있음)
교착 상태가 지속되어 여러 프로세스가 부족한 자원을 점유하기 위해 경쟁을 하게 되면서 특정 프로세스의 작업이 끊임없이 지연되는 문제를 아사(기아) 현상이라 부른다.
(스케줄링 과정에서 높은 우선순위를 가지고 있는 프로세스 때문에 계속된 양보 문제 또한 아사(기아) 현상이다.)
식사하는 방법
1. 식사하기 위해서는 두 개의 포크가 필요하다.
2. 한순간에 하나의 포크만 잡을 수 있다. (한 번에 두 개의 포크를 동시에 잡을 수 없다.)
3. 왼쪽에 있는 포크를 잡은 뒤 오른쪽에 있는 포크를 잡아야 식사가 가능하다.
식사하는 철학자 교착 상태
1. 철학자들은 서로 포크를 공유할 수 없음 (Mutual exclusion)
2. 철학자는 다른 철학자의 포크를 뺏을 수 없음 (No Preemption)
3. 모든 철학자는 왼쪽에 포크를 잡고 오른쪽 포크를 기다리고 있음 (Hold and wait)
4. 원형을 이루며 오른쪽 포크를 원하고 있음 (Circular wait)
교착 상태 예방(Dead Lock Prevention)은 교착상태의 네 가지 필요 조건 중 한 가지 이상을 만족시키지 않게 하는 방법입니다.
교착 상태 회피(Dead Lock Avoidance)는 시스템의 상태를 계속 감시하는 방법이다.
자원을 요구하는 프로세스가 Dead Lock 상태가 될 가능성이 있는지를 확인하여 될 가능성이 있는 경우 자원의 할당을 보류한다.
또한 시스템은 항상 Safe State(안전 상태)를 유지해야 하며, 안전 할당(Safe allocation)을 해야 한다.
은행원 알고리즘(Banker's Algorithm)은 사람을 프로세스로, 돈을 자원으로 비교하여 교착 상태 회피를 쉽게 설명하는 이론이다.
프로세스에 자원을 할당한 뒤 작업이 종료되어 자원을 다시 회수 했을 때 Safe State를 유지하면 다른 프로세스에도 자원을 할당한다. 그렇지 않다면 Unsafe State 상태가 되어 교착 상태에 빠지게 된다.
시스템에서 교착상태가 발생했는지를 주기적으로 검사하고, 교착 상태 발생 시 복구하는 방법이다. (교착 상태가 발생하는 것을 허용)
교착 상태를 탐지하는 방법으로는 자원 할당 그래프를 활용한 탐지 알고리즘이 있다. 탐지 알고리즘을 사용하여 주기적으로 검사를 한다.
교착 상태를 복구하는 방법으로는 프로세스 종료와 자원 선점이 있다.
교착 상태는 네 가지 필요 조건을 모두 만족해도 발생할 가능성이 작다. 현실에서 교착 상태는 매우 드물게 나타나는 현상이기 때문에 교착 상태를 그냥 무시하는 것도 하나의 방법이다. 만약 교착 상태가 발생하더라도 재부팅 하여 다시 시작한다.