支持优先级继承的RT-mutex子系统

发布时间 2023-12-10 11:40:43作者: 摩斯电码

RT-mutex子系统支持PI

RT-mutexes与优先级继承一起使用,以支持PI-futexes,从而使pthread_mutex_t支持优先级继承属性(PTHREAD_PRIO_INHERIT)。[有关PI-futexes的更多详细信息,请参见轻量级PI-futexes。]

这项技术是在-rt树中开发的,并针对pthread_mutex支持进行了优化。

基本原则:

RT-mutexes通过优先级继承协议扩展了简单互斥锁的语义。

RT-mutex的低优先级所有者在释放RT-mutex之前会继承较高优先级等待者的优先级。如果临时提升的所有者在RT-mutex上阻塞,它会将优先级提升传播给其所阻塞的另一个RT-mutex的所有者。一旦RT-mutex被解锁,优先级提升立即被移除。

这种方法使得我们能够缩短对保护共享资源的互斥锁上的高优先级任务的阻塞时间。优先级继承并非是对设计不佳的应用程序的灵丹妙药,但它允许设计良好的应用程序在高优先级线程的关键部分使用用户空间锁,而不会失去确定性。

等待者被排队进入rtmutex等待者树时按优先级顺序进行。对于相同的优先级,选择FIFO顺序。对于每个rtmutex,只有顶部优先级的等待者被排队进入所有者的优先级等待者树。这棵树也按优先级顺序排队。每当任务的顶部优先级等待者发生变化(例如超时或收到信号),所有者任务的优先级就会被重新调整。优先级排队由"pi_waiters"处理。

RT-mutexes针对快速路径操作进行了优化,在锁定无等待者的互斥锁或解锁互斥锁时没有内部锁定开销。优化的快速路径操作需要cmpxchg支持。[如果不可用,则使用rt-mutex内部自旋锁]

通过rt-mutex结构的owner字段跟踪rt-mutex的状态:

lock->owner保存所有者的task_struct指针。位0用于跟踪"锁有等待者"状态:

image

只有当lock->owner的位0为0时,才能进行快速原子比较交换式获取和释放。

[1] 当持有->wait_lock时,它也可以是一个过渡状态。为了防止对锁的任何快速路径cmpxchg,我们需要在查看锁之前设置位0,并且在这段时间内所有者可能为NULL,因此这可以是一个过渡状态。

[2] 当在慢路径中获取锁时,有一小段时间位0被设置但没有等待者。为了防止所有者释放锁的cmpxchg,我们需要在查看锁之前设置这个位。

顺便说一句,从技术上讲仍然存在"待定所有者",只是不再这样称呼了。待定所有者恰好是一个没有所有者并已被唤醒以获取锁的顶部等待者。