우선 순위 역전
Busy Waiting의 단점인 우선 순위 역전 문제란 무엇일까
운영체제에서 Busy Waiting을 공부하는 중에, 우선 순위 역전 문제가 발생한다는 것을 학습하게 되었다. 우선 순위 역전이란 무엇일까?
✏️ 우선 순위 역전
다음과 같이 프로그램 3개가 존재한다고 하자.
T1: 1순위 T2: 2순위 T3: 3순위
| T1 | T2 | T3 | | - | - | - | |block| block | running | T3 실행 Lock 변수 s를 세팅하고 사용을 함
| T1 | T2 | T3 | | - | - | - | | ready | block | running | T1의 상태가 Ready로 변경
T1이 우선순위가 높으므로 T1 먼저 실행해야 함
| T1 | T2 | T3 | | - | - | - | | running | block | ready | T1 실행 Lock 변수를 세팅하고 들어가려는데 T3가 이미 사용중
T1은 T3가 Lock 변수 사용을 끝낼 때 까지 대기해야 한다.
| T1 | T2 | T3 | | - | - | - | | ready | block | running | T3 실행
| T1 | T2 | T3 | | - | - | - | | ready | ready | running | T2의 상태가 Ready로 변경
T2가 우선순위가 높으므로 T2 먼저 실행해야 함
| T1 | T2 | T3 | | - | - | - | | ready | running | ready | T2 실행
| T1 | T2 | T3 | | - | - | - | | ready | block | ready | T2 실행 끝
| T1 | T2 | T3 | | - | - | - | | ready | block | running | T3 재실행
| T1 | T2 | T3 | | - | - | - | | ready | block | block | T3 실행 끝
| T1 | T2 | T3 | | - | - | - | | running | block | block | T1 재실행
T1 실행 끝
결과적으로 T1이 T2에 밀렸음
해결방법 - 우선순위 상속
T1은 T3가 Lock 변수 사용을 끝낼 때 까지 대기해야 한다.
이 때, 그냥 T3가 재실행 하는 것이 아니라, T1의 우선순위를 T3에게 준다. 그러면 T2가 Ready 상태가 되어도, T3는 T2 보다 우선순위가 높으므로 T3 먼저 실행한다.
T3는 종료 후 우선순위를 T1에게 반납한다.