zoukankan      html  css  js  c++  java
  • 自旋锁

    自旋锁

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


    1. 什么是自旋锁

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

    2. 调度机制

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

    3. 优缺点

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

    3.1 死锁

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

    3.2 过多占用资源

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

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

    • 自旋锁适用于 任务完成非常快, 锁的持有者更换速度很高的情况下使用 . 互斥锁适用于 任务量比较大, 锁的持有者更滑比较慢的情况. 为了折中处理, 我们可以在实际的互斥锁之前让其先自旋一段时间, 如果超过时间阈值, 则进入睡眠状态 . 这样既兼顾到了锁的切换效率, 又减轻了CPU的压力.
  • 相关阅读:
    Leetcode 811. Subdomain Visit Count
    Leetcode 70. Climbing Stairs
    Leetcode 509. Fibonacci Number
    Leetcode 771. Jewels and Stones
    Leetcode 217. Contains Duplicate
    MYSQL安装第三步报错
    .net 开发WEB程序
    JDK版本问题
    打开ECLIPSE 报failed to load the jni shared library
    ANSI_NULLS SQL语句
  • 原文地址:https://www.cnblogs.com/A-FM/p/11440650.html
Copyright © 2011-2022 走看看