Priority Inversion & Priority Inheritance

Priority Inversion

realtime 스케줄러는 우선 순위에 따라 태스크가 먼저 수행되어야 하는데 lock 리소스를 획득한 후 우선 순위 원칙에 위배

  • 문제점
    • cpu#1의 A 스레드는 cpu#0 C의 작업이 끝날때 까지 lock을 얻지 못해 기다리는데 C 작업 중 B에 의해 선점당하면서 A는 더 오랜 시간을 기다려야 한다.
    • A 스레드가 B 스레드보다 우선 순위가 높은 상황인데도 위와 같은 상황에서 우선 순위가 더 낮은 B 스레드가 먼저 처리되는 불합리한 상황이 벌어진다.
  • 해결 방법
    • 이러한 점을 보강하기 위하여 Priority Inheritance Protocol이 개발되었고, 리눅스 커널은 priority가 중요한 RT 태스크들 사이에서 사용된다.

 

다음 그림과 같이 A의 lock 획득이 느려지는 상황을 보여준다.

 

Priority Inheritance

  • Priority Inversion 상황과 다르게 A 스레드가 lock을 얻다 실패하는 경우 현재 해당 리소스 lock을 얻어 동작하는 스레드 C의 우선 순위를 A 스레드와 같이 높은 우선 순위로 상속시키면서 그 보다 낮은 우선 순위의 B 스레드에게 선점되지 않게 막는다. 결국 A 스레드는 보다 빠르게 공유된 S 자원의 할당을 받아 처리할 수 있다.
  • 리눅스 커널은 RT 태스크들 사이에서 사용되며 RT Mutex API를 통해 구현되었다.

 

다음 그림은 C 스레드가 lock을 잡고 있는 동안 priority가 A 스레드 처럼 잠시 높아져서 lock을 해제할 때까지 preempt 되지 않고 빠르게 처리하여, 결국 A 스레드 역시 빠르게 처리되는 것을 보여준다.

 

참고

댓글 남기기