Herança de prioridade

A inversão de prioridade é uma situação em que uma transação de alta prioridade é atrasada por uma tarefa de baixa prioridade porque ela mantém um recurso necessário para a tarefa de alta prioridade. Para mitigar a inversão de prioridade, o Android oferece suporte à execução de linhas de execução em diferentes prioridades usando três formas diferentes de herança de prioridade: herança de prioridade de transação, herança de prioridade de nó e herança de prioridade em tempo real.

Esta página explica essas diferentes formas de herança de prioridade.

Herança de prioridade de transação

Ao fazer uma chamada de vinculação síncrona, uma linha de execução de alta prioridade pode ser bloqueada por uma linha de execução de baixa prioridade até que ela envie uma resposta. Por exemplo, uma linha de execução com um valor "nice" de -19 pode ser bloqueada por uma linha de execução com um valor "nice" padrão de 0.

A herança de prioridade de transação corrige esse problema porque o driver de vinculação muda temporariamente a prioridade da linha de execução de vinculação que processa a transação para corresponder à prioridade do autor da chamada. Quando a transação é concluída, o driver de vinculação restaura a prioridade da linha de execução de vinculação para o valor anterior.

Herança de prioridade de nó

Em algumas situações, como aquelas que exigem baixa latência, a prioridade das transações assíncronas é importante.

A herança de prioridade de nó permite configurar a prioridade mínima em que todas as transações em um nó precisam ser executadas. Depois que a herança de prioridade de nó é configurada, todas as transações no nó são executadas nessa prioridade mínima.

As regras para herança de prioridade de nó são:

  • Se a transação for síncrona, a prioridade se tornará max(min_node_priority, caller_priority);.

  • Se a transação for assíncrona, a prioridade se tornará max(default_priority (nice 0), min_node_priority);.

Configurar a herança de prioridade de nó

Para configurar a herança de prioridade de nó, use BBinder::setMinSchedulerPolicy.

Herança de prioridade em tempo real

O Android usa políticas de programação em tempo real, como SCHED_FIFO, para que as linhas de execução críticas para a latência concluam o trabalho a tempo. Além disso, alguns trabalhos críticos para a latência do Android são divididos em dois ou mais processos.

A herança de prioridade em tempo real funciona de maneira idêntica aos valores "nice", exceto:

  • A herança de prioridade em tempo real está desativada por padrão.
  • Valores de prioridade em tempo real maiores têm prioridade maior que valores menores.

Ativar a herança de prioridade em tempo real

A herança de prioridade em tempo real precisa ser ativada para nós individuais usando a chamada BBinder::setInheritRt(true).