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 reduzir a inversão de prioridade, o Android oferece suporte à execução de linhas de execução em diferentes prioridades por meio de 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.
Nesta página, explicamos 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 caller. Quando a transação é concluída, o driver restaura a prioridade da linha de execução do binder para o valor anterior.
Herança de prioridade do nó
Em algumas situações, como aquelas que exigem baixa latência, a prioridade das transações assíncronas é importante.
Com a herança de prioridade do nó, é possível configurar a prioridade mínima em que todas as transações em um nó devem ser executadas. Depois que a herança de prioridade do 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 será
max(min_node_priority, caller_priority);
.Se a transação for assíncrona, a prioridade será
max(default_priority (nice 0), min_node_priority);
.
Configurar a herança de prioridade do nó
Para configurar a herança de prioridade do 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 fazer com que
threads com latência crítica concluam o trabalho a tempo. Além disso, parte do trabalho crítico de latência do Android é dividida 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 maiores de prioridade em tempo real têm prioridade mais alta do 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)
.