首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >“自旋锁”到底是什么?

“自旋锁”到底是什么?
EN

Stack Overflow用户
提问于 2009-12-24 16:34:21
回答 11查看 81.8K关注 0票数 124

我一直想知道它们是什么:每当我听说它们时,未来飞轮般的设备的图像就会起舞(滚动?)在我的脑海里。

他们是什么?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2009-12-24 16:55:46

当您使用常规锁(互斥、临界区等)时,操作系统会将您的线程置于等待状态,并通过在同一核心上调度其他线程来preempts它。如果等待时间真的很短,这会造成性能损失,因为线程现在必须等待抢占才能再次接收CPU时间。

此外,内核对象并不是在内核的每种状态下都可用,例如在中断处理程序中或在分页不可用时等等。

自旋锁不会导致抢占,而是在循环中等待(“旋转”),直到另一个核心释放锁。这可以防止线程丢失其quantum,并在锁释放后立即继续。自旋锁的简单机制允许内核在几乎任何状态下使用它。

这就是为什么在单核机器上,自旋锁只是一个“禁用中断”或“提升IRQL”,它会完全阻止线程调度。

自旋锁最终允许内核避免“大内核锁”(当内核进入内核并在退出时释放时获得的锁),并对内核原语进行粒度锁定,从而在多核机器上实现更好的多处理,从而获得更好的性能。

编辑:出现了一个问题:“这是不是意味着我应该尽可能地使用旋转锁?”我会试着回答这个问题:

正如我所提到的,只有在预期等待时间小于一个量程(读取:毫秒)并且抢占没有多大意义(例如内核对象不可用)的地方,自旋锁才有用。

如果等待时间未知,或者处于用户模式,则自旋锁的效率很低。在检查自旋锁是否可用时,您在等待的核心上消耗了100%的CPU时间。您可以防止其他线程在该核心上运行,直到您的量程到期。此场景仅适用于内核级的短突发,而不太可能是用户模式应用程序的选项。

这里有一个关于解决这个问题的问题:Spinlocks, How Useful Are They?

票数 150
EN

Stack Overflow用户

发布于 2009-12-24 16:40:03

假设资源受锁保护,想要访问该资源的线程需要首先获取锁。如果锁不可用,线程可能会重复检查锁是否已被释放。在此期间,线程忙着等待,检查锁,使用CPU,但不做任何有用的工作。这样的锁被称为旋转锁。

票数 32
EN

Stack Overflow用户

发布于 2009-12-24 16:38:37

这是一个循环,它会一直循环,直到满足某个条件:

代码语言:javascript
运行
复制
while(cantGoOn) {};
票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1957398

复制
相关文章

相似问题

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