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

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

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用于跟踪"锁有等待者"状态:

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

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

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

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

相关文章
|
4月前
|
消息中间件 调度 数据安全/隐私保护
xenomai内核解析--任务同步互斥机制(一)--优先级倒置
本文是关于Xenomai实时操作系统中资源管理和优先级倒置问题的概述。Xenomai使用`xnobject`和`xnregistry`管理任务间的同步互斥资源,如信号量、互斥锁等。资源管理涉及访问控制和资源保存,确保共享资源的正确调度。文章还介绍了优先级倒置现象,即高优先级任务因低优先级任务持有资源而被阻塞。为解决此问题,Xenomai采用了优先级继承策略,临时提升低优先级任务的优先级,以防止持续的优先级反转。文章后续将深入分析`xnsynch`模块和优先级倒置解决方案。
122 1
xenomai内核解析--任务同步互斥机制(一)--优先级倒置
FreeRTOS 互斥量 优先级反转(翻转)和优先级继承 详解
FreeRTOS 互斥量 优先级反转(翻转)和优先级继承 详解
|
iOS开发
iOS多线程之NSOperationQueue-依赖、并发数、优先级、自定义Operation等最全的使用总结
iOS多线程之NSOperationQueue-依赖、并发数、优先级、自定义Operation等最全的使用总结
379 0
|
API 调度
【玩转RT-Thread】线程管理(详细原理)(下)
【玩转RT-Thread】线程管理(详细原理)
257 0
|
传感器 调度 芯片
【玩转RT-Thread】线程管理(详细原理)(上)
【玩转RT-Thread】线程管理(详细原理)(上)
266 0
|
存储 缓存 中间件
【Linux】多线程01 --- 理解线程 线程控制及封装(上)
【Linux】多线程01 --- 理解线程 线程控制及封装
101 0
|
存储 Linux 编译器
【Linux】多线程01 --- 理解线程 线程控制及封装(下)
【Linux】多线程01 --- 理解线程 线程控制及封装(下)
124 0
|
存储 缓存 算法
【Linux】多线程 --- 线程概念 控制 封装-1
【Linux】多线程 --- 线程概念 控制 封装-1
|
存储 Linux Shell
【Linux】多线程 --- 线程概念 控制 封装-2
【Linux】多线程 --- 线程概念 控制 封装-2
驱动开发:内核中枚举进线程与模块
内核枚举进程使用`PspCidTable` 这个未公开的函数,它能最大的好处是能得到进程的EPROCESS地址,由于是未公开的函数,所以我们需要变相的调用这个函数,通过`PsLookupProcessByProcessId`函数查到进程的EPROCESS,如果`PsLookupProcessByProcessId`返回失败,则证明此进程不存在,如果返回成功则把EPROCESS、PID、PPID、进程名等通过DbgPrint打印到屏幕上。
450 0
驱动开发:内核中枚举进线程与模块