실시간 제어기의 우선순위 역전
단일 코어 실시간 제어기에서 세 태스크가 동작한다. H는 10ms 주기로 2ms 실행되며 반드시 주기 안에 끝나야 하고, 공유 센서 값을 읽기 위해 뮤텍스 M을 0.5ms 동안 잡는다. M은 20ms 주기로 5ms 실행되며 M을 사용하지 않는다. L은 50ms 주기로 8ms 실행되며 M을 6ms 동안 잡는다. 우선순위는 H > M > L이고 선점형 스케줄링을 사용한다. t=0에 L이 M을 획득하고 실행을 시작했으며, t=1에 H가 도착해 M을 기다린다. t=2에 M이 도착해 L을 선점하고 5ms 동안 실행한다. 그 결과 H는 12ms 후에야 완료되어 10ms deadline을 놓쳤고, 이런 deadline miss가 초당 3회 관측되었다. 팀은 인터럽트를 끄는 방안과 H의 우선순위를 더 높이는 방안을 논의 중이다. 또한 L이 M을 잡은 채 파일 I/O를 수행하는 코드도 발견되었다.
1. H의 deadline miss가 발생한 원인을 priority inversion으로 설명하고, t=0~14ms 구간의 대기 시간을 계산하시오.
Read the worked answer
H는 t=1에 도착했지만 L이 잡은 M을 기다린다. 원래라면 H가 L을 선점해야 하지만, M이 L을 선점하면서 L은 M을 놓아주지 못하고 H는 계속 대기한다. 높은 우선순위 H가 중간 우선순위 M 때문에 간접적으로 지연되는 전형적인 priority inversion이다.
계산하면 L은 01ms에 1ms 실행하고, H 도착 후 12ms에 1ms 더 실행해 M을 2ms 보유한다. 27ms는 M이 실행한다. L은 711ms에 남은 4ms를 실행해 M을 해제한다. H는 11~13ms에 2ms 실행을 마친다. H의 응답 시간은 1ms에 도착해 13ms 완료이므로 12ms이고, deadline 10ms를 2ms 초과한다. L의 임계 구역 6ms와 M의 5ms가 겹치면서 blocking이 커진 것이 원인이다.
2. 인터럽트를 끄는 방안과 H의 우선순위를 더 높이는 방안을 평가하고, priority inheritance 또는 priority ceiling이 왜 필요한지 설명하시오.
Read the worked answer
인터럽트를 끄면 H의 도착 자체가 지연되고, L의 6ms 임계 구역 동안 시스템 전체의 응답성이 나빠진다. H의 우선순위를 더 높여도 L이 M을 잡은 상태에서는 H가 여전히 블록되므로 근본 해결이 아니다.
priority inheritance는 L이 M을 잡는 동안 H의 우선순위를 상속해 M이 L을 선점하지 못하게 한다. 그러면 L은 17ms 구간에 임계 구역을 끝내고 M을 해제하며, H는 79ms에 실행되어 8ms 응답으로 deadline을 만족한다. priority ceiling은 M을 잡을 수 있는 태스크의 최고 우선순위로 ceiling을 정해 불필요한 블록을 줄인다. 두 기법 모두 임계 구역을 짧게 유지한다는 전제가 필요하다.
3. L이 뮤텍스를 잡은 채 파일 I/O를 수행하는 코드를 발견했다. 이 코드가 실시간성에 미치는 영향과 수정 방향을 제시하시오.
Read the worked answer
파일 I/O는 수 ms에서 수십 ms까지 예측 불가능하게 지연될 수 있다. L이 M을 잡은 채 I/O를 기다리면 H는 그 시간 동안 블록되고, priority inheritance를 적용해도 L이 I/O 완료를 기다리는 동안 우선순위가 상속된 채 시스템이 멈출 수 있다. worst-case blocking이 6ms를 넘어 deadline 분석 자체가 무너진다.
수정은 임계 구역을 센서 값 복사만 하는 짧은 구간으로 줄이고, 파일 I/O는 뮤텍스를 해제한 뒤 수행하는 것이다. 센서 값은 로컬 버퍼나 double buffer로 복사해 lock-free에 가깝게 읽게 하고, I/O 스레드는 낮은 우선순위에서 비동기로 처리한다. 임계 구역 내에서 블로킹 I/O, 메모리 할당, 외부 통신을 금지하는 규칙과 worst-case 실행 시간 측정을 함께 도입해야 한다.