Eredità della priorità

L'inversione della priorità è una situazione in cui una transazione ad alta priorità viene ritardata da un'attività a bassa priorità perché quest'ultima detiene una risorsa necessaria per l'attività ad alta priorità. Per mitigare 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 sincrona del binder, un thread ad alta priorità può essere bloccato da un thread a bassa priorità 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à delle transazioni risolve questo problema perché il driver del binder modifica temporaneamente la priorità del thread del binder che gestisce la transazione in modo che corrisponda alla priorità del chiamante. Al termine della transazione, il driver del binder ripristina la priorità del thread del binder al valore precedente.

Ereditarietà della priorità dei nodi

In alcune situazioni, ad esempio quelle che richiedono una bassa latenza, la priorità delle transazioni asincrone è importante.

L'ereditarietà della priorità dei nodi consente di configurare la priorità minima con cui devono essere eseguite tutte le transazioni su un nodo. Una volta configurata l'ereditarietà della priorità del nodo, tutte le transazioni sul nodo vengono eseguite con questa priorità minima.

Le regole per l'ereditarietà della priorità dei nodi 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);.

Configura l'ereditarietà della priorità dei nodi

Per configurare l'ereditarietà della priorità dei nodi, utilizza BBinder::setMinSchedulerPolicy.

Eredità della priorità in tempo reale

Android utilizza criteri di pianificazione in tempo reale, come SCHED_FIFO, per fare in modo che i thread sensibili alla latenza completino il proprio lavoro in tempo. Inoltre, alcune attività di Android che richiedono una bassa latenza sono suddivise 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.

Abilitare l'ereditarietà della priorità in tempo reale

L'ereditarietà della priorità in tempo reale deve essere abilitata per i singoli nodi utilizzando la chiamata BBinder::setInheritRt(true).