自旋锁在单处理器单核架构中是否有用?

13 operating-system locking

我对旋转锁的功能感到困惑.

自旋锁用于阻止进程重新调度.但是,在只有一个内核的机器中,使用自旋锁来防止上下文切换是否有用?

bri*_*gge 10

简答:不.

根据http://uw714doc.sco.com/en/man/html.3synch/Intro.3synch.html

不得在单个处理器系统上使用旋转锁.在最好的情况下,单处理器系统上的旋转锁将浪费资源,减慢锁的所有者; 在最坏的情况下,它会使处理器死锁.

来自:http://blogs.microsoft.co.il/blogs/sasha/archive/2008/08/10/practical-concurrency-patterns-spinlock.aspx

在单处理器系统上,不需要自旋锁,因为仅在高IRQL上需要自旋锁同步.在高IRQL(上面的调度IRQL)上不能发生上下文切换,因此代替旋转获取线程可以简单地请求相关IRQL上的中断并返回; 中断将被屏蔽,直到释放线程将IRQL降低到低于请求的IRQL.

对于单处理器系统,内核将忽略旋转计数值,并将其视为零 - 实质上使自旋锁成为无操作.

是的,旋转锁可能很有用,并可提高某些操作的效率.但是,通常您应该从互斥锁开始,如果分析显示它是瓶颈,您可能需要考虑自旋锁.


And*_*ack 10

你的观察是好的:在单处理器系统上,没有必要等待资源,因为你也可以尽早而不是更快地切换线程.互斥体和信号量就是这样做的.

在多处理器系统上,另一个处理器上的线程可以在没有上下文切换的情况下释放锁.自旋锁是有用的,如果你不希望等待很长时间,因为它可能更快只是挂起,直到另一个线程解锁的东西.如果你在互斥上睡觉,你基本上可以确定一些重要的死时间,然后才能重新安排.

但是,在内核代码中,情况发生了变化:中断处理程序需要访问与内核其余部分共享的资源,但它们无法休眠.互斥锁会让内核进入休眠状态,所以你不能使用它们,但是自旋锁也没用,因为没有任何东西会中断单处理器上的中断处理程序(好吧,也许是另一个中断,但这很可怕).

在一个内核,那么,自旋锁的中断处理程序编译成一个空操作.他们完全被遗忘了,就像你想象的那样.同时,为了防止竞争,内核其余部分中的自旋锁实际旋转某些内容之前禁用中断(因为可以调度内核任务).如果它们与中断处理程序共享代码,则这些代码只需要自旋锁(而不是互斥锁).

一般来说,你是对的:如果你有互斥锁,自旋锁在单处理器上真的没有多大意义,因为互斥锁浪费的时间更少.