自旋锁 本来就只是一个很简单的同步机制
,在SMP
之前根本就没这个东西,一切
都是Event
之类的同步机制,这类同步
机制都有一个共性就是 一旦资源被占用
都会产生任务切换,
任务切换涉及很多东西的(保存原来的上下文,按调度算法选择
新的任务,恢
复
新任务的上下文,还有就是要修改cr3寄存器会导致cache失效)这些都是需要大量时间的,因此用Event之类来同步一旦涉及到阻塞代价是十分昂贵的
比如 我用一个Event 来控制 2行代码的原子操作 这个时候一个CPU正在执行这个代码 另一个CPU也要进入 另一个CPU就会产生任务切换 为了短短的两行代码 就进行任务切换执行大量的代码 对系统性能不利 另一个CPU还不如 直接有条件的死循环 等待那个CPU把那两行代码执行完
比如 我用一个Event 来控制 2行代码的原子操作 这个时候一个CPU正在执行这个代码 另一个CPU也要进入 另一个CPU就会产生任务切换 为了短短的两行代码 就进行任务切换执行大量的代码 对系统性能不利 另一个CPU还不如 直接有条件的死循环 等待那个CPU把那两行代码执行完
这也就是为什么自旋锁 要调整运行级别 因为另一个CPU可能在死循环不干活 自己必须快点执行完 要快点执行完 就必须保证自己的原子性 因此提高权限关闭中断是必须的
自旋锁比较适用于锁使用者保持锁时间比较短的情况。正是由于自旋锁使用者一般保持锁时间非常短,因此选择自旋而不是睡眠是非常必要的,自旋锁的效率远高于互斥锁。 信号量和读写信号量适合于保持时间较长的情况,它们会导致调用者睡眠,因此只能在 进程上下文使用,而自旋锁适合于保持时间非常短的情况,它可以在任何上下文使用。如果被保护的共享资源只在进程上下文访问,使用信号量保护该共享资源非常合适,如果对共享资源的访问时间非常短,自旋锁也可以。但是如果被保护的共享资源需要在中断上下文访问(包括底半部即 中断处理句柄和顶半部即 软中断),就必须使用自旋锁。自旋锁保持期间是抢占失效的,而信号量和读写信号量保持期间是可以被抢占的。自旋锁只有在 内核可抢占或 SMP(多处理器)的情况下才真正需要,在单CPU且不可抢占的内核下,自旋锁的所有操作都是空操作。
作者:linxer。 『加壳与脱壳』 版主