支持 PI 的 RT 互斥子系统¶
具有优先级继承的 RT 互斥锁用于支持 PI-futexes,它启用 pthread_mutex_t 优先级继承属性 (PTHREAD_PRIO_INHERIT)。[有关 PI-futexes 的更多详细信息,请参阅轻量级 PI-futexes。]
这项技术是在 -rt 树中开发的,并为 pthread_mutex 支持进行了精简。
基本原理:¶
RT 互斥锁通过优先级继承协议扩展了简单互斥锁的语义。
rt 互斥锁的低优先级所有者会继承较高优先级等待者的优先级,直到 rt 互斥锁被释放。如果临时提升的所有者本身阻塞在一个 rt 互斥锁上,它会将优先级提升传播到它被阻塞的另一个 rt_互斥锁的所有者。一旦 rt 互斥锁被解锁,优先级提升会立即删除。
这种方法允许我们缩短高优先级任务在保护共享资源的互斥锁上的阻塞时间。优先级继承并不是针对设计不良的应用程序的灵丹妙药,但它允许设计良好的应用程序在高优先级线程的关键部分中使用用户空间锁,而不会丢失确定性。
等待者在 rtmutex 等待树中的入队是按优先级顺序进行的。对于相同优先级,选择 FIFO 顺序。对于每个 rtmutex,只有最高优先级的等待者才会入队到所有者的优先级等待者树中。该树也按优先级顺序排队。每当任务的最高优先级等待者发生变化(例如,超时或收到信号)时,都会调整所有者任务的优先级。优先级入队由 “pi_waiters” 处理。
RT 互斥锁针对快速路径操作进行了优化,并且在锁定没有争用的互斥锁或解锁没有等待者的互斥锁时没有内部锁定开销。优化的快速路径操作需要 cmpxchg 支持。[如果不可用,则使用 rt 互斥锁内部自旋锁]
rt 互斥锁的状态通过 rt 互斥锁结构的 owner 字段跟踪
lock->owner 保存所有者的 task_struct 指针。位 0 用于跟踪“锁有等待者”状态
只有当 lock->owner 的位 0 为 0 时,才可以使用基于快速原子比较交换的获取和释放。
顺便说一句,从技术上讲仍然存在“待处理的所有者”,只是不再这样称呼它了。待处理的所有者恰好是未拥有锁且已被唤醒以获取锁的锁的 top_waiter。