我对自旋锁的功能感到困惑。
自旋锁用于阻止进程重新调度。
然而,在只有一个核心的机器上,使用自旋锁有用吗?
防止上下文切换?
您的观察结果很好:在单处理器系统上,旋转等待资源是没有意义的,因为您最好尽早切换线程。互斥体和信号量正是这样做的。
在多处理器系统上,另一个处理器上的线程可以释放锁,而无需进行上下文切换。那么,如果您不希望等待很长时间,那么自旋锁可能会很有用,因为只是等待其他线程解锁该东西可能会更快。如果您在互斥体上睡觉,那么基本上可以保证在重新安排之前会有一些重要的死区时间。
然而,在内核代码中,情况发生了变化:中断处理程序需要访问与内核其余部分共享的资源,但它们无法休眠。互斥锁将使内核进入睡眠状态,因此您无法使用它们,但自旋锁也没有什么用处,因为没有任何东西会中断单处理器上的中断处理程序(好吧,也许是另一个中断,但这很可怕)。
那么,在内核中,自旋锁within中断处理程序编译为无操作。正如您可能想象的那样,它们被完全忽略了。同时,为了防止竞争,自旋锁在内核的其余部分在中断实际旋转之前禁用中断(因为可以调度内核任务)。如果这些代码与中断处理程序共享代码,则仅需要自旋锁(而不是互斥锁)。
总的来说,你是对的:自旋锁在单处理器上确实没有多大意义如果你有互斥锁,因为互斥体浪费的时间更少。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)