La inversión de prioridad es una situación en la que una transacción de prioridad alta se retrasa por una tarea de prioridad baja porque esta última tiene un recurso que necesita la tarea de prioridad alta. Para mitigar la inversión de prioridad, Android admite la ejecución de subprocesos con diferentes prioridades a través de tres formas diferentes de herencia de prioridad: herencia de prioridad de transacción, herencia de prioridad de nodo y herencia de prioridad en tiempo real.
En esta página, se explican estas diferentes formas de herencia de prioridad.
Herencia de prioridad de transacción
Cuando se realiza una llamada síncrona a Binder, un subproceso de alta prioridad puede quedar bloqueado por un subproceso de baja prioridad hasta que este último envíe una respuesta. Por ejemplo, un subproceso con un valor de prioridad de -19 puede quedar bloqueado por un subproceso con un valor de prioridad predeterminado de 0.
La herencia de prioridad de transacción corrige este problema porque el controlador del binder cambia temporalmente la prioridad del subproceso del binder que controla la transacción para que coincida con la prioridad del llamador. Cuando finaliza la transacción, el controlador del binder restablece la prioridad del subproceso del binder a su valor anterior.
Herencia de prioridad de nodos
En algunas situaciones, como las que requieren una latencia baja, la prioridad de las transacciones asíncronas es importante.
La herencia de prioridad del nodo te permite configurar la prioridad mínima con la que se deben ejecutar todas las transacciones en un nodo. Después de configurar la herencia de prioridad del nodo, todas las transacciones en el nodo se ejecutan con esta prioridad mínima.
Las reglas para la herencia de prioridad de nodos son las siguientes:
Si la transacción es síncrona, la prioridad se convierte en
max(min_node_priority, caller_priority);
.Si la transacción es asíncrona, la prioridad se convierte en
max(default_priority (nice 0), min_node_priority);
.
Configura la herencia de prioridad del nodo
Para configurar la herencia de prioridad de nodos, usa BBinder::setMinSchedulerPolicy
.
Herencia de prioridad en tiempo real
Android usa políticas de programación en tiempo real, como SCHED_FIFO
, para que los subprocesos críticos para la latencia completen su trabajo a tiempo. Además, parte del trabajo de Android que es fundamental para la latencia se divide en dos o más procesos.
La herencia de prioridad en tiempo real funciona de manera idéntica a los valores de nice, excepto por lo siguiente:
- La herencia de prioridad en tiempo real está inhabilitada de forma predeterminada.
- Los valores de prioridad en tiempo real más altos tienen mayor prioridad que los valores más bajos.
Habilita la herencia de prioridad en tiempo real
La herencia de prioridad en tiempo real se debe habilitar para nodos individuales con la llamada BBinder::setInheritRt(true)
.