继承优先级

优先级倒置是指优先级较高的事务因优先级较低的任务持有高优先级任务所需的资源而受到延迟的情况。为了缓解优先级反转,Android 支持通过三种不同的优先级继承形式(事务优先级继承、节点优先级继承和实时优先级继承)以不同的优先级运行线程。

本页面介绍了这些不同形式的优先级继承。

事务优先级继承

在进行同步 binder 调用时,高优先级线程可能会被低优先级线程阻塞,直到低优先级线程发送回复。例如,nice 值为 -19 的线程可能会被 nice 默认值为 0 的线程阻塞。

事务优先级继承可解决此问题,因为 binder 驱动程序会暂时更改处理事务的 binder 线程的优先级,使其与调用方的优先级相匹配。当事务完成时,绑定器驱动程序会将绑定器线程的优先级恢复为之前的值。

节点优先级继承

在某些情况下(例如需要低延迟的情况下),异步事务的优先级非常重要。

借助节点优先级继承,您可以配置节点上所有事务应运行的最低优先级。配置节点优先级继承后,节点上的所有事务都将以该最低优先级运行。

节点优先级继承规则如下:

  • 如果交易是同步的,则优先级变为 max(min_node_priority, caller_priority);

  • 如果事务是异步的,则优先级变为 max(default_priority (nice 0), min_node_priority);

配置节点优先级继承

如需配置节点优先级继承,请使用 BBinder::setMinSchedulerPolicy

实时优先级继承

Android 使用实时调度政策(例如 SCHED_FIFO)来确保延迟关键型线程及时完成工作。此外,Android 的一些延迟时间关键型工作会拆分到两个或更多进程中。

实时优先级继承的运作方式与 nice 值完全相同,但有以下区别:

  • 实时优先级继承默认处于停用状态。
  • 实时优先级值越大,优先级越高。

启用实时优先级继承

必须使用 BBinder::setInheritRt(true) 调用为各个节点启用实时优先级继承。