Linux内核中的线程死锁

来源:互联网 发布:泰坦尼克号 知乎 编辑:程序博客网 时间:2024/05/20 16:09

一、死锁的概念

    1.什么是死锁:

      死锁 (deadlocks): 是指两个或两个以上的进程(线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程(线程)称为死锁进程(线程)。 由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程(线程)在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。

   2.死锁的常见表现:

     死锁不仅会发生多个进程中,也会发生在一个进程中。一种交叉持锁死锁的情形,此时执行程序中两个或多个线程发生永久堵塞(等待),每个线程都在等待被其它线程占用并堵塞了的资源。例如,如果线程 1 锁住了记录 A 并等待记录 B,而线程 2 锁住了记录 B 并等待记录 A,这样两个线程就发生了死锁现象。在计算机系统中 , 如果系统的资源分配策略不当,更常见的可能是程序员写的程序有错误等,则会导致进程因竞争资源不当而产生死锁的现象。

   (1)多进程死锁:有进程A,进程B,进程A拥有资源1,需要请求正在被进程B占有的资源2。而进程B拥有资源2,请求正在被进程A战友的资源1。两个进程都在等待对方释放资源后请求该资源,而相互僵持,陷入死锁。
   (2)单进程死锁:进程A拥有资源1,而它又在请求资源1,而它所请求的资源1必须等待该资源使用完毕得到释放后才可被请求。这样,就陷入了自己的死锁。

二、产生死锁的原因及条件

   1.原因:

   (1)进程推进顺序不当造成死锁。
   (2)竞争不可抢占性资源引起死锁。
   (3)竞争可消耗性资源引起死锁。

   2.产生死锁的四个必要条件:

   (1) 互斥条件:一个资源每次只能被一个进程(线程)使用。
   (2) 请求与保持条件:一个进程(线程)因请求资源而阻塞时,对已获得的资源保持不放。
   (3) 不剥夺条件 : 此进程(线程)已获得的资源,在末使用完之前,不能强行剥夺。
   (4) 循环等待条件 : 多个进程(线程)之间形成一种头尾相接的循环等待资源关系。

三、如何避免死锁

   1..预防死锁:这是一种较简单和直观的方法。该方法是通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或几个,来预防发生死锁。但由于所施加的限制条件往往太严格,因而会导致系统资源利用率和系统吞吐量低。

   2.避免死锁:该方法同样是属于事先预防的策略,但它并不须事先采取各种限制措施去破坏产生死锁的四个必要条件,而是在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。这种方法只需事先施加较弱的限制条件,便可获得较高的资源利用率及系统吞吐量,但在事实上有一定的难度。目前在较完善的系统中常用此方法来避免发生死锁。

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

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

四、常见算法与原理

   银行家算法:

      避免死锁算法中最有代表性的算法是Dijkstra E.W 于1968年提出的银行家算法:

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


原创粉丝点击