May 28, 2020
참고도서: Operating System Concepts (10/E) Abraham Silberschatz, Peter B. Galvin, Greg Gagne
흔히 데드락이라고 우리가 부르는 교착상태는 프로세스나 스레드가 서로가 서로의 자원을 얻길 원하면서 무한정하게 대기하는 상태를 가르킨다. 이전에 세마포어를 공부하면서 경험했던 것 처럼, 두 프로세스가 signal 을 절대로 실행하지 못하는 상황에서 wait 을 하고 있는 상태이다. 데드락 문제는 컴파일 레벨에서는 오류를 잡아내지 않기 때문에 무심코 넘어가는 경우가 많고, 런타임에러로 이런 문제가 발생했을 때 여러사람이 고생(?)하게 된다.
교착상태가 일어날 때는 어떤 자원을 동시에 여러 프로세스가 점유해서 사용하는 것이 아니라 한번에 하나의 프로세스만 점유해서 자원을 사용하게 된다. 교착상태가 일어나는 이유는 프로세스가 자원을 독점하고 있는 상황에서 그것을 놔주지 않고 계속 다른 프로세스를 기다리고 있기 때문이기 때문에 동시에 여러 프로세스가 자원을 점유할 수 있다면, 교착상태는 발생하지 않을 것이다.
교착상태가 일어날 때는 프로세스가 어떤 자원을 점유하고 있는 상태에서 또 다른 자원을 점유하고자 한다. 프로세스가 자원을 가지고 있는 상태에서 다른 자원을 wait 하게되기 때문에, wait 하는 동안 해당 프로세스에게 점유된 자원은 1번 조건(상호배제)에 의해 다른 자원들이 점유할 수 없게된다. 이 상황이 여러 프로세스에게 서로 일어났을 때, 교착상태가 발생한다.
식사하는 철학자 문제를 생각해보자, 모든 철학자가 왼쪽에 있는 젓가락(Hold)을 집은 상태에서 오른쪽 젓가락을 집어들려고 하면(Wait) 교착상태가 발생한다.
프로세스에 한번 점유된 자원은 프로세스가 스스로 자원을 해제할 때까지 선점되지 못한다. 다시 식사하는 철학자 문제를 생각해보자. 모든 철학자들이 왼손에 젓가락을 들고 교착상태에 빠져있을 때, 선점(Preemption)이 가능하다면, 그냥 강제로 철학자 한명의 젓가락을 내려놓게 하고 다른 철학자에게 주면 교착상태는 바로 해결된다. 따라서 교착상태가 발생하기 위해서는 자원의 선점이 일어나지 않는다.
교착상태는 프로세스가 서로에게 자원을 요구할 때 발생한다. 다수의 프로세스가 교착상태에 빠질때는 프로세스들의 자원 요구관계에 사이클이 생긴다. 식사하는 철학자 문제의 해결안으로 제시된 방법 중 하나인 짝수번째 철학자와 홀수번째 철학자가 서로 다른 쪽 젓가락을 들게하는 것인데, 환형 대기를 깨뜨려서 교착상태를 방지하는 접근인 것이다.