2개 이상의 프로세스가 다른 프로세스의 작업이 끝날때까지 기다리며 작업을 진행하지 못하는 상태이다.
1) 시스템자원
: 다른 프로세스와 공유 할 수 없는 자원을 사용할때 발생한다.
ex) A 프로세스는 프린터를 할당받고 모니터를 기다리고 B프로세스는 모니터를 할당받고 프린터를 기다리면 교착상태 발생
2) 공유변수
: 공유 변수를 사용 할때 무한대기를 막지못할 경우 교착상태가 발생한다.
3) 응용프로그램
: DB에서 저장된 데이터를 사용할때 일관성을 유지하기위해 lock을 사용하는데 이때 교착상태가 발생 할 수 있다.
위 그림을 보면 각각의 프로세스가 왼쪽의 자원을 할당받고 오른쪽의 자원을 기다리고 있다.
교착상태가 발생하려면 4가지 조건을 모두 충족해야한다.
1) 상호 배제
: 한 프로세스가 사용하는 자원은 다른 프로세스와 공유할 수 없는 배타적인 자원이어야한다.
배타적인 자원은 임계구역으로 보호되어서 다른 프로세스가 동시에 사용할 수 없으므로 교착상태가 발생한다.
2) 비선점
: 한 프로세스가 사용중인 자원은 중간에 다른 프로세스가 빼앗을수 없는 비선점 자원이어야한다.
자원을 빼앗을수 없으면 공유할 수 없으므로 교착상태 발생한다.
3) 점유와 대기
: 프로세스가 어떤 자원을 할당받은 상태에서 다른 자원을 기다리는 상태라면 교착상태가 발생한다.
4) 원형 대기
: 점유와 대기를 하는 프로세스간의 관계가 원을 이루어야한다.
프로세스가 특정 자원에 대해서 점유하고 대기를 한다고 모두 교착상태가 발생하는것은 아니다.
프로세스가 서로 방해하는 방향이 원 모양이면 서로 양보하지 않기 때문에 교착상태가 발생한다.
1) 교착상태 예방
: 교착상태가 발생하는 4가지 조건이 발생하지않도록 무력화하는것 (실효성이 적어서 사용을 잘 안한다)
상호 배제 예방
: 독점적으로 사용할 수 있는 자원을 모두 없애는 방법. 모든 자원을 공유 할 수 있다면 교착상태가 발생하지 않는다.
비선점 예방
: 모든 자원을 빼앗을수 있도록 만든다.
점유와 대기 예방
: 프로세스가 자원을 점유한 상태에서 다른 자원을 기다리지 못하도록 모든 프로세스에게 자원을 할당하거나 아예 할당하지 않는 방식. (일괄작업 방식이라서 자원 활용성이 떨어진다.)
원형 대기 예방
: 자원을 한 방향으로만 사용하도록 설정. 즉 시스템 자원에 숫자를 부여한다.
2) 교착상태 회피
: 자원 할당량을 조절해서 교착상태를 막는다. 즉 교착상태가 발생할 가능성이 보이면 자원할당을 중단하고 대기하는것. (프로세스가 모든 자원을 미리 선언해야하고 전체 자원수를 고정시켜야하므로 자원낭비가 커서 실효성이 적다)
자원의 총개수와 현재 할당된 자원의 개수를 기준으로 시스템을 안정상태(safe state)
와 불안정상태(unsafe state)
로 나눈다.
3) 교착상태 검출
: OS가 프로세스의 자원 할당을 모니터링해서 교착상태가 발생하는지 계속 확인하는것. (가장 많이 사용하는 방법)
타임아웃을 이용한 검출
: 일정시간동안 작업이 진행되지 않은 프로세스를 교착상태가 발생한것으로 간주해서 처리하는 방법. ( 단점 : 엉뚱한 프로세스가 강제종료될 수 있고 모든 시스템에 적용 할 수 없다 )
자원 할당 그래프를 이용한 검출
: 자원할당 그래프를 보면 시스템 내의 어떤 프로세스가 어떤 자원을 사용하고있는지 알 수 있다.
4) 교착상태 회복
: 교착상태를 유발한 프로세스를 강제로 종료하는 2가지
1. 모든 프로세스를 동시에 종료하는 방법.
2. 교착상태를 일으킨 프로세스들중 우선순위가 낮은 프로세스부터 순서대로 종료하는 방법.
출처
- 쉽게 배우는 운영체재 (책)