认识死锁--操作系统重点【码住!】

avatar
作者
猴君
阅读量:2

一、定义

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

二、产生原因

死锁的产生通常与以下原因有关:

  1. 系统资源不足:当系统中供多个进程共享的资源(如打印机、内存块等)数量不足以满足进程需求时,进程间会竞争这些资源,从而可能产生死锁。
  2. 进程运行推进顺序不合适:进程运行的顺序和速度不同,可能导致某些进程在持有某些资源的同时等待其他进程释放的资源,从而形成死锁。
  3. 资源分配不当:资源分配策略不合理,也可能导致死锁的发生。

三、死锁产生的条件

1.互斥条件(Mutual Exclusion):
  • 至少有一个资源必须处于非共享模式,即一次只能被一个进程(或线程)占用。这意味着资源是排他性的,不能被多个进程同时访问。
2.请求与保持条件(Hold and Wait):
  • 也被称为“占有并等待”条件。一个进程(或线程)在请求新的资源的同时,不会释放已经占有的资源。即进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占用,此时请求资源的进程将会阻塞,但又对自己已获得的资源保持不放。
3.不可抢占条件(No Preemption):
  • 也称为“不可剥夺”条件。进程(或线程)已获得的资源在未使用完之前,不能被其他进程强行剥夺,只能由持有资源的进程(或线程)自己释放。这意味着资源一旦分配给某个进程,就不能被系统或其他进程强制收回。
4.循环等待条件(Circular Wait):
  • 系统中存在若干进程(或线程),它们形成一种头尾相接的循环等待资源关系。即存在一种进程(或线程)的循环链,链中的每一个进程(或线程)已占有若干种资源中的至少一种,同时每一个进程(或线程)又在等待链中下一个进程(或线程)所占有的资源。这种循环等待的情况会导致所有涉及的进程都无法向前推进

四、解决死锁的几种方式

1. 预防死锁

预防死锁是一种较为简单和直观的事先预防的方法。该方法通过设置某些限制条件,去破坏产生死锁的四个必要条件(互斥条件、请求与保持条件、不剥夺条件、循环等待条件)中的一个或几个,来预防发生死锁。例如:

  • 破坏请求与保持条件:进程在申请资源时,一次性申请所有需要的资源,如果无法一次性获取所有资源,则释放已经占有的资源。
  • 破坏循环等待条件:对资源进行排序,要求每个进程按照顺序申请资源,从而避免循环等待。

然而,预防死锁的方法可能会因为所施加的限制条件过于严格,而导致系统资源利用率和系统吞吐量降低。

2. 避免死锁

避免死锁同样属于事先预防策略,但它并不需要在资源分配前采取各种限制措施去破坏死锁的四个必要条件。而是在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。例如,使用银行家算法进行资源分配,该算法通过维护几个关键的数据结构(如可利用资源向量、最大需求矩阵、分配矩阵、需求矩阵等),并在资源分配前进行安全性检查,以确保系统不会进入不安全状态。

3. 检测死锁

检测死锁的方法不需要事先采取任何限制性措施,而是允许系统在运行过程中发生死锁。但系统需要设置检测机构,以便及时检测出死锁的发生,并精确地确定与死锁有关的进程和资源。检测方法包括定时检测、效率低时检测、进程等待时检测等。

4. 解除死锁

当检测到系统中已经发生死锁时,需要采取适当措施将进程从死锁状态中解脱出来。常用的方法是撤销或挂起一些进程,以便回收一些资源,再将这些资源分配给已经处于阻塞状态的进程,使之转为就绪态,以继续运行。具体的解除死锁的方法包括:

  • 撤消陷于死锁的全部进程。
  • 逐个撤消陷于死锁的进程,直到死锁不存在。
  • 从陷于死锁的进程中逐个强迫放弃所占用的资源,直至死锁消失。
  • 从另外一些进程那里强行剥夺足够数量的资源分配给死锁进程,以解除死锁状态。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!