浅析linux内核中信号量与自旋锁

自旋锁:

自旋锁不能递归;自旋锁可以用在中断上下文(信号量不可以,因为可能睡眠),但是在中断上下文中获取自旋锁之前要先禁用本地中断;自旋锁的核心要求是:拥有自旋锁的代码必须不能睡眠,要一直持有CPU直到释放自旋锁。

信号量:

信号量和读写信号量适合于保持时间较长的情况,它们会导致调用者睡眠,因此只能在进程上下文使用,而自旋锁适合于保持时间非常短的情况,它可以在任何上下文使用。如果被保护的共享资源只在进程上下文访问,使用信号量保护该共享资源非常合适,如果对共享资源的访问时间非常短,自旋锁也可以。但是如果被保护的共享资源需要在中断上下文访问(包括底半部即中断处理句柄和顶半部即软中断),就必须使用自旋锁。自旋锁保持期间是抢占失效的,而信号量和读写信号量保持期间是可以被抢占的。自旋锁只有在内核可抢占或SMP(多处理器)的情况下才真正需要,在单CPU且不可抢占的内核下,自旋锁的所有操作都是空操作。
 

总结:

信号量适用于长时间片段,可能会睡眠(挂起调度)  所以只能用在进程上下文,不能用在中断上下文。
自旋锁使用于短时间片段  不会睡眠(挂起调度)抱着cpu不放,  用在中断上下文  但是必须先关闭本地中断,否则很可能因为
获取不到自旋锁又抱着cpu不让别人持有而释放自旋锁从而陷入死锁。

信号量可以用的前提下尽量用信号量,万不得已(中断中)使用自旋锁,短时间片段比较适合自旋锁,调度(进程之间的切换)本身
占用时间,自旋等待的时间很短时就没必要调度了,这时选用自旋锁死抱cpu不放比较好。

猜你喜欢

转载自blog.csdn.net/Wenlong_L/article/details/82013463