首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么自旋锁不能在单处理器(unicore)系统中工作?

为什么自旋锁不能在单处理器(unicore)系统中工作?
EN

Stack Overflow用户
提问于 2012-02-07 04:26:03
回答 5查看 16.1K关注 0票数 9

我知道自旋锁与自旋一起工作,不同的内核路径存在,内核是抢占式的,那么为什么单处理器系统中自旋锁不起作用呢?(例如,在Linux中)

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-02-07 04:40:05

如果我理解你的问题,你会问为什么旋转锁在单核机器上不是一个好主意。

它们应该仍然可以工作,但可能比真正的线程睡眠并发要昂贵得多:

当你使用自旋锁时,你本质上是在断言你不认为你会等待很长时间。您的意思是,您认为在繁忙的循环中维护处理器时间片比休眠线程和将上下文切换到另一个线程或进程的成本更好。如果你必须等待很短的时间,你几乎可以立即入睡并被唤醒,但上下起伏的成本比仅仅等待更昂贵。

这在多核处理器上可能更好,因为它们的并发配置文件比单核处理器好得多。在多核处理器上,在循环迭代之间,一些其他线程可能已经处理了您的先决条件。在单核处理器上,其他人不可能帮到你-你已经锁定了一个也是唯一的一个核心。

这里的问题是,如果你在一个锁上等待或睡眠,你会提示系统你还没有得到你需要的一切,所以它应该去做一些其他的事情,并在稍后返回给你,。使用旋转锁,你永远不会告诉系统这一点,所以你锁定它,等待其他事情发生-但同时,你阻碍了整个系统,所以其他事情不会发生。

票数 29
EN

Stack Overflow用户

发布于 2012-02-10 13:07:11

自旋锁的本质是它不会取消对进程的调度-相反,它会旋转,直到进程获得锁。

在单处理器上,它要么立即获得锁,要么永远旋转-如果锁被争用,那么当前持有资源的进程将永远没有机会放弃它。只有当另一个进程在锁上旋转时另一个进程可以执行时,自旋锁才有用-这意味着多处理器系统。

票数 2
EN

Stack Overflow用户

发布于 2014-07-11 16:31:55

自旋锁有不同的版本:

代码语言:javascript
运行
复制
spin_lock_irqsave(&xxx_lock, flags);
... critical section here ..
spin_unlock_irqrestore(&xxx_lock, flags);

在Uni处理器中,当数据需要在进程上下文和中断上下文之间共享时,应该使用spin_lock_irqsave(),因为在这种情况下IRQ也被禁用。spin_lock_irqsave()在任何情况下都能工作,但部分原因是它们是安全的,它们也相当慢。但是,如果数据需要跨不同的CPU进行保护,那么最好使用以下版本,这些版本比较便宜,因为IRQ在这种情况下不会被禁用:

代码语言:javascript
运行
复制
spin_lock(&lock);
...
spin_unlock(&lock);

在单处理器系统中,调用spin_lock_irqsave(&xxx_lock, flags);与禁用中断具有相同的效果,后者将提供所需的中断并发保护,而无需不必要的SMP保护。然而,在多处理器系统中,这涵盖了中断和SMP并发问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9166779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档