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

    1.自旋锁定义

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

     2.原理

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

    3.存在的问题

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

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

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

  • 相关阅读:
    Ansible学习 Playbooks_1
    Ansible学习 ad-hoc命令
    Ansible学习 Patterns
    【转】对于SQL SERVER 事务日志已满问题整理
    【转】Apache配置正向代理与反向代理
    【转】Python的IDE和破解Code——pycharm
    【转】SQLServer 数据库变成单个用户后无法访问问题的解决方法
    【转】 尝试在数据库5 中提取逻辑页() 失败。该逻辑页属于分配单元xxx而非xxx
    【Oracle】Oracle版本导入导出问题
    【Java】eclipse导入war包二次开发
  • 原文地址:https://www.cnblogs.com/zhuzhudexiaoshijie/p/3343048.html
Copyright © 2011-2022 走看看