自旋锁

Posted a-fm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自旋锁相关的知识,希望对你有一定的参考价值。

自旋锁

标签(空格分隔): 操作系统


1. 什么是自旋锁

  • 自旋锁是为了实现保护共享资源而提出的一种机制, 其实自旋锁和互斥锁比较类似, 他们都是为了解决对某项资源的互斥使用。无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁。

2. 调度机制

  • 对于互斥锁,如果资源已经被占用,资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。

3. 优缺点

  • 根据调度机制可以看出自旋锁是一种比较蠢的保护共享资源的方式, 该种方法可能会造成死锁,和过多占用CPU资源的问题.

3.1 死锁

  • 试图递归的获得同一个自旋锁一定会造成死锁 , 所以在设计的时候应该避免如下情况: 1. 递归程序不能再持有自旋锁的时候调用自己, 这样就造成了递归调用同一个自旋锁的情况. 2. 如果另外一个进程已经将资源锁定,那么即使其他申请这个资源的进程如何疯狂的"自旋"也不会获得资源(一直通过不断地递归 造成更多的自旋,去等待锁的释放),从而进入死循环.

3.2 过多占用资源

  • 过多的占用CPU资源. 如果不加限制的话, 很多的程序在那里循环等待尝试. 因此自旋锁的实现会有一个参数指定最多尝试次数, 如果超过了则会放弃当前的时间片,等待下一次机会.

4. 互斥锁和自旋锁搭配优化

  • 自旋锁适用于 任务完成非常快, 锁的持有者更换速度很高的情况下使用 . 互斥锁适用于 任务量比较大, 锁的持有者更滑比较慢的情况. 为了折中处理, 我们可以在实际的互斥锁之前让其先自旋一段时间, 如果超过时间阈值, 则进入睡眠状态 . 这样既兼顾到了锁的切换效率, 又减轻了CPU的压力.

以上是关于自旋锁的主要内容,如果未能解决你的问题,请参考以下文章

自旋锁

自旋锁原理及java自旋锁

自旋锁spinlock解析

五自旋锁(spinlock)

自旋锁

自旋锁