우선순위 상속

우선순위 역전 은 우선순위가 낮은 작업이 우선순위가 높은 작업에 필요한 리소스를 보유하고 있기 때문에 우선순위가 높은 트랜잭션이 지연되는 상황입니다. 우선순위 역전을 완화하기 위해 Android는 트랜잭션 우선순위 상속, 노드 우선순위 상속, 실시간 우선순위 상속의 세 가지 우선순위 상속 형식을 통해 다양한 우선순위로 스레드를 실행하는 것을 지원합니다.

이 페이지에서는 이러한 다양한 우선순위 상속 형식을 설명합니다.

트랜잭션 우선순위 상속

동기 바인더 호출을 할 때 우선순위가 낮은 스레드가 답장을 보낼 때까지 우선순위가 높은 스레드가 차단될 수 있습니다. 예를 들어 세분화된 값이 -19인 스레드는 기본 세분화된 값이 0인 스레드에 의해 차단될 수 있습니다.

트랜잭션 우선순위 상속 은 트랜잭션을 처리하는 바인더 스레드의 우선순위를 호출자의 우선순위와 일치하도록 바인더 드라이버가 일시적으로 변경하기 때문에 이 문제를 해결합니다. 트랜잭션이 완료되면 바인더 드라이버는 바인더 스레드의 우선순위를 이전 값으로 복원합니다.

노드 우선순위 상속

지연 시간이 짧아야 하는 상황과 같이 비동기 트랜잭션의 우선순위가 중요한 경우가 있습니다.

노드 우선순위 상속 을 사용하면 노드의 모든 트랜잭션이 실행되어야 하는 최소 우선순위를 구성할 수 있습니다. 노드 우선순위 상속이 구성되면 노드의 모든 트랜잭션이 이 최소 우선순위로 실행됩니다.

노드 우선순위 상속 규칙은 다음과 같습니다.

  • 트랜잭션이 동기식인 경우 우선순위는 max(min_node_priority, caller_priority);가 됩니다.

  • 트랜잭션이 비동기식인 경우 우선순위는 max(default_priority (nice 0), min_node_priority);가 됩니다.

노드 우선순위 상속 구성

노드 우선순위 상속을 구성하려면 BBinder::setMinSchedulerPolicy를 사용하세요.

실시간 우선순위 상속

Android는 SCHED_FIFO와 같은 실시간 예약 정책을 사용하여 지연 시간에 민감한 스레드가 작업을 제때 완료하도록 합니다. 또한 Android의 지연 시간에 민감한 작업 중 일부는 두 개 이상의 프로세스로 분할됩니다.

실시간 우선순위 상속 은 다음과 같은 경우를 제외하고 세분화된 값과 동일하게 작동합니다.

  • 실시간 우선순위 상속은 기본적으로 사용 중지되어 있습니다.
  • 실시간 우선순위 값이 클수록 우선순위가 높습니다.

실시간 우선순위 상속 사용 설정

실시간 우선순위 상속은 BBinder::setInheritRt(true) 호출을 사용하여 개별 노드에 사용 설정해야 합니다.