Geo*_* Li 3 cpu multithreading synchronization mutex multiprocessing
在阅读《操作系统三篇简单文章》时,我发现了以下句子:
\n\n\n\n\n“为了在单个处理器上正常工作,它需要一个抢占式调度程序(即,通过计时器中断线程,以便不时运行不同的线程)。如果没有抢占,自旋锁don\xe2\x80\x99 在单个 CPU 上没有多大意义,因为在 CPU 上旋转的线程永远不会放弃它。”
\n
为什么即使单CPU支持多线程,单CPU上旋转的线程也永远不会放弃它?是不是因为自旋锁在这种情况下浪费了太多的CPU资源?CPU核心数量如何影响互斥锁和自旋锁等不同锁的性能?
\n在单个 CPU、单核 CPU 上,您仍然可以进行线程 多任务处理(多线程),但需要注意的是,由于缺乏多个执行单元,通常一次只能执行一个线程。没有多个执行单元(硬件多线程),硬件依赖于“软件多线程”内核(低级操作系统软件)定义的
抢占是一种策略,涉及更积极地管理(可以这么说)沿着单个路径的多个执行流,通常部分通过使用基于定时器的中断来实现。抢占的反面——协作调度——采用更加自由放任的方法,让活动线程来发出完成信号。
因此,协作调度方案允许一个线程进程的线程保留唯一的计算资源(在本例中)更长时间:
但是,如果这种方案中的活动线程试图永远保持活动状态怎么办?本质上,这就是这里发生的事情。
自旋锁是锁定所请求资源的主动等待。该线程将只是坐在那里等待任何其他线程锁定它想要放弃的资源。正如文本所示,硬件情况一次只允许一个活动线程,如果请求的资源被锁定,则意味着它被不活动线程锁定。
如果没有抢占,则由线程决定何时停止执行。因此,当活动线程自旋锁时,它将永远坐在那里——这就是所谓的挂起。为了阻止这种情况,用户可能会被迫物理关闭系统以清除缓存/动态内存。
通过抢占式调度,线程被实现为时间片。当在线程中完成进一步工作之前需要访问特定资源时,自旋锁(繁忙等待)就有意义。
通过抢占,内核将在指定的时间后自动强制上下文切换,因此即使使用单个 CPU,也不会出现挂起。最终,拥有资源锁的线程将获得一些时间并释放其资源。当自旋锁线程到达下一个计划时间时,它将能够锁定资源并继续。
总的来说,这意味着更少的挂起。
然而,自旋锁仍然会遇到抢占式调度的更复杂问题,例如死锁......当两个线程各自自旋锁并同时持有彼此的资源时:
然而,这种情况通常可以通过资源锁定请求的内核保护措施来避免。
在完美的世界中,具有仔细线程设计的协作调度可能会导致关键进程的执行速度更快一些。因此,它是 Mac OS 和 Windows 3.x 等精简旧操作系统中的常见方法。然而,随着计算需求的增加,避免协作调度的缺点变得越来越困难,因此几乎所有现代操作系统内核都使用抢占式调度程序。
| 归档时间: |
|
| 查看次数: |
2207 次 |
| 最近记录: |