Posted on 2013-10-29 22:40
sin 阅读(1452)
评论(0) 编辑 收藏 引用 所属分类:
Linux编程
自旋锁(spin lock)应用在多处理器环境中。如果内核控制路径发现自旋锁“开着”,就获取锁并继续自己的执行。相反,如果内核控制路径发现锁由运行在另一个CPU上的内核控制路径“锁 着”,就在周围“旋转”,反复执行一条紧凑的循环指令,直到锁被释放。自旋锁的循环指令表示“忙等”。即使等待的内核控制路径无事可做(除了浪费时间),它也在CPU上保持运行。不过,自旋锁通常非常方便,因为很多内核资源只锁1毫秒的时间片段;所以说,等待自旋锁的释放不会消耗太多CPU的时间。
一般来说,由自旋锁所保护的每个临界区都是禁止内核抢占的。在单处理器系统上,这种锁本身并不起锁的作用,自旋锁技术仅仅是用来禁止或启用内核抢 占。请注意,在自旋锁忙等期间,因为并没有进入临界区,所以内核抢占还是有效的,因此,等待自旋锁释放的进程有可能被更高优先级的所取代。这种设计是合理 的,因为不能因为占用CPU太久而使系统死锁。
互斥锁(mutex lock)的实现,实际上就是一把锁维护了一个等待队列和一个引用计数器,当获取锁之前,先对引用计数器减1操作,如果为非负,则可以获取锁进入临界区。否则将该任务设为不可中断状态(uninterruptible),挂在该等待对列上。获取锁的任务从临界区退出后,计数器加1操作,唤醒(wake up)等待队列上的被挂起进程。