死锁

  死锁并发


 

  死锁能够被定义为一组竞争系统资源或相互通讯的进程间相互的“永久”阻塞。当一组进程中的全部进程都在等待一个事件(等待请求资源的释放),而只有在进程集合中的其余阻塞的进程才能够触发该事件,这时就成一组进程死锁。spa

  由于没有事件能够触发,故死锁是永久性的。操作系统

  • 通常状况下,若是同一个线程前后两次调用lock,在第二次调用时,因为锁已经被占用,该线程会挂起等待别的线程释放锁,然而锁正是被本身占用着的,该线程又被挂起而没有机会释放锁,所以 就永远处于挂起等待状态了,这叫作死锁(Deadlock)。
  • 另外一种典型的死锁情形是这样:线程A获 得了锁1,线程B得到了锁2,这时线程A调用lock试图得到锁2,结果是须要挂起等待线程B释放 锁2,而这时线程B也调用lock试图得到锁1,结果是须要挂起等待线程A释放锁1,因而线程A和B都 永远处于挂起状态了。

不难想象,若是涉及到更多的线程和更多的锁,有没有可能死锁的问题将会 变得复杂和难以判断。线程

  发生死锁的必要条件blog


 

一、互斥。一次只有一个进程可使用资源,其它进程不能访问已分配给其余进程的资源。进程

二、占用且等待。当一个进程在等待分配获得其它资源时,其继续占有已分配获得的资源。事件

三、非抢占。不能强行抢占进程中已占用的资源。资源

四、循环等待。存在一个封闭的进程链,使得每一个资源至少占有此链中下一个进程所须要的一个资源。循环

  前三个条件是死锁产生的必要条件但不是充分条件。第四个条件其实是前三个条件的潜在结果,即假设前三个条件存在,可能发生的一系列事件会致使不可解的循环等待。这个不可解的循环等待实际上就是死锁的定义。条件4中列出的循环等待之因此是不可解的,是由于有前三个条件的存在。请求

 

  如何预防死锁


 

一种是间接的预防死锁,即防止前三个必要条件中任意一个的发生;另外一种是直接预防死锁,即防止循环等待的发生。

  互斥条件不能禁止。

  为防止占有且等待的条件,能够要求进程一次性地请求全部须要的资源,而且阻塞这个进程直到全部的请求都同时知足。这个方法比较低效,并且若是分配给一个进程资源,但因为不足所有资源,因此分配给这个进程的资源可能在至关长的一段时间内都处于不可用状态,且在此期间,它们不能被其余进程使用。另外一方面进程可能没法预知它须要的全部资源。

  预防非抢占条件。若是占有某些资源的一个进程进一步资源请求被拒绝,则该进程必须释放它最初占用的资源,若是有必要,可再次请求这些资源和另外的资源。或者,若是一个进程请求被另外一个进程占用的一个资源,则操做系统能够抢占另外一个进程,要求它释放资源。

  循环等待条件能够经过定义资源类型的线形顺序来预防。若是一个进程已经分配到R类型的资源,那么他接下来请求的资源只能是那些排在R类型以后的资源类型。

这些均可能致使低效的资源使用和低效的进程执行。

 

  如何规避死锁


 

规避死锁与预防死锁相比,它容许三个必要条件,但经过明智的选择,确保永远不会抵达死锁点,所以,死锁避免比死锁预防容许更多的并发。

  若是一个进程的请求会致使死锁,则不会启动此进程。

  若是一个进程增长资源的请求会致使死锁,则不容许此分配。

 

  产生死锁的缘由


  •   由于系统资源不足。
  •  进程的推动的顺序不当。
  •  资源分配不当。

 若是系统资源充足,进程的资源请求都可以获得知足,死锁出现的可能性就很低,不然就会因争夺有限的资源而陷入死锁。其次,进程运行推动顺序与速度不一样,也可能产生死锁。

 

待续 ...

相关文章
相关标签/搜索