首页 > 其他分享 >RT-Mutex——内核文档翻译——rt-mutex.rst

RT-Mutex——内核文档翻译——rt-mutex.rst

时间:2022-12-25 15:56:09浏览次数:45  
标签:RT rt 优先级 互斥 mutex owner

翻译:kernel-5.10\Documentation\locking\rt-mutex.rst

==================================
支持 PI 的 RT-mutex 子系统
==================================

具有优先级继承的 RT-mutexes 用于支持 PI-futexes,它启用 pthread_mutex_t 优先级继承属性 (PTHREAD_PRIO_INHERIT)。 [有关 PI-futex 的更多详细信息,
请参阅 Documentation/locking/pi-futex.rst。]

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


基本原则:
------------------

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

rt-mutex 的低优先级所有者(owner)继承高优先级等待者(waiter)的优先级,直到 rt-mutex 被释放。 如果临时提升的所有者又被其它 rt-mutex 阻塞,它会将优
先级提升继续传播给阻塞它的其他 rt_mutex 的所有者。 一旦 rt_mutex 被释放,优先级提升会立即被移除。

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

将等待者排队到 rtmutex 等待者树中是按优先顺序完成的。 对于相同的优先级,选择 FIFO 顺序。 对于每个 rtmutex,只有最高优先级的waiters被排入owner的优
先级waiter树中。 这棵树也按优先顺序排队。 每当任务的最高优先级等待者发生变化(例如超时或收到信号)时,owner task的优先级就会被重新调整。 优先级排
队由“pi_waiters”处理。

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

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

lock->owner 持有 owner 的 task_struct 指针。 位 0 用于跟踪“锁有等待者”状态:

============ ======= ================================================
所有者       bit0    注释
============ ======= ================================================
NULL         0       锁是空闲的(可以快速获取)
NULL         1       锁是空闲的,有等待者,top waiter要拿锁[1]_
taskpointer  0       锁被持有(可以快速释放)
taskpointer  1       锁被持有并且有等待者 [2]_
============ ======= ================================================

只有当 lock->owner 的 bit 0 为 0 时,基于快速原子比较交换的获取和释放才有可能。

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

.. [2] 位 0 被设置但没有waiters的时间是很短的。 在慢速路径上抢锁时可能会发生这种情况。 为了防止所有者的 cmpxchg 释放锁,我们需要在查看锁之前设置该位。

顺便说一句,技术上仍然有一个“Pending Owner”,只是不再那样称呼了。 pending owner恰好是一个没有owner的锁的top_waiter,已经被唤醒去抢锁。

 

标签:RT,rt,优先级,互斥,mutex,owner
From: https://www.cnblogs.com/hellokitty2/p/17004118.html

相关文章

  • AT_pakencamp_2021_day2_c Participants 3 题解
    题目传送门题目大意找出没有参加第\(1\)天的比赛,但是参加了第\(2\)天的比赛人的ID。解题思路从第一次比赛人员的ID中,查找是不是没有有第二次比赛人员的ID。如......
  • 用Echarts实现前端表格引用从属关系可视化
    在金融行业,我们经常会有审计审查的需求,对某个计算结果进行审查,但是这个计算结果可能依赖多个单元格,而且会有会有多级依赖的情况,如果让我们的从业人员靠眼睛找,工作量巨大,而且......
  • dart 语法特性
    dart和JS长得很像数据类型(变量)dart语言所有的类型都是对象强类型语言,但是也可以使用var不显示地申明变量,此时在我们赋值后会进行类型判定,如是不需要类型判断的话,就需......
  • [python]第三方库ColorThief的使用
    介绍了python第三方库ColorThief的使用方法并配有简单代码。目录目录什么是ColorThief?如何安装ColorThief?如何使用ColorThief?导入实例化ColorThief提取图片......
  • AT_pakencamp_2021_day2_a Participants 2 翻译
    题目传送门题目描述将帕研2021集训的参加人数定义为“集训第一天开始时进入帕研2021集训Discord服务器的人数”时,这个数是多少?输入格式这个问题没有输入。输出......
  • AT_pakencamp_2020_day2_a Participants 翻译
    题目传送门题目描述帕研集训20xx分为\(2\)天,不住宿,第\(1\)天的参加者是\(A\)人,第\(2\)天的参加者是\(B\)人。集训全体的参加者,也就是\(2\)天中参加\(1\)......
  • AT_pakencamp_2021_day2_c Participants 3 翻译
    题目传送门帕研君举办了\(2\)天的编程竞赛。第\(1\)天的比赛有\(N\)人参加,第\(2\)天的比赛有\(M\)人参加。每个参赛者都被分配了一个整数ID。第\(1\)天参......
  • AT_pakencamp_2020_day2_a Participants 题解
    题目传送门题目大意集训有\(2\)天,\(2\)天中参加\(1\)天以上的人数最少是多少,最多是多少?解题思路参加一天以上的人数最少就是\(A\)和\(B\)的最大值,而最多就是......
  • T_pakencamp_2021_day2_a Participants 2 题解
    题目传送门题目大意输出帕研集训2021的参加人数。解题思路输出51。代码C++:#include<iostream>intmain(){::std::cout<<51<<::std::endl;retur......
  • CF1750A Indirect Sort 题解
    题目传送门题目大意有\(T\)组长度为\(n\)的排列;每组进行若干次操作(每次操作选择三个数\(i\),\(j\),\(k\)):若\(a_i>a_k\)将\(a_i\)加上\(a_j\),否则就交换\(a_j......