교착상태는 한정된 자원을 여러곳에서 사용하려 할 때 발생하는 문제입니다. 조금 더 구체적으로 표현하면 여러 프로세스가 하나의 자원을 두고 경합상태를 벌이는 상황이죠.

Untitled

위 사진을 봅시다.

프로세스1과 프로세스2는 모두 자원1,2를 필요로합니다. 하지만 리소스1은 프로세스1이 점유하고 있으며, 리소스2는 프로세스2가 점유하고 있죠.

현재 서로 원하는 자원이 상대에게 할당되어, 두 프로세스는 무한 대기상태에 빠지게 됩니다. 이런 상황을 데드락이라 합니다.

교착상태의 발생 조건

데드락은 다음 4가지 조건이 동시 성립할 때 발생합니다. 이중 하나라도 성립하지 않는다면 교착상태를 해결할 수 있죠.

  1. 상호 배제
  2. 점유대기
  3. 비선점
  4. 순환대기

교착상태 예방 방법

교착상태 발생 조건 중 하나를 제거함으로써, 교착상태를 예방할 수 있습니다.

  1. 상호 배제 부정 : 여러 프로세스가 공유 자원을 사용하도록 합니다.
  2. 점유 대기 부정 : 프로세스가 실행되기 전 필요한 모든 자원을 할당합니다.
  3. 비선점 부정 : 자원 점유중인 프로세스가 대기 자원을 요구할 때, 점유중인 자원을 반납하고, 요구한 자원을 사용하기 위해 기다리게 합니다. 즉, 선점을 허용합니다.
  4. 순환 대기 부정 : 자원에 고유 번호를 할당하고, 번호 순서대로 자원을 요구토록 합니다.

교착상태 회피

교착상태가 발생하면 피해나가는 방법으로 뱅커스알고리즘이라고도 부릅니다. 은행에서 모든 고객의 요구가 충족되도록 현금을 할당하는데서 유래된 기법입니다.

프로세스가 자원을 요구할 때, 시스템은 자원을 할당한 후에도 안정 상태로 남아있게 되는지 검사하게됩니다. 즉, 프로세스가 자원을 요구할때, 안정상태에 있으면 자원을 할당하고 그렇지 않으면 다른 프로세스들이 자원을 해제할 때 까지 대기합니다.