혹시 엄청 좁은 골목길에 차 🚗두 대🚙가 양쪽에서 들어왔을 때를 겪어본 적이 있나?
심지어 그 차들 뒤에 또 다른 차들이🚍🚖 빵빵거리며 앞으로 가라고 온다면?
이 상황은 서로 현재 위치한 길을 점유함과 동시에 다른 길을 사용할 수 없어 현재 길에서도 벗어나지 못하는 상황이다.
이러한 상황. 상태를 교착상태라고 한다.
교착상태🔓
(Dead Lock)
상호 배제에 의해 나타나는 문제점으로, 둘 이상의 프로세스들이 자원을 점유한 상태에서 서로 다른 프로세스가 점유하고 있는 자원을 요구하며 무한정 기다리는 현상.
그렇다면 아까 차를 비유로 한 상황은 자동차들이 프로세스이고, 길이 자원인 것이다.
교착상태 발생의 필요 충분 조건
상호배제
한번에 한 개의 프로세스만이 공유 자원을 사용할 수 있어야 한다.
점유와 대기
최소한 하나의 자원을 점유하고 있으면서 다른 프로세스에 할당되어 사용되고 있는 자원을 추가로 점유하기 위해 대기하는 프로세스가 있어야 한다.
비선점
다른 프로세스에 할당된 자원은 사용이 끝날 때까지 강제로 빼앗을 수 없어야한다.
환형 대기
환형. 말 그대로 원형. 공유자원과 공유자원을 사용하기 위해 대기하는 프로세스들은 원형으로 구성되어 있어 자신에게 할당된 자원을 점유하면서 앞이나 뒤에 있는 프로세스의 자원만을 요구해야한다.
이 네가지 조건 중 하나라도 충족되지 않으면 교착상태가 발생하지 않는다.
예방기법?💉
교착상태 발생은 네 가지 조건 중 하나라도 충족이 안되면 발생하지 않으므로, 네 조건 중 어느 하나라도 제거함으로써 예방할 수 있다.
상호 배제 부정
한번에 여러 개의 프로세스가 공유 자원을 사용할 수 있게 한다.
점유와 대기 부정
프로세스가 실행되기 전 필요한 모든 자원을 할당하여 프로세스 대기를 없애거나 자원이 점유되지 않은 상태에서만 자원을 요구하도록 한다.
비선점 부정
자원을 점유하고 있는 프로세스가 다른 자원을 요구할 때 점유하고 있는 자원을 반납하고, 요구한 자원을 사용하기 위해 기다리게 한다.
환형 대기 부정
자원을 '선형' 순서로 분류하여 고유 번호를 할당하고, 각 프로세스는 현재 점유한 자원의 고유 번호보다 앞이나 뒤 어느 한쪽 방향으로만 자원을 요구하도록 한다.
하지만 이 방법들은 자원 낭비가 심한 기법이다.😅
회피 기법?🏃♀️💨
이 기법은 교착상태가 발생하면 적절히 피해나가는 방법이다. 대표적으로 은행원 알고리즘이 사용된다. 은행원 알고리즘은 다익스트라가 제안한 기법으로, 은행에서 모든 고객의 요구가 충족되도록 현금을 할당하는데서 유래한 기법이다.
각 프로세스에게 자원을 할당하여 교착상태가 발생하지 않으며 모든 프로세스가 완료될 수 있는 상태를 안전상태, 교착상태가 발생할 수 있는 상태를 불안전 상태라고 한다.
그렇기 때문에 자원의 양과 사용자(프로세스) 수가 일정하게 해 최대한 안전상태로 가도록 한다.
은행원 알고리즘은 프로세스의 모든 요구를 유한한 시간안에 할당하는 것을 보장한다.
회복기법😯
그럼 만약에 예방으로도 안되고, 진짜 교착상태가 일어나면 어떻게 해결하는 지가 가장 궁금할 것이다. 그럴 땐 회복 기법을 사용한다. 교착상태를 일으킨 프로세스를 종료하거나 교착상태의 프로세스에 할당된 자원을 선점하여 프로세스나 자원을 회복하는 것을 의미한다.
프로세스 종료. 아까 자동차 예시로 보면 차를 그냥 부셔버리는 것. 소멸 시켜버리는 것으로 이해할 수 있다.💥 교착상태에 있는 모든 프로세스를 종료하는 방법과 교착상태에 있는 프로세스들을 하나씩 종료해가며 교착상태를 해결하는 방법이 있다. (차 모두 부셔버리기, 차 하나씩 부셔가며 해결해나가기)
자원 회복. 아까 자동차 예시로 보면 뒤에 있는 차들을 뒤로 빠지게 하는 것이라고 이해할 수 있다. 교착상태의 프로세스가 점유하고 있는 자원을 선점하여 다른 프로세스에게 할당하며, 해당 프로세스를 일시 정지시키는 방법이다. 우선순위가 낮은 프로세스, 수행된 정도가 적은 프로세스, 사용되는 자원이 적은 프로세스 등을 위주로 해당 프로세스의 자원을 선점한다.