데드락(교착상태)
: 여러 프로세스가 서로 다른 프로세스의 작업이 끝나기를 기다리다가 아무도 작업을 진행하지 못하는 상태로 즉, 멈춰있는 상태이다.
- 공유자원 때문에 발생한다.
- 교착상태의 필요조건
- 상호배제
- 한 프로세스에게 공유자원이 할당되었다면 다른 프로세스는 사용하지 않는다.
- 비선점
- 프로세스가 리소스를 사용하고 있을때 다른 프로세스가 뺏어서 사용할 수 없다.
- 점유와 대기
- 프로세스가 이미 하나의 리소스를 점유하고 있으면서 다른 리소스를 원하는 상태이어야 한다.
- 원형대기
- 점유와 대기를 하고 있는 프로세스들이 원형을 이루고 있다. 한가지라도 충족되지 않는다면 교착상태가 발생하지 않는다. 모두 충족이 되어야지 교착상태가 된다? 교착상태가 안되게 하는건 어렵기때문에 교착상태를 어떻게 해결할지에 대해 고민하기 시작한다.
- 상호배제
교착상태 해결
- 교착상태 회피 어느 정도 자원을 할당해야 교착상태가 발생하는지 파악해서 교착상태가 발생하지 않는 수준의 자원을 할당한다. “전체 자원의 수”와 “할당된 자원”의 수에 따라 “안정상태”와 “불안정상태”로 나뉘는데, “불안정상태”라고 해서 무조건 데드락에 걸리는 건 아니지만 안정상태로 유지하는게 좋다.
“시스템의 총 자원”과 “현재 프로세스에 할당된 자원의 수”를 확안해서 “현재 사용가능한 자원의 수”를 확인한다.
- 시스템의 총 자원 - 프로세스들에 할당된 자원의 수 = 사용가능한 자원
이때 프로세스들은 할당된 자원이 있지만 작업에 따라 최대로 요구할 수 있는 자원이 있는데, 현재 사용가능한 자원의 수를 잘 계산해서 프로세스들에게 할당해야한다. (은행원 알고리즘)
하지만 은행원 알고리즘은 비용이 비싸고 비효율적이다.
- 교착상태를 알아채는 법
- 가벼운 교착상태 검출
- 프로세스가 일정시간동안 작업하지 않으면 교착상태에 빠졌다고 생각
- 해결방안
- 일정시점마다 체크포인트를 만들어 작업을 저장하고 교착상태에 빠졌다고 생각되면 체크 포인트로 롤백한다.
- 무거운 교착상태 검출
- 운영체제가 프로세스가 어떤 자원을 사용하는지 지켜보다가 데드락에 걸리면 해결한다.
- 해결방안
- 프로세스들이 각자 자원을 이용하고 있고, 다른 자원을 요청하고 있는 그래프가 순환구조이면 교착상태로 인지한다.
- 교착상태인 프로세스를 강제종료 시키고 체크포인트로 롤백한다.
- 특징
- 운영체제가 계속해서 자원 할당 그래프를 유지하고 검사해여함 -> 오버헤드
- 하지만 억울하게 프로세스가 종료되는 일은 없다.(가벼운 검출에서는 생길수도 있음)
- 가벼운 교착상태 검출