멀티스레딩의 문제점에서 나오듯, 동일 자원(공유 변수 등)을 동시에 접근하는 작업을 실행하는 코드 영역을 Critical Section이라 칭한다.
데드락이란 두 개 이상의 프로세스가 다른 프로세스가 점유하고 있는 자원을 얻기 위해 기다릴 때 무한 대기에 빠지는 현상을 일컫는다.
보통 멀티 프로그래밍 환경에서 한정된 자원을 사용하려고 경쟁할 때 발생한다. 어떤 프로세스가 자원을 요청 했을 때 그 자원을 사용할 수 없는 상황이 발생할 수 있는데 그 때는 프로세스가 대기 상태로 들어가게 된다. 이렇게 대기 상태로 들어간 프로세스들이 실행 상태로 변경 될 수 없을 때 이러한 상황을 교착 상태라고 한다.
상호 배제(Mutual exclusion)
점유 대기(Hold and wait)
비선점(No preemption)
순환 대기
4가지 조건 모두 만족해야함 교착상태가 발생함.
예방 / 회피 / 탐지 및 회복 이 존재한다.
위에서 살펴본 데드락 발생조건 4가지 중 하나라도 발생하지 않게 하는 것.
자원의 낭비가 발생한다는 단점이 존재함.
상호 배제 부정
점유 대기 부정
비선점 부정
순환 대기 부정
데드락 예방법은 시스템 처리량과 효율성을 떨어트리는 단점이 발생할 수 있다.
교착 상태가 발생하면 피해가는 방법.
E,J,Dijkstra가 제안한 방법으로, 은행에서 모든 고객의 요구가 충족되도록 현금을 할당하는 데서 유래한 기법이다.
프로세스가 자원을 요구할 때 시스템은 자원을 할당한 후에도 안정 상태로 남아있게 되는지를 사전에 검사하여 교착 상태를 회피한다.
시스템의 프로세스들이 데드락을 발생시키지 않으면서 자원을 모두에게 할당시켜 줄 수 있는 상태를 Safe sate = 안정상태 라고 말한다.
그리고 특정 순서로 작업할 때 데드락이 발생하지 않는 순서가 있다면 그것을 Safe sequence = 안전 순서라고 부른다.
안정 상태에 있으면 자원을 할당하고, 그렇지 않으면 다른 프로세스들이 자원을 해지할 때까지 대기함
점선으로 표시된 간선(Claim edge)은 프로세스가 자원을 미래에 요청할 수 있음을 의미.
그리고 해당 자원을 요청하는 경우 실선(Request edge)으로 바뀌게 된다.
자원을 할당받으면 방향이 반대인 간선(Assignment edge)이 된다.
만약 자원을 다 쓰고 반납하게 되면 다시 Claim edge로 바뀐다.
예방이나 회피법을 사용하지 않을 때 사용
자원할당 그래프를 통해서 사이클이 생겼는지를 확인하거나, 총 요청 자원의 수가 남은 자원의 수보다 적은 프로세스가 존재하지 않는다는 것을 이용하여 확인할 수 있다.
데드락을 탐지 기법을 통해 발견했다면, 순환 대기에서 벗어나 데드락으로부터 회복하기 위한 방법을 사용합니다.
뮤텍스
여러 스레드를 사용하는 환경에서 자원에 대한 접근을 강제하기 위한 동기화 매커니즘
Boolean타입의 Lock변수를 사용하며, Lock을 건 스레드만이 해제할 수 있다.
- Sleep-Waiting 방식
대기큐를 생성하여, 임계영역에 쓰레드가 이미 존재할 때 다른 스레드가 공유자원을 사용하려고 한다면 해당 쓰레드를 blocking하고 대기큐에 sleep시킨다.
SpinLock방식: 기다리고 있지만 끊임없이 물어보는 방식(busy-waiting)
Mutex-Nonblocking 모델로 볼 수 있다.
- 컨텍스트 스위칭(대기큐에 이동) 시간보다 예상 진입시간이 더 짧은가?
- 멀티코어 프로세스인가?
위 두 사실에 해당한다면 Sleep-Waiting 방식보다 SpinLock사용이 더 좋을 수도 있다.
세마포어
멀티프로그래밍 환경에서 다수의 프로세스나 스레드의 여러 공유자원에 대한 접근을 제한하는 방법
- 세마포어 변수(0이상의 정수형 변수)를 통해 wait, signal을 관리한다.
- 세마포어는 뮤텍스가 될 수 있지만, 뮤텍스는 세마포어가 될 수 없다.