【问题标题】:mutex owner in SMP linuxSMP linux中的互斥锁所有者
【发布时间】:2012-09-24 19:04:35
【问题描述】:

在互斥锁的内核实现中,线程所有者字段仅在它是 SMP 构建时才存在。我可以理解,在良好且干净的代码下,只有在获取成功时,线程才会调用 release,因此我们可以通过不跟踪线程来节省一些缓存和 cpu 周期。但是为什么 SMP 需要它呢?是因为在 SMP 中,互斥体是混合的并且在线程所有者在另一个 cpu 上并且需要此字段作为参考时自旋,还是背后有更多原因?

【问题讨论】:

    标签: linux linux-kernel mutex semantics smp


    【解决方案1】:

    老实说,我现在不记得 linux 内核互斥锁的实现了,但我看到至少三个原因将互斥锁所有者直接存储在数据结构中:

    1. 用于调试。从内核故障转储中检测所有者很容易
    2. 用于运行时断言。检测获取已获取互斥体的尝试变得非常容易。
    3. 用于实现优先级继承协议或解决优先级反转问题的任何其他机制:http://en.wikipedia.org/wiki/Priority_inversion

    【讨论】:

    • 1) 为什么要在发布版本中浪费资源调试?它已经在 owner 字段周围有 #if DEBUG|SMP 包装器。 2)这不应该是一场严重的恐慌或锁定吗?这是违反语义的。 3)嗯,但他们似乎没有这样做..
    • 我看了一下源代码,似乎他们需要所有者的唯一原因是 mutex_spin_on_owner() 函数:lxr.linux.no/linux+v3.5.4/kernel/sched/core.c#L3505 它允许一个任务等到另一个任务(互斥所有者)阻塞或退出(即更改它的调度状态)。
    猜你喜欢
    • 1970-01-01
    • 2018-01-10
    • 2018-04-16
    • 2012-06-05
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 2010-09-16
    相关资源
    最近更新 更多