Locking 检测程序代码何时尝试获取自旋锁的方法
优先级反转是一个常见且有点陈旧的问题。那些处理操作系统进程调度的人,特别是在有实时需求的情况下,都很熟悉它。对于这个问题,很少有著名的解决方案,每种解决方案都有其优缺点:Locking 检测程序代码何时尝试获取自旋锁的方法,locking,scheduling,deadlock,atomic,Locking,Scheduling,Deadlock,Atomic,优先级反转是一个常见且有点陈旧的问题。那些处理操作系统进程调度的人,特别是在有实时需求的情况下,都很熟悉它。对于这个问题,很少有著名的解决方案,每种解决方案都有其优缺点: 禁用所有中断以保护关键部分 优先权上限 优先继承 随机增压 选择哪种方法来处理优先级反转并不重要;考虑到应用程序使用定义良好的接口来同步共享资源,所有这些都相对容易在操作系统内核中实现。例如,如果进程使用锁定互斥锁,那么操作系统很清楚这一事实,因为该函数在深层次上执行系统调用(即在Linux上)。当内核服务于这个请求时,它
- 禁用所有中断以保护关键部分
- 优先权上限
- 优先继承
- 随机增压
你对上述想法有何看法?你还能想到其他什么方法来检测这样的代码呢?虽然我仍然对你的设置提出疑问(见评论),但我认为你的第三种方法最有希望,因为它提供了最精确的信息。 我可以找出遵循主要思想的两种机制:
循环:CMPXCHG,JRZ循环
。
然后,将
标记为“缺失”或“不可访问”,并挂接MMU服务例程然后,您可以通过调用常规互斥锁或一些自己的簿记例程(实际锁定除外)来交换关键自旋锁
此外,请注意,使用atomar用户级自旋锁的基本方法可能不适用于当今的几种内存一致性模型。我认为您的选项1可能比您认为的更有价值。我假设您有几个可能需要监视的进程,并且您不知道自旋锁的目标地址 与随机外部采样相比,您可能会发现挂接调度器入口点并在此时收集统计信息更容易,优势在于您位于进程地址空间中,并且缓存很热。我对linux调度器了解不多,但过去在OpenVMS上做过类似的事情。调度程序通常有两个入口点,一个是自愿的(等待IO等),另一个是非自愿的,自旋锁问题几乎总是非自愿的,所以这应该会降低您的工作效率 显然,现在你有了中断的PC,但似乎Intel芯片也有一些可以使用的性能监控计数器,BTS(分支跟踪存储)和PEB,但这些在性能方面可能是“非免费”的。诸如分支跟踪之类的信息将很快显示紧密循环,然后您可以使用这些信息来检查导致循环的实际指令(同样,已经在缓存中),并查看它是条件原子指令还是“正常”工作,例如对数组求和 如果您没有编写代码,那么非联锁指令也可能以某种方式被使用,希望不是这样 虽然我认为一些芯片上的监控功能在这方面确实有帮助,但你也可以简单地检查pc在上个M计划周期结束时是否大致相同,并强制它跳过一个周期,非常简单,但没有针对性 虽然您可以将所有这些作为第二个进程查看,但它可能没有基于调度器的方法响应快,尽管可能