我在此站点上读到一个答案,说自旋锁减少了上下文切换的开销,然后我阅读了与此相关的教科书声明:
自旋锁使繁忙的等待程序不被中断。
我的问题是标题。
由于该书使用while循环来表示自旋锁的 spin 部分的实现,因此以下是我出于这种考虑而尝试解释的理由
这听起来像是如果有一个程序有一个繁忙的while循环等待,那么所有其他程序(进程)将不会永远执行,但是这不会使多程序环境崩溃,因为其他进程无法一定时间间隔过去后,需要更长的执行时间?但是我记得操作系统会阻止任何进程永远控制CPU吗?
或者这在大多数体系结构中通常是正确的,因此不建议这样做,因为多重编程的程度会降低,或者人们必须确切知道它将停止多长时间?抱歉,您的问题含糊不清,但我输入的内容与本书所述完全相同。
有关我的困惑的更多详细信息:我认为对于给定的while循环
while (this == true);
仅是扩展版本
if (this == true);
if (this == true);
if (this == true);
...
...
if (this == true); // (*)
...
...
if (this == true);
...
那么为什么由于某个原因(例如该进程的时间间隔结束并且从就绪队列中选择另一个进程)而不会在上面的(*)
步骤中中断它?
答案 0 :(得分:1)
自旋锁确实可以防止该进程被其他进程中断。这种预防措施的实现是特定于OS的:由于OS本身执行进程调度,因此能够将进程标记为“无法重新调度”。
但是您会问其他过程将其标记为不间断是否公平。实际上,有2个(至少)“自旋锁”概念:一个用于内核空间线程,一个用于用户空间线程:
内核进程本身信任:如果一个进程获得了自旋锁,它希望在短时间内将其释放。自旋锁释放后,该过程将不再被视为不间断的,可以从此切换。
大多数描述自旋锁的书都谈论内核(受信任的)过程。
用户进程不“信任”自己。这就是为什么未为用户进程提供“真”自旋锁的原因,该自旋锁在无限时间内使进程不间断。操作系统最多只能提供混合版本的自旋锁和互斥锁:在很短的时间内,试图抓住自旋锁的过程实际上是不间断的。但是,如果在进程获得自旋锁之前时间到了,进程将移至正在等待状态,从而允许其他进程在同一内核上运行。因此提供了“公平”。
实际上,“ true”自旋锁不仅在等待期间而且在保持自旋锁的过程中使该过程不间断。避免死锁是必需的。这适用于内核进程(信任自己)。对于用户进程,OS可以为进程分配一些(也很短的)不间断状态时间,直到它释放自旋锁为止。如果自旋锁释放之前的时间到期,该过程将再次被中断。