교착상태가 발생되지 않도록 사전에 예방하는 방법이다.
교착상태 발생 조건 네 가지 중 적어도 하나가 성립하지 않게 만드는 방법이다.
순환 대기를 막는 방법이 네 가지 중 가장 효율적이다. 자원에 순서를 부여하고, 각 프로세스가 오름차순으로 자원을 요청하도록 구현한다.
예방 기법은 일반적으로 자원 사용 효율성이 떨어지고 비용이 많이 드는 문제점이 있다.
교착상태가 발생하는 조건인지 확인하면서 적절히 회피하는 방법이다.
Circular wait가 발생하지 않도록 자원 할당 상태를 검사하면서, 시스템이 안전 상태(Safe state)인지 확인한다.
자원 할당 그래프 알고리즘 (Resource-Allocation Graph Algorithm) : 자원 할당에 대한 그래프를 구성한 후, 그래프에 사이클이 없을 때에만 자원을 할당한다.
은행원 알고리즘 (Banker's Algorithm) : 자원 할당 그래프 알고리즘은 프로세스가 하나의 자원만 사용하는 시스템에서 사용된다. 이에 반해 은행원 알고리즘은 프로세스가 자원을 여러 개 사용하는 경우에도 사용할 수 있는 알고리즘이다.
시스템에 교착 상태가 발생했는지 확인하기 위해 시스템의 상태를 검사한다.
탐지 후, 교착 상태를 일으킨 프로세스를 종료하거나, 교착상태의 프로세스에 할당된 자원을 선점하여 교착상태를 제거한다.
교착상태 자체를 무시하고, 특별한 조치를 취하지 않는다. 교착상태의 발생 확률이 낮은 상황에서 효율적이다.
만약 교착상태가 발생한다면, 프로세스를 종료하거나 자원을 선점하여 회복한다.
UNIX, Windows 등 대부분의 운영체제가 이 방법을 사용한다.
철학자들이 죽으면 안되는 인자인 4 410 200 200을 넣었다. 철학자가 사이좋게 밥을 먹는다면 살아야겠지만 교착상태가 발생해 죽어버렸다.
철학자들이 동시에 각자의 오른쪽에 있는 포크를 집고 다른 철학자가 포크를 내려놓기만을 기다리고 있다.
그러다 밥을 먹지못한 시간이 time_to_die시간인 410ms를 초과해서 1번 철학자가 죽은 모습이다.
철학자들이 동시에 포크를 집는게 문제이므로 짝수와 홀수번째 철학자들이 각기 다른행동을 하게해줬다.
짝수번 철학자는 스레드의 시작에서 usleep(50)만큼 쉬고 시작한다.
또한 짝수번 철학자는 왼쪽 포크부터 집고, 홀수번 철학자는 오른쪽 포크부터 집게 해줬다. 그럼 항상 서로 같은 포크를 먼저 집어야하므로 둘 다 다른 포크를 집고 서로를 기다리는 상황을 피할 수 있다.
인자를 5개 이상 주었을 때 예외처리 하지 않음.
프로그램이 메모리를 해제하는 부분에서 해제한 메모리에 접근하여 segfault.(필로의 수가 많은 경우에서)
출처
https://www.joinc.co.kr/w/man/3/pthread_create
https://ko.wikipedia.org/wiki/%EA%B5%90%EC%B0%A9_%EC%83%81%ED%83%9C
https://itwiki.kr/w/%EA%B5%90%EC%B0%A9%EC%83%81%ED%83%9C
https://yoongrammer.tistory.com/67
조성호, 『쉽게 배우는 운영체제』, 한빛미디어(2018)