• 自旋锁


    自旋锁

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


    1. 什么是自旋锁

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

    2. 调度机制

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

    3. 优缺点

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

    3.1 死锁

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

    3.2 过多占用资源

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

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

    • 自旋锁适用于 任务完成非常快, 锁的持有者更换速度很高的情况下使用 . 互斥锁适用于 任务量比较大, 锁的持有者更滑比较慢的情况. 为了折中处理, 我们可以在实际的互斥锁之前让其先自旋一段时间, 如果超过时间阈值, 则进入睡眠状态 . 这样既兼顾到了锁的切换效率, 又减轻了CPU的压力.
  • 相关阅读:
    无废话设计模式(7)结构型模式--装饰模式
    无废话设计模式(6) 结构型模式--适配器模式
    无废话设计模式(5)结构型模式--桥接模式
    无废话设计模式(4)原型模式
    Java进阶--Map集合
    Java进阶--List接口
    Java进阶--集合泛型综合应用案例(斗地主)
    Java进阶--泛型
    Java进阶--Iterator迭代器
    Java进阶--Collection集合
  • 原文地址:https://www.cnblogs.com/A-FM/p/11440650.html
Copyright © 2020-2023  润新知