首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spinlock与繁忙的等待

Spinlock与繁忙的等待
EN

Stack Overflow用户
提问于 2016-06-30 13:16:59
回答 3查看 13.2K关注 0票数 18

请解释为什么忙碌的等待通常会被皱眉,而旋转通常被认为是好的。据我所知,它们都是无限循环的,直到满足某种条件。

EN

回答 3

Stack Overflow用户

发布于 2016-07-03 18:36:13

当资源争用较低时,通常使用自旋锁,因此,在继续进行生产性工作之前,CPU只需进行几次迭代。但是,锁定功能的库实现通常使用自旋锁,然后是常规锁。如果无法在合理的时间范围内获取资源,则使用常规锁。这样做是为了减少上下文开关在通常快速获得锁的设置中的开销。

术语繁忙-等待往往意味着您愿意旋转和等待改变硬件寄存器或内存位置。这个术语不一定意味着锁定,但它确实意味着在一个紧密的循环中等待,反复探索更改。

您可能需要使用繁忙的等待,以检测您想要立即响应的环境中的某种变化。因此,使用繁忙等待实现自旋锁。繁忙等待在任何情况下都是有用的,在这种情况下,非常低的延迟响应比浪费CPU周期更重要(比如在某些类型的嵌入式编程中)。

与此相关的术语是“无锁”和“无等待”:

所谓的无锁算法倾向于使用与CAS指令紧密的繁忙等待,但是这种争用在普通情况下是如此之低,以至于CPU通常只需要迭代几次。

所谓的无等待算法根本不做任何繁忙的等待。

(请注意,在学术上下文中使用“无锁”和“无等待”略有不同,请参阅维基百科在非阻塞算法上的文章。)

票数 13
EN

Stack Overflow用户

发布于 2021-08-09 12:55:51

标准互斥或自旋互斥:当线程调用锁定并获取互斥的函数时,该函数在锁住互斥锁之前不会返回。这对于事件同步来说是典型的:等待事件的线程,即它已经获得互斥拥有权的事实。有两种方法可以做到这一点: 空闲等待:如第2章所述,等待锁定互斥锁的线程处于等待状态。它释放CPU,然后可以用来运行另一个线程。当互斥锁可用时,运行时系统唤醒并重新安排等待线程,然后等待线程可以锁定现在可用的互斥对象。 ·繁忙的等待,也称为旋转等待,其中等待锁定互斥对象的线程不会释放CPU。它仍然按计划进行,在互斥锁释放之前执行一些琐碎的不做任何操作指令。 标准互斥通常订阅第一个策略,并执行空闲等待。但是,一些库还提供了订阅spin等待策略的互斥对象。最好的方法取决于应用程序的上下文。简而言之,在用户空间中旋转等待是更有效的,因为将线程置于阻塞状态需要循环。但是在长时间的等待中,休眠线程释放它的CPU使循环对其他线程可用。

我发现这与这个来源有很大关系:https://www.sciencedirect.com/topics/computer-science/waiting-thread

票数 2
EN

Stack Overflow用户

发布于 2016-07-03 19:26:00

当您了解规则的确切原因并具有详细的平台和应用程序知识时,您就知道何时违反该规则是合适的。自旋锁是由专家实现的,他们完全了解他们正在开发的平台和打算用于自旋锁的应用程序。

忙着等待的问题很多,但在大多数平台上,都有解决方案。问题包括:

  1. 对于具有超线程的CPU,繁忙等待的线程可能会饥饿位于同一个物理内核中的另一个线程,甚至是它正在等待的线程。
  2. 当你忙着等待,当你终于得到你等待的资源时,你选择了所有被错误预测的分支的母亲。
  3. 忙着等待会干扰CPU的电源管理。
  4. 繁忙的等待会使核心总线饱和,因为您一直在检查的东西会导致高速缓存同步通信。

但是,设计自旋锁的人了解所有这些问题,并且确切地知道如何在平台上减轻这些问题。他们不写天真的纺纱代码,他们写智能纺纱代码。

因此,是的,它们都无限循环,直到满足某些条件,但它们的循环不同。

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

https://stackoverflow.com/questions/38124337

复制
相关文章

相似问题

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