• 自旋锁问题


    1.自旋锁定义

        自旋锁是转为防止多处理器并发而引入的一种锁,它在内核中大量应用与中断处理等部分(对于单处理器,防治中断处理的并发可简单采用关闭中断的方式,即在标志寄存器中关闭/打开中断标志位,不需要自旋锁)。自旋锁与互斥锁的区别:(1)对于互斥所,若资源已被占用,资源申请者只能进入睡眠状态;(2)但自旋锁不会引起调用者睡眠,若自旋锁已被别的执行单元保持,调用者就一直循环查看是否该自旋锁的保持者已释放了锁。

     2.原理

      互斥锁一样,一个执行单元要想访问被自旋锁保护的共享资源,必须先得到锁,在访问完共享资源后,必须释放锁。如果在获取自旋锁时,没有任何执行单元保持该锁,那么将立即得到锁;如果在获取自旋锁时锁已经有保持者,那么获取锁操作将自旋在那里,直到该自旋锁的保持者释放了锁。

    3.存在的问题

    (1)死锁。试图递归地获得自旋锁必然会引起死锁:递归程序的持有实例在第二个实例循环,以试图获得相同自旋锁时,不会释放此自旋锁。在递归程序中使用自旋锁应遵守下列策略:递归程序决不能在持有自旋锁时调用它自己,也决不能在递归调用时试图获得相同的自旋锁。此外如果一个进程已经将资源锁定,那么,即使其它申请这个资源的进程不停地疯狂“自旋”,也无法获得资源,从而进入死循环
    (2)过多占用cpu资源。如果不加限制,由于申请者一直在循环等待,因此自旋锁在锁定的时候,如果不成功,不会睡眠,会持续的尝试,单cpu的时候自旋锁会让其它process动不了. 因此,一般自旋锁实现会有一个参数限定最多持续尝试次数. 超出后, 自旋锁放弃当前time slice. 等下一次机会。
    4.注意的问题:

    如果某工作获得自旋锁,那么他就不能睡眠,因为一旦睡眠了,将没有一个任务可以唤醒它,其他线程想要获得该自旋锁,好的情况是等待很长的时间,最坏的情况是系统进入死锁状态,所以使用自旋锁的原则之一就是:任何拥有该自旋锁的代码都必须是原子的,并且不能睡眠;

    拥有自旋锁的原则二:自旋锁必须在很短的时间内获得,长的锁拥有的时间将会阻止队当前处理器的调度,这就意味着更高优先级的进程不得不等待;

  • 相关阅读:
    SQL 操作结果集 -并集、差集、交集、结果集排序
    bootstrap的css和js
    pandas DataFrame数据转为list
    nodejs 不同请求获取前端传的参数
    微信小程序switch组件尺寸控制
    vue-cli项目部署到服务器
    element-ui table 底部滚动条问题
    简单配色
    浏览器滚动条自定义化
    element table固定表头,表的高度自适应解决方法
  • 原文地址:https://www.cnblogs.com/zhuzhudexiaoshijie/p/3343048.html
Copyright © 2020-2023  润新知