-
Deadlock과 Starvation
- 데드락(Deadlock, 교착상태)
- 둘 이상의 쓰레드가 lock 획득을 기다리는데, 이 lock을 잡고있는 쓰레드도 똑같이 다른 lock을 기다리며 서로 블록상태에 놓이는 것을 의미한다. 즉 무한 대기상태에 빠지는 것을 교착상태라고 한다.
- 교착 상태 발생의 필요 충분 조건
- 상호배제 - 한번에 한개의 프로세스만 공유자원 사용
- 점유와 대기 - 최소 하나 자원을 점유하고 다른 프로세스에 할당되어 사용되는 자원을 추가로 점유하기 위해 대기하는 프로세스가 존재
- 비선점 - 다른 프로세스에 할당된 자원은 사용이 끝나기 전까지 뺏을 수 없음
- 환형 대기 - 공유자원과 사용하기 위해 대기하는 프로세스가 원형으로 구성되어 대기해야함
- 예방 기법
- 회피 기법
- 완벽한 예방은 불가능하기 때문에, 교착상태가 발생했을 때, 주로 은행원 알고리즘을 사용한다.
- 다익스트라가 제안한 기법으로, 은행에서 모든 고객의 요구가 충족되도록 현금을 할당하는데서 유래한 기법
- 각 프로세스에 자원을 할당해서 교착상태가 발생하지 않고, 모든 프로세스가 완료될 수 있는 상태를 안전상태, 교착상태가 발생할 수 있는 상태를 불안전 상태라고 한다.
- 이 알고리즘을 적용하기 위해서는 자원의 양과 프로세스 수가 일정해야한다.
- 프로세스의 모든 요구를 유한한 시간안에 할당하는 것을 보장
- 발견 기법
- 교착상태가 발생했는지 점검하여 프로세스와 자원을 발견하는 것
- 교착상태 발견 알고리즘과 자원 할당 그래프 등을 사용
- 회복 기법
- 교착상태를 일으킨 프로세스를 종료하거나 할당된 자원을 선점하여 회복하는 것
- 기근(Starvation)
- 선점하고 있는 스레드가 우선순위가 높아서 계속해서 독점하거나 무한 대기중인 상태가 일어나서, 다른 스레드가 자원에 접근하지 못하는 것을 기근(Starvation)현상이라고 한다. 주로 우선순위 알고리즘의 단점으로 기근현상이 나타난다.
- 100% 공정성을 구현하는 것은 불가능하지만, 공정성을 높이기 위해 동기화 키워드(Synchronized)나 Lock 객체를 이용할 수 있다. + Mutex나 Semaphore 기법(객체)으로 해결 가능
- Aging 기법으로 해결
- 앞선 스레드가 lock을 획득하면, 뒤에 줄서고있는 스레드들의 weight를 +1씩 증가시키는 기법 (기다린 시간에 따라 우선순위를 높게 부여)