自旋锁如何防止进程被中断?

How spinlock prevents the process to be interrupted?

我在这个网站上读到一个答案说 spin-lock 减少上下文切换的开销,然后我读了一个与此相关的教科书声明:

Spin-lock makes a busy waiting program not be interrupted.

我的问题在标题上

由于本书使用 while-loop 表示 spin 部分 spin-lock 的实现,以下是我试图用这种考虑来解释自己的推理。

这听起来好像如果有一个程序忙于等待 while 循环,那么所有其他程序(进程)将不会永远执行,但这不会使多道程序环境崩溃,因为其他进程过了一定时间就不能再执行了?但我记得 OS 会阻止任何进程永远控制 CPU?

或者这在大多数体系结构中通常都是正确的,因此不建议这样做,因为多道程序的程度会降低,或者必须准确知道它会停止多长时间?对不起,我的问题含糊不清,但我输入的内容与书中所述完全相同。

有关我的困惑的更多详细信息:我认为对于给定的 while 循环

while (this == true);

无非是加长版

if (this == true);
if (this == true);
if (this == true);
...
...    
if (this == true); // (*)
...            
...
if (this == true);
...

那么为什么它不会在上面的某些 (*) 步骤中被中断,出于某种原因,比如进程的时间间隔结束,并且从就绪 queue 中选择另一个进程?

自旋锁真正防止进程被其他进程中断。这种预防的实现是 OS 特定的:由于 OS 本身执行进程调度,它能够将进程标记为“无法重新调度”。

但是你问其他进程把那个进程标记为不可中断是否公平。实际上,“自旋锁”有两种(至少)概念:一种用于内核 space 线程,一种用于用户-space 线程:

  1. 内核进程,作为OS内核的一部分,信任自己:如果一个进程获取自旋锁,它希望在短时间内释放它。一旦自旋锁被释放,进程就不再被视为不可中断,可以从中切换。

    大多数描述自旋锁的书籍都在谈论内核(受信任的)进程。

  2. User 进程,相反,不“信任”自己。这就是为什么 没有 为用户进程提供“真正的”自旋锁,它使进程在 无限时间 内不间断。至多,OS 提供自旋锁和互斥锁的 混合 版本:在短时间内,试图获取自旋锁的进程实际上呈现为不可中断。但是如果在进程获取自旋锁之前时间到期,则进程被移动到waiting状态,允许其他进程在同一个核心上运行。所以提供了“公平”。


实际上,“真正的”自旋锁不仅在等待时而且 持有 自旋锁时都使进程不可中断。它是避免死锁所必需的。这适用于内核进程(信任自己)。对于用户进程,OS 可能会为进程提供一些(也很短)不间断状态时间,直到它释放自旋锁。如果在释放自旋锁之前时间到期,进程将再次变为可中断。