개발계발
교착 상태 본문
저번 포스팅에서 동기화 기법에 대해 알아봤는데, 이 때 잠금을 사용하면 작업이 더 이상 진행되지 않는 교착 상태에 빠지는 경우가 있다.
이번 포스팅에서는 이 교착상태의 원인과 해결방법에 대해 알아보고자 한다.
교착상태란?
2개 이상의 작업이 동시에 이루어질 때, 서로의 작업이 끝나기만 기다리며 작업이 더 이상 진행되지 않는 상태
교착상태 발생조건
교착상태가 발생하기 위해서는 상호 배제, 점유와 대기, 비선점, 원형 대기 4가지 조건이 모두 만족돼야한다.
상호 배제
- 한 자원을 한 번에 하나의 프로세스만 이용 가능
점유와 대기
- 자원을 할당받은 상태에서 다른 자원을 할당받기를 기다리는 상태
비선점
- 다른 프로세스가 사용 중인 자원을 강제로 뺏을 수 없음
원형 대기
- 프로세스들이 원의 형태로 자원을 대기하는 형태
교착상태 해결 방법
교착상태를 해결하기 위한 방법은 예방, 회피, 검출 후 회복 크게 3가지 방법이 있다.
예방
위에서 작성한 4가지 조건 중 최소 하나를 충족하지 못하게 하는 방법
- 상호 배제 제거
모든 자원을 공유 가능하게 만든다는 이론이지만, 현실적으로 무리가 있음
- 점유와 대기 제거
특정 프로세스에 자원을 모두 할당하거나, 아예 할당하지 않는 방식으로 배분하는 방식이지만 자원 활용률이 낮아진다.
- 비선점 제거
다른 프로세스가 한 프로세스가 이용중인 자원을 뺏을 수 있게 함 -> 위험성이 있다.
- 원형 대기 제거
자원에 순서를 매겨, 순서대로 자원을 할당-> 수많은 자원에 번호를 붙이는 일이 어렵고, 순서를 부여하는 것도 어려움
즉, 예방은 교착상태를 방지할 수는 있지만 여러 부작용이 따른다.
회피
교착 상태가 발생하지 않을 정도로만 자원을 조심해서 할당하는 것(자원이 충분한 상황에서 프로세스들이 한두 개의 적은 자원만을 요구한다면 교착 상태는 발생하지 않음 <-> 자원이 한정된 상황에서 프로세스들이 한 번에 많은 자원을 요구하면 교착 상태가 발생할 확률이 높아짐)
검출 후 회복
위에서 언급한 2가지 방법은 교착 상태 발생을 막기 위한 방법이고, 이 방식은 교착 상태 발생 이후 사후 조치하는 방법으로 선점을 통한 회복과 프로세스 강제 종료를 통한 회복 2가지 방법이 있다.
- 선점을 통한 회복
교착 상태가 발생 되면 해결될 때까지 한 프로세스씩 자원을 몰아주는 방식
- 프로세스 강제 종료를 통한 회복
가장 단순하면서 확실한 방법으로 교착상태에 놓인 프로세스를 모두 종료하거나 교착 상태가 없어질 때까지 한 프로세스씩 종료하는 방법이다.