自旋锁
标签(空格分隔): 操作系统
1. 什么是自旋锁
- 自旋锁是为了实现保护共享资源而提出的一种机制, 其实自旋锁和互斥锁比较类似, 他们都是为了解决对某项资源的互斥使用。无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁。
2. 调度机制
- 对于互斥锁,如果资源已经被占用,资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。
3. 优缺点
- 根据调度机制可以看出自旋锁是一种比较蠢的保护共享资源的方式, 该种方法可能会造成死锁,和过多占用CPU资源的问题.
3.1 死锁
- 试图递归的获得同一个自旋锁一定会造成死锁 , 所以在设计的时候应该避免如下情况: 1. 递归程序不能再持有自旋锁的时候调用自己, 这样就造成了递归调用同一个自旋锁的情况. 2. 如果另外一个进程已经将资源锁定,那么即使其他申请这个资源的进程如何疯狂的"自旋"也不会获得资源(一直通过不断地递归 造成更多的自旋,去等待锁的释放),从而进入死循环.
3.2 过多占用资源
- 过多的占用CPU资源. 如果不加限制的话, 很多的程序在那里循环等待尝试. 因此自旋锁的实现会有一个参数指定最多尝试次数, 如果超过了则会放弃当前的时间片,等待下一次机会.
4. 互斥锁和自旋锁搭配优化
- 自旋锁适用于 任务完成非常快, 锁的持有者更换速度很高的情况下使用 . 互斥锁适用于 任务量比较大, 锁的持有者更滑比较慢的情况. 为了折中处理, 我们可以在实际的互斥锁之前让其先自旋一段时间, 如果超过时间阈值, 则进入睡眠状态 . 这样既兼顾到了锁的切换效率, 又减轻了CPU的压力.