우선순위 역전: 낮은 태스크가 높은 태스크를 막을 때
낮은 태스크가 잡은 뮤텍스 때문에 높은 태스크가 멈추고, 그 사이 중간 태스크가 CPU를 차지합니다. 화성 탐사선도 겪은 문제.
시나리오
- L(낮음)이 SPI 뮤텍스를 잡음
- H(높음)가 깨어나 같은 뮤텍스를 기다리며 Blocked
- M(중간)이 깨어남. L보다 높으니 L을 선점
- M이 오래 실행되는 동안 L은 뮤텍스를 못 돌려주고, H는 M 때문에 무기한 기다림
H는 M과 아무 관계가 없는데도 M에게 막힙니다. 1997년 화성 패스파인더가 이 문제로 반복 리셋되었습니다.
해결: 우선순위 상속
H가 L이 가진 뮤텍스를 기다리는 동안, L의 우선순위를 H만큼 잠시 올립니다. 그러면 M이 L을 선점하지 못하고, L은 빨리 일을 끝내 뮤텍스를 돌려줍니다. FreeRTOS의 뮤텍스(xSemaphoreCreateMutex)에는 이 기능이 들어 있지만, 이진 세마포어에는 없습니다. 자원 보호에는 반드시 뮤텍스를 씁니다.
설계로 피하기
- 뮤텍스를 잡고 있는 구간을 짧게
- 공유 자원을 담당 태스크 하나에 맡기고 나머지는 큐로 요청
- 우선순위 천장 프로토콜: 자원을 잡으면 그 자원을 쓰는 가장 높은 태스크 우선순위로 즉시 올림