Multithreading spinlock如何防止进程中断?

Multithreading spinlock如何防止进程中断?,multithreading,multiprocessing,locking,spinlock,mutual-exclusion,Multithreading,Multiprocessing,Locking,Spinlock,Mutual Exclusion,我在这个网站上读到一个答案,说旋转锁通过上下文切换减少了开销,然后我读了一篇与此相关的教科书声明: 自旋锁使忙碌的等待程序不会被中断 我的问题是关于题目 由于本书使用while循环来表示自旋锁的自旋部分的实现,下面是我试图解释自己的理由 这听起来像是如果有一个程序有一个繁忙的等待while循环,那么所有其他程序(进程)将不会永远执行,但这不会导致多道程序设计环境崩溃,因为其他进程在经过一定的时间间隔后无法再执行吗?但我记得操作系统会阻止任何进程永远主宰CPU吗 或者这在大多数体系结构中都是正确的

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

自旋锁使忙碌的等待程序不会被中断

我的问题是关于题目

由于本书使用while循环来表示自旋锁的自旋部分的实现,下面是我试图解释自己的理由

这听起来像是如果有一个程序有一个繁忙的等待while循环,那么所有其他程序(进程)将不会永远执行,但这不会导致多道程序设计环境崩溃,因为其他进程在经过一定的时间间隔后无法再执行吗?但我记得操作系统会阻止任何进程永远主宰CPU吗

或者这在大多数体系结构中都是正确的,所以不建议这样做,因为多道程序设计的程度会降低,或者你必须知道它会停止多久?对不起,我的问题含糊不清,但我键入的内容与书中所述完全相同

关于我的困惑的更多细节:我考虑一个给定的while循环

while (this == true);
只不过是扩大版而已

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

那么,为什么它不会在上面的某个
(*)
步骤被中断,原因是进程的时间间隔结束,并且从就绪队列中选择了另一个进程?

自旋锁确实可以防止进程被其他进程中断。这种预防的实现是特定于操作系统的:因为操作系统本身执行进程调度,所以它能够将进程标记为“无法重新调度”

但您会问,对于其他进程来说,将其标记为不可中断是否公平。实际上,“自旋锁”有两个(至少)概念:一个用于内核空间线程,另一个用于用户空间线程:

  • 内核进程作为操作系统内核的一部分,信任自己:如果一个进程获得自旋锁,它希望在短时间内释放自旋锁。一旦释放自旋锁,该过程就不再被视为不可中断,并且可以从中切换

    大多数描述自旋锁的书籍都讨论内核(可信)进程

  • 用户相反,进程不“信任”自己。这就是为什么不为用户进程提供“真正”的自旋锁(使进程无限期不间断)的原因。操作系统最多只能提供一个自旋锁和互斥锁的混合版本:在短时间内,试图获取自旋锁的进程实际上是不可中断的。但是,如果在进程获取自旋锁之前时间已过,则进程将移动到等待状态,允许其他进程在同一内核上运行。因此提供了“公平”



  • 实际上,“true”自旋锁使进程不仅在等待时是不可中断的,而且在保持自旋锁时也是不可中断的。这是避免死锁所必需的。这适用于内核进程(信任自己)。对于用户进程,操作系统可能会给进程一些(也很短)的不间断状态时间,直到它释放自旋锁为止。如果在释放spinlock之前时间已过,进程将再次变得可中断。

    那么,您真正的问题是“spinlock如何防止进程被中断?”,不是吗?顺便说一句,表达式
    while(this==true)表示一个旋转(忙等待),但不是一个自旋锁,它还提供了一种防止进程切换的保护。可以将这种自旋锁看作互斥锁。由互斥锁提供的关键部分可以自由中断。那么问题是其他线程不能进入关键部分?感谢您的好意,用户空间中的自旋锁和互斥锁的主要目的是提供具有独占访问权限的关键部分。这个方面负责程序的正确性,自旋锁和互斥锁都能很好地执行这个任务,并且没有限制。作为另一个目的,自旋锁尝试在试图获取当前由另一个进程持有的自旋锁的情况下降低与进程切换相关的CPU成本。此任务不会影响程序的正确性。“只能计划运行一个线程?”-不必为true。只有一个螺纹可以继续进行临界段。其他线程可能处于等待状态或忙等待状态。当某个关键部分被其他线程占用时,任何进程都无法进入该部分。属性“hold”与持有者当前是否在运行无关。