1. 데드락 (Deadlock)
프로세스나 쓰레드가 사용하고자 하는 컴퓨터 자원을 다른 프로세스가 갖고 종료 조건이 서로 맞물려 있는 상태로 무한정 대기하는 상황을 데드락(Deadlock)이라고 한다. 프로그램 설계 시 데드락이 발생하지 않도록 유의하여야 한다. 각자 설계한 프로그램이 단독적으로 실행될 때는 문제가 없을 수 있지만, 여러 개의 프로그램이 함께 실행되는 과정에서 발생할 수도 있기 때문에 문제점을 발견하거나 예방하기 쉽지 않다.
컴퓨터 자원의 분류
재사용 가능한 자원(Reusable Resources)과 소비성 자원 (Comsumable Resources)으로 나뉘어진다. CPU나 입출력 장치, 메모리 등 대부분의 하드웨어 자원은 사용 후 소멸되지 않으므로 재사용 가능한 자원에 속한다. 이러한 자원에 대해 프로세스들이 경합할 때 데드락이 발생할 가능성이 있는 것이다.
물론 소비성 자원이라고 데드락이 아예 발생하지 않는 것은 아니다. 프로세스 실행이 끝날 때 다른 프로세스에게 전달하는 '메시지'라는 소비성 자원이 존재하는데, 양측의 프로세스에서 이를 서로 수신하기만을 무한정 대기하는 상황이 생기기도 한다.
Resource Allocation Graphs
프로세스와 컴퓨팅 자원 간의 관계를 도식화해놓은 상태도를 의미한다. 자원을 전달하는 주체를 화살표 방향으로 표현한다. 컴퓨팅 자원 영역에서 사용가능한 자원의 개수를 점으로 표현하며, Ra라고 칭한다.
왼쪽 그래프는 데드락이 걸려져 있는 상태도의 모습이다. 상대편이 원하는 자원을 갖고 있는 상태로, 상대 프로세스가 보유 중인 자원에 접근하길 원하게 되어 데드락이 발생하게 된다.
데드락의 발생 조건
- Mutual Exclusion : 자원을 할당받은 프로세스가 그 자원을 독점적으로 사용한다는 조건으로, 데드락을 발생시키는 요인이 될 수 있다.
- Hold-and-wait : 프로세스가 자원을 먼저 사용하고 있다면, 처리가 끝날 때까지 대기해야 되는 성질을 말한다.
- No Preemption : 강제로 프로세스를 뺏어오는 행위 (Preemption)을 방지하는 것이다. 앞선 조건들과의 인과성을 엿볼 수 있다.
- Circular wait : 프로세스들이 대기 중인 상태로 꼬리에 꼬리를 물어 순환 형태를 그리는 상황을 말한다.
위와 같은 조건들이 있어 깔끔한 프로세싱이 가능하지만, 동시에 데드락을 유발시키는 원인이 될 수 있다는 것을 확인하였다.
2. 데드락 대처와 예방법
데드락 현상에 대처하는 법
- 운영체제 차원에서의 사전 예방
- 운영체제 차원에서의 발생 시 감지 및 처리
- 관리자 차원에서의 문제 해결
실제로 운영체제 내부에 데드락에 대한 마땅한 기능이 없는 실정이다.
데드락 발생을 예방하는 법
- 앞서 언급한 데드락 발생 조건을 만족하지 못하게 함 : 가장 합리적으로 해결할 수 있는 방법이 Circular wait 조건을 만족시키지 못하게 하는 것이다. 한 프로세스에만 제약을 주어 데드락을 예방할 수 있기 때문에 다른 조건을 깨는 것보다 합리적이라고 할 수 있다.
- Bankers Algorithm : 해당 알고리즘을 실행시켜 Safe를 리턴받은 경우에만 자원을 할당
데드락을 처리하는 법
데드락에 걸린 일부 프로세스를 종료 (Abort). 보통 종료시킬 프로세스에 기준을 두는데, 실행 시간(CPU를 소비한 시간)이 적은 프로세스 순으로 종료시켜 데드락 문제를 해결한다.