Linux---死锁

什么是死锁

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

死锁产生的四个条件

  1. 互斥条件:指进程对所分配的资源进行排他性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其他进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。

            例子:我正在玩电脑,你也想玩,但我就不给你,那你只能等着了,有本事打我呀
    
  2. 请求和保持条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程阻塞,但又对自己已获得的其他资源保持不放。

             例子:我突然不想玩电脑了,想看电视,你把电视给占了,那我只好等着了(天道有轮回,苍天绕过谁),
             我又不想把电脑交给其他人,万一我一会改变主意又想玩电脑了呢
    
  3. 不可剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放

             例子:我在玩游戏的时候谁也抢不走电脑,就是这么硬!
    
  4. 环路等待条件:指在发生死锁时,必然存在一个进程–资源的环形链,即进程集合{P0,P1,P2……Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源

             例子:我抱着电脑等你的电视,你抱着电视等着上厕所,上厕所的弟弟又说我如果不把电脑给他,他就不出来,
             我就不给,你能怎样,有本事你一辈子都别出来(把他当做进程的话,他确实有这本事)
             好麽,咱们三个就这么耗着,等着老爸(操作系统)来解决吧
    

只有这四个条件都满足了,才会产生死锁

如何避免死锁

系统对进程发出的每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源;如果分配后系统可能发生死锁,则不予分配,否则予以分配。这是一种保证系统不进入死锁状态的动态策略。

        例子: 此时电脑空着,你想玩了,但是爸爸(操作系统)知道之前你和弟弟妹妹抢电脑电视的事了,
              所以爸爸对你进行了考察,考察通过,电脑还给你玩,如果没通过,那你就别想玩了,对弟弟妹妹也是
              如此,都得考察

预防死锁

简单理解就是破坏任意一个产生死锁的条件即可,因为死锁产生是需要四个条件同时满足才行,当死锁产生后,必须通过外力条件才能解开死锁,比如直接杀死死锁中的进程等等粗暴的方法

在这里介绍两个预防死锁的算法,这两种算法也和生活中的一些情况息息相关,尤其第二种

  • 有序资源分配法

    • 这种算法资源按某种规则系统中的所有资源统一编号(例如打印机为1、磁带机为2、磁盘为3、等等),申请时必须以上升的次序。系统要求申请进程:
      • 1、对它所必须使用的而且属于同一类的所有资源,必须一次申请完;
      • 2、在申请不同类资源时,必须按各类设备的编号依次申请。例如:进程PA,使用资源的顺序是R1,R2; 进程PB,使用资源的顺序是R2,R1;若采用动态分配有可能形成环路条件,造成死锁。
    • 采用有序资源分配法:R1的编号为1,R2的编号为2;
    • PA:申请次序应是:R1,R2
      PB:申请次序应是:R1,R2

    这样就破坏了环路条件,避免了死锁的发生

  • 银行家算法

    • 避免死锁算法中最有代表性的算法是Dijkstra E.W 于1968年提出的银行家算法:
    • 银行家算法是避免死锁的一种重要方法,防止死锁的机构只能确保上述四个条件之一不出现,则系统就不会发生死锁。通过这个算法可以用来解决生活中的实际问题,如银行贷款等。
    • 程序实现思路银行家算法顾名思义是来源于银行的借贷业务,一定数量的本金要应多个客户的借贷周转,为了防止银行家资金无法周转而倒闭,对每一笔贷款,必须考察其是否能限期归还。在操作系统中研究资源分配策略时也有类似问题,系统中有限的资源要供多个进程使用,必须保证得到的资源的进程能在有限的时间内归还资源,以供其他进程使用资源。如果资源分配不得到就会发生进程循环等待资源,则进程都无法继续执行下去的死锁现象。
    • 把一个进程需要和已占有资源的情况记录在进程控制中,假定进程控制块PCB其中“状态”有就绪态、等待态和完成态。当进程在处于等待态时,表示系统不能满足该进程当前的资源申请。“资源需求总量”表示进程在整个执行过程中总共要申请的资源量。显然,每个进程的资源需求总量不能超过系统拥有的资源总数, 银行算法进行资源分配可以避免死锁。

死锁检测和解除

  1. 先检测:这种方法并不须事先采取任何限制性措施,也不必检查系统是否已经进入不安全区,此方法允许系统在运行过程中发生死锁。但可通过系统所设置的检测机构,及时地检测出死锁的发生,并精确地确定与死锁有关的进程和资源。检测方法包括定时检测、效率低时检测、进程等待时检测等。
  2. 然后解除死锁:采取适当措施,从系统中将已发生的死锁清除掉。

这是与检测死锁相配套的一种措施。当检测到系统中已发生死锁时,须将进程从死锁状态中解脱出来。常用的实施方法是撤销或挂起一些进程,以便回收一些资源,再将这些资源分配给已处于阻塞状态的进程,使之转为就绪状态,以继续运行。死锁的检测和解除措施,有可能使系统获得较好的资源利用率和吞吐量,但在实现上难度也最大。

猜你喜欢

转载自blog.csdn.net/it_xiaoye/article/details/80076661