모든 이야기

우선순위 역전: 중요한 작업이 덜 중요한 작업 뒤에 갇히는 과정

우선순위가 높은 작업은 준비 상태에서 낮은 작업보다 먼저 실행될 수 있다. 그러나 필요한 잠금을 낮은 우선순위 작업이 이미 가지고 있다면 높은 작업은 기다려야 한다. 여기에 중간 우선순위 작업이 낮은 작업의 실행을 계속 막으면 높은 작업의 지연이 크게 늘어난다. 이런 의존 관계가 우선순위 의도를 뒤집는 현상을 우선순위 역전이라고 한다.

높은 작업 H가 낮은 잠금 소유자 L을 기다리는 동안 중간 작업 M이 끼어들고 상속으로 L을 먼저 끝내는 그림

우선순위 상속은 잠금 소유자의 진행을 도와 높은 작업의 대기를 줄인다.

세 작업의 시간선을 보면

낮은 우선순위 L이 공유 자료 잠금을 얻고 짧은 갱신을 시작한다. 높은 우선순위 H가 등장해 같은 잠금을 요청하지만 얻지 못해 대기한다. 이제 중간 우선순위 M이 준비되면, H는 실행할 수 없으므로 스케줄러는 L보다 M을 먼저 실행한다. L이 잠금을 놓지 못한 시간 동안 H도 계속 기다린다.

핵심은 M이 그 잠금을 사용하지 않아도 H를 지연시킬 수 있다는 점이다. H가 직접 기다리는 대상은 L이지만, L을 밀어내는 M의 실행 시간이 H의 지연에 더해진다. 잠금 보유자의 남은 임계 구역이 짧다는 사실만으로 높은 작업의 최대 대기 시간이 짧아지는 것은 아니다. M이 계속 나타나는 모델에서는 지연 상한을 세우기 어려워질 수 있다.

우선순위를 잠시 빌려준다

우선순위 상속은 H가 기다리는 동안 잠금 소유자 L의 우선순위를 높이는 방식이다. L이 필요한 갱신을 마치고 잠금을 해제하게 하며, 그 뒤 원래 우선순위로 돌아간다. Linux RT-mutex 문서는 더 높은 대기자의 우선순위를 소유자가 상속하고, 소유자가 다른 잠금에서 기다리면 상속을 전파하는 원리를 설명한다.

상속을 적용한 예제에서는 H가 잠금을 기다리는 순간 L이 높은 우선순위로 실행될 수 있다. M은 L을 밀어내지 못하고, L이 잠금을 놓으면 H가 진행한다. 이렇게 H의 대기를 필요한 자원 소유자의 작업과 더 가깝게 묶는다. 하지만 L이 잠금을 가지고 긴 입출력을 기다리면 우선순위를 올리는 것만으로 장치 완료를 앞당길 수는 없다.

상속 외의 방법과 비용

우선순위 상한 프로토콜은 자원이 관련된 작업들의 우선순위를 고려해 상한을 부여하고 획득 시 정해진 규칙을 적용하는 접근이다. 정확한 규칙은 프로토콜 변형에 따라 다르지만 대기 상한과 교착 방지를 분석하기 위한 구조를 제공한다. 모든 잠금을 임의로 최고 우선순위로 바꾼다고 같은 성질을 얻는 것은 아니다.

우선순위 상속 자체도 대기자 관리와 우선순위 갱신 비용을 만든다. 잠금 여러 개와 중첩 대기에서는 전파와 해제를 정확히 처리해야 한다. 일반적인 뮤텍스가 언제나 이 기능을 제공한다고 가정하면 안 되며, 운영체제와 라이브러리의 지원 및 설정을 확인해야 한다. 작업 우선순위만 올려 놓는 것으로 잠금 의존 관계가 사라지지는 않는다.

이 개념은 실시간 제어, 오디오 처리, 입력 반응처럼 평균 속도보다 최대 지연이 중요한 상황에서 특히 유용하다. 먼저 잠금 보유 시간을 짧게 하고, 임계 구역에서 오래 기다리는 작업을 줄이며, 필요한 프로토콜을 적용한다. 우선순위 역전을 이해하면 스케줄링 정책과 공유 자원 설계를 별도로 평가해서는 안 된다는 사실이 분명해진다.

참고 자료

우선순위 역전: 중요한 작업이 덜 중요한 작업 뒤에 갇히는 과정 · ariser