【问题标题】:Spinlocks - (Uniprocessors vs Multiprocessors) - (Preemptive vs Non-Preemptive Kernel)自旋锁 -(单处理器与多处理器)-(抢占式与非抢占式内核)
【发布时间】:2013-03-04 19:26:15
【问题描述】:

我是 linux 领域的新手。

我对在各种场景中使用自旋锁(在内核模式下)有些困惑。请澄清。

自旋锁用作忙等待机制。

1)自旋锁(单处理器+非抢占式内核)-->不存在(因为如果你在自旋锁中休眠会导致死锁)

2) Spinlocks(Uniprocessor + Preemptive kernel)-->不应该使用,因为它浪费资源。(当线程在持有锁时休眠会发生什么??其他进程可以正常执行吗?)

3) Spinlocks(Multiprocessor + Preemptive kernel)-->应该谨慎使用。(当线程在持有锁的情况下休眠会发生什么??其他进程可以正常执行吗?)

如果我对上述场景的理解是正确的,请告诉我,并请提供任何额外的信息来帮助我澄清自旋锁的使用。

【问题讨论】:

  • 这是我之前做的一个:stackoverflow.com/questions/6555358/…
  • 嗨 Anup,关于自旋锁的使用有很多注意事项。使用自旋锁的最佳位置是在您无法入睡的“中断上下文”中。在更新全局结构或全局变量的小代码路径中,您可以使用自旋锁。使用“irq_save”api 的自旋锁是最佳实践。

标签: linux linux-kernel linux-device-driver


【解决方案1】:

IIRC,在 UP 的情况下,自旋锁大部分被忽略(除了可能禁用抢占,对于某些自旋锁函数变体,还有 IRQ)。

在多处理器情况下,抢占再次被禁用,IRQ 也可能被禁用。

一般来说,持有自旋锁的任务不应该处于休眠状态。 (如果他们只是禁用中断,那就更糟了)

(免责声明:帖子内容可能不太准确/非常不准确,因为已经晚了,我无法验证详细信息 ATM)

【讨论】:

    猜你喜欢
    • 2018-09-16
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 2014-08-25
    • 2011-07-10
    • 2014-11-18
    相关资源
    最近更新 更多