首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么旋转锁在单个CPU上没有意义?

为什么旋转锁在单个CPU上没有意义?
EN

Stack Overflow用户
提问于 2017-02-16 23:08:11
回答 1查看 1.8K关注 0票数 3

在阅读操作系统时,我发现了以下三个简单的部分:

“要在单个处理器上正确工作,需要一个抢占式调度器(即通过计时器中断线程,以便不时运行不同的线程)。如果没有抢占,自旋锁在单个CPU上就没有多大意义,因为在CPU上旋转的线程永远不会放弃它。”

为什么在单个CPU上旋转的线程永远不会放弃它,即使单个CPU支持多线程?是因为在这种情况下,自旋锁只是浪费了太多的CPU资源吗?CPU内核的数量如何影响不同锁(如互斥锁和自旋锁)的性能?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-17 00:00:56

在单CPU、单核CPU上,仍然可以使用线程 多任务 (多线程),但请注意,由于缺少多个执行单元,通常只有一个线程可以同时执行。如果没有多个执行单元(硬件多线程),硬件依赖于内核-低级操作系统软件定义的“软件多线程(https://en.wikipedia.org/wiki/Thread_(computing%29#Single_vs_Multiprocessor_systems))”策略来确定执行的内容和时间。

抢占是一种策略,它涉及更主动的引导(可以说)沿着单个路径的多个执行流,通常是通过基于使用定时器的中断来实现的。先发制人的相反-- 协同调度 --采用了一种更加放任的方法,让它由活动线程来指示它已经完成。

因此,协作调度方案允许一个线程进程的线程保持唯一的计算资源(在这种情况下)更长时间:

但是,如果这种方案中的活动线程试图永远保持活动状态呢?本质上,这就是这里发生的事情。

自旋锁是锁定请求资源的活动等待。线程将坐在那里等待任何其他线程锁定它想要放弃的资源。由于文本表明,硬件情况一次只允许一个活动线程,如果请求的资源被锁定,这意味着它被一个非活动线程锁定。

如果没有抢占,则由线程来决定何时停止执行。因此,当活动线程自旋锁定时,它将永远坐在那里--即所谓的挂起。要停止这一点,用户可能会被迫物理关闭系统,清除缓存/动态内存。

使用抢占式调度线程被实现为时间切片。当在线程中完成进一步工作之前,访问特定资源是必需的,自旋锁 --繁忙的等待--是有意义的。

有了抢占,内核将在指定的时间后自动执行力上下文切换,所以即使只有一个CPU,也不会有挂起。最终,具有资源锁定的线程将获得一些时间并释放其资源。当spinlock线程获得其下一个预定时间时,它将能够锁定资源并继续。

总的来说,这意味着更少的悬念。

然而,spinlock在抢占调度方面仍然会遇到更复杂的问题,例如死锁.当两个线程在保持彼此的资源时,每个线程都是自旋的:

但是,通过对资源锁定请求的内核保护,这种情况通常是可以避免的。

在一个完美的世界中,协同调度与仔细的线程设计可能会导致更快的关键进程的执行。因此,在较老的瘦OSes (如Mac和Windows3.x)中,这是一个常见的方法。然而,随着计算需求的增加,协作调度的缺点越来越难以避免,因此几乎所有的现代操作系统内核都使用抢占式调度器。

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

https://stackoverflow.com/questions/42286440

复制
相关文章

相似问题

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