锁和中断的交互

来源:互联网 发布:条码采集器软件 编辑:程序博客网 时间:2024/06/06 04:28
 有没有过这样的尴尬,你早上起来急冲冲的跑进厕所,进行到一半,猛的发现自己原来没有带草纸,人生的悲剧莫过于此。这个时候你却不慌不忙的等着,独自享受着,预谋着等你差不多的时候再把你的室友吵醒。事情总不像想象的那样,突然你的室友捂着肚子,在门口吭吭的敲着,喊着说鳖不住了。这个时候你情何以堪,很2的说自己没带草纸,要室友先把草纸给你。室友估计是要拉肚子了,坚持要你先出来,再把草纸给你,你很无语,这种事情怎么能半途而废,你表示不同意……像刚才这种情况只是暂时“死锁”,终究没有酿成人生悲剧。
   这个例子虽然有点恶心,但是道理很实在。你拥有卫生间却没有草纸,你的室友能够轻易的拿到草纸却不能进入卫生间。如果双方互不相让,会造成暂时的“死锁”。
   死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
   比如伪代码:
  
 在多进程的的程序中不一定会死锁,因为多进程共享资源、相互通信的需要才有可能导致死锁。如果进程间老死不想往来,不可能因为等待资源而死锁,沟通需要成本,得到的可能是危机。不只是进程之间,当考虑中断与进程间的资源共享时,问题变得复杂起来。
 
自旋锁引起的死锁:
 
    自旋锁不会引起调用者睡眠,如果一个执行线程试图获得一个已经被持有的自旋锁,那么线程就会一直进行忙循环,一直等待下去,直到自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。
    自旋锁可能死锁的一般情况:
 
    1 递归使用:
      即在同一个进程中,申请了自旋锁,但是在没有释放之前又再次申请,这种情况必定死锁。
    2 进程得到自旋锁后阻塞,睡眠:
      在获得自旋锁之后调用copy_from_user()、copy_to_ser()、和kmalloc()等有可能引起阻塞的函数。
    3 中断中没有关中断,或着因为申请未释放的自旋锁:
      在中断中使用自旋锁是可以的,应该在进入中断的时候关闭中断,不然中断再次进入的时候,中断处理函数会自旋等待自旋锁可以再次使用。或者在进程中申请了自旋锁,释放前进入中断处理函数,中断处理函数又申请同样的自旋锁,这将导致死锁。
    4 中断与中断下半部共享资源和中断与进程共享资源死锁出现的情况类似。
    5 中断下半部与进程共享资源和中断与进程共享资源死锁出现的情况类似。
 
    自旋锁三种状态:
    自旋锁保持期间是抢占失效的(内核不允许被抢占)。
    1 单CPU且内核不可抢占:
      自旋锁的所有操作都是空。不会引起死锁,内核进程间不存在并发操作进程,进程与中断仍然可能共享数据,存在并发操作,此时内核自旋锁已经失去效果。
    2 单CPU且内核可抢占:
      当获得自旋锁的时候,禁止内核抢占直到释放锁为止。此时可能存在死锁的情况是参考自旋锁可能死锁的一般情况。
     禁止内核抢占并不代表不会进行内核调度,如果在获得自旋锁后阻塞或者主动调度,内核会调度其他进程运行,被调度的内核进程返回用户空间时,会进行用户抢占,此时调用的进程再次申请上次未释放的自旋锁时,会一直自旋。但是内核被禁止抢占,从而造成死锁。
      内核被禁止抢占,但此时中断并没被禁止,内核进程可能因为中断申请自旋锁而死锁。
    3 多CPU且内核可抢占:
      这才是是真正的SMP的情况。当获得自旋锁的时候,禁止内核抢占直到释放锁为止。
 
信号量:  
    自旋锁和信号量都是程序并发操作时解决互斥问题的基本手段。信号量是用于保护临界区的一种常用方法,它的使用方法与自旋锁类似。俩种实现机制不同,死锁的情况也各不相同。
 
与自旋锁相同:
    只用得到信号量的进程才能执行临界区代码。
与自旋锁不同:
    当获取不到自选锁量时,进程不会原地打转而会进入睡眠等待。
信号量死锁的一般情况分析:
    1 递归使用:
      即在同一个进程中,申请了信号量,但是在没有释放之前又再次申请,进程会一直睡眠,与自旋锁一样这种情况必定死锁。
    2 进程得到信号量后阻塞,睡眠:
      由于信号量在获取不到自旋锁后会进入睡眠等待,这种情况不会造成死锁。
    3 中断中申请信号量:
      由于信号量在获取不到自旋锁后会进入睡眠等待,中断处理函数不允许睡眠,如果睡眠,中断将无法返回。
    4 中断下半部申请信号量:
      中断下半部允许睡眠,这种情况不会造成死锁。
    5 俩个进程相互等待资源:
      例如:
          进程1获得信号量A,需要信号量B,在进程1需要信号量B之前进程2获得信号量B,需要信号量A。
     进程1、2因相互等待资源而死锁。
0 0
原创粉丝点击