L'inversione di priorità è una situazione in cui una transazione con priorità elevata viene ritardata da un'attività con priorità bassa perché quest'ultima detiene una risorsa necessaria per l'attività con priorità elevata. Per attenuare l'inversione di priorità, Android supporta l'esecuzione di thread con priorità diverse tramite tre diverse forme di ereditarietà della priorità: ereditarietà della priorità della transazione, ereditarietà della priorità del nodo ed ereditarietà della priorità in tempo reale.
Questa pagina spiega queste diverse forme di ereditarietà della priorità.
Ereditarietà della priorità della transazione
Quando si effettua una chiamata binder sincrona, un thread con priorità elevata può essere bloccato da un thread con priorità bassa finché quest'ultimo non ha inviato una risposta. Ad esempio, un thread con un valore nice di -19 può essere bloccato da un thread con un valore nice predefinito di 0.
L'ereditarietà della priorità della transazione risolve questo problema perché il driver binder modifica temporaneamente la priorità del thread binder che gestisce la transazione in modo che corrisponda alla priorità del chiamante. Al termine della transazione, il driver binder ripristina la priorità del thread binder al valore precedente.
Ereditarietà della priorità del nodo
In alcune situazioni, ad esempio quelle che richiedono una bassa latenza, la priorità delle transazioni asincrone è importante.
L'ereditarietà della priorità del nodo consente di configurare la priorità minima con cui devono essere eseguite tutte le transazioni su un nodo. Dopo aver configurato l'ereditarietà della priorità del nodo, tutte le transazioni sul nodo vengono eseguite con questa priorità minima.
Le regole per l'ereditarietà della priorità del nodo sono:
Se la transazione è sincrona, la priorità diventa
max(min_node_priority, caller_priority);.Se la transazione è asincrona, la priorità diventa
max(default_priority (nice 0), min_node_priority);.
Configurare l'ereditarietà della priorità del nodo
Per configurare l'ereditarietà della priorità del nodo, utilizza BBinder::setMinSchedulerPolicy.
Ereditarietà della priorità in tempo reale
Android utilizza criteri di pianificazione in tempo reale, come SCHED_FIFO, per consentire ai thread critici per la latenza di completare il proprio lavoro in tempo. Inoltre, alcuni lavori critici per la latenza di Android sono suddivisi in due o più processi.
L'ereditarietà della priorità in tempo reale funziona in modo identico ai valori nice, tranne che:
- L'ereditarietà della priorità in tempo reale è disattivata per impostazione predefinita.
- I valori di priorità in tempo reale più elevati hanno una priorità maggiore rispetto ai valori più piccoli.
Attivare l'ereditarietà della priorità in tempo reale
L'ereditarietà della priorità in tempo reale deve essere attivata per i singoli nodi utilizzando la chiamata BBinder::setInheritRt(true).