操作系统知识盘点(三)(死锁相关)

15、死锁的概念

在多道程序系统中,由于多个进程的并发执行,改善了系统资源的利用率并提高了系统的处理能力。然而,多个进程的并发执行也带来了新的问题--死锁

当多个进程因竞争系统资源或相互通信而处于永久阻塞状态时,若无外力作用,这些进程都无法向前推进。这些进程中的每一个进程均无限期地等待此组进程中某个其他进程占有的、自己永远无法得到的资源,这种现象称为死锁

比如某系统只有一台打印机和一个输入设备,进程A正在占用输入设备,同时提出了打印机的请求,但此时打印机被B占用,在B未释放打印机之前,又提出请求使用正被A占用的输入设备,这样,两个进程无休止的等待下去,均无法继续执行,此时两个进程陷入死锁状态

有以下结论:

  • 参与死锁的进程至少有两个
  • 每个参与思索地进程均等待资源
  • 参与死锁的进程中至少有两个进程占有资源
  • 死锁进程是系统中当前进程集合的一个子集

 

16、死锁产生的原因和必要条件

(1)资源分类

操作系统是一个资源管理程序,它负责分配不同类型的资源给进程使用。现代操作系统所管理的资源类型十分丰富,并且可以从不同的角度出发对其进行分类。例如,可以把资源分为可剥夺资源和不可剥夺资源

可剥夺资源是指虽然资源占有者进程仍然需要使用该资源,但另一个进程可以强行把该资源从占用者进程处剥夺来归自己使用

不可剥夺资源是指除占有者进程不在需要使用该资源而主动释放资源外,其他进程不得在占有者进程使用资源过程中强行剥夺

一个资源是否属于可剥夺资源,完全取决于资源本身的性质。比如打印机在一个打印任务未结束之前,是无法被其他打印任务剥夺的,属于不可剥夺资源;而主存和CPU却是可剥夺资源

在研究资源分配时,必须弄清资源的类型,资源的不同使用性质是引起系统死锁的原因。如何对可剥夺资源的竞争不会引起进程死锁,而对其他类型资源的竞争则有可能导致死锁

(2)死锁产生的原因

死锁产生的原因是竞争资源。如果系统中只有一个进程在运行,所有资源位一个进程独享,则不会出现死锁现象。当系统中有多个进程并发执行时,若系统中的资源不足以同时满足所有进程的需要则会引起进程对资源的竞争,从而可能导致死锁的产生

死锁产生的原因时资源不足和进程推进顺序不当

系统资源不足是根本原因,设计操作系统的目的就是使并发进程共享系统资源,而进程推进顺序不当是产生死锁的重要原因,当系统资源刚好够进程使用时,进程的推进顺序不当就很容易导致进程彼此占有对方需要的资源,从而导致死锁

(3)死锁产生的条件

  • 互斥条件。进程要求对所分配的资源进行排他性控制,即在一段时间内某种资源仅为一个进程所占有
  • 不剥夺条件 进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,及只能由获得该资源的进程自己来释放
  • 请求与保持条件 进程每次申请他所需的一部分资源,在等待分配新资源的同时,进程继续占用已分配到的资源。请求与保持条件也称为部分分配条件
  • 环路等待条件  存在一种进程资源的循环等待链,而链中的每一个进程已经获得资源同时被链中的下一个资源所请求

要发生死锁,这四个条件缺一不可,因此可以通过破坏其中的一个或几个条件来避免死锁的发生

 

17、处理死锁的基本方法

  • 鸵鸟算法:指像鸵鸟一样对死锁视而不见,及不理睬死锁
  • 预防死锁:通过设置某些限制条件,去破坏产生死锁的4个必要条件中的一个或几个来预防发生死锁
  • 避免死锁:在资源的动态分配过程中,用某种方法防止系统进入不安全状态,从而避免死锁
  • 检测及解除死锁:通过系统的检测机构及时的检测出思索地发生,然偶采取某种措施解除死锁

这里要区分后三种措施的不同之处。预防死锁是在调度方式上破坏死锁产生的必要条件,使系统无法产生死锁,例如采用可剥夺式的进程调度方法,优先级高的进程总能得到资源并完成运行,因此系统不会产生死锁:避免死锁实在动态分配过程中,预知系统是否会进入不安全的状态,如果资源分配有可能产生死锁,则不进行这种分配,而检测与解除死锁是一种比较被动地方法,实在检测到死锁已经发生之后进行处理,例如采用剥夺死锁进程的资源等方法强制进程释放资源或结束死锁进程来解除死锁状态。

这三种方法有不同的特点,例如在不能破坏死锁的必要条件的情况下,就无法采用预防死锁的方法,只能够采用其他方法;在系统进程过多预测系统是否进入不安全状态的成本过高时,采用避免死锁的方式并不划算,不如等死锁发生后采用检测及解除死锁的方法

现实的操作系统并非都采用以上三种方法,相反,很多操作系统认为死锁不可能发生,对死锁不进行任何处理(这种说法不够积极,应该说对死锁采用鸵鸟算法),如UNIX

 

18、死锁的预防

根据以上讨论,想要防止死锁的发生,只需要破坏死锁产生的四个必要条件之一即可

(1)互斥条件:为了破坏互斥条件就要允许多个进程同时发访问资源。但是这会收到资源本身固有特征的限制,有时资源根本不能同时访问,只能互斥访问。如打印机就不允许多个进程在其运行期间交替打印数据,只能互斥使用。由此看来,通过破坏互斥条件来防止死锁的发生是不太可能的

(2)不剥夺条件:为了破坏不剥夺条件,可以指定这样的策略:对于已经获得了某些资源的进程,若新的资源请求不能立即得到满足,则他必须释放所有已获得的资源,以后需要资源时再重新申请。这就意味着,一个进程已获得的资源在运行过程中可以被剥夺,从而破坏了不剥夺条件。该策略实现起来比较复杂,释放以获得资源可能造成前一段工作的失效,重复申请和释放资源会增加系统开销,降低系统吞吐量。这种方法通常不会用于剥夺资源之后代价较大的场合,比如不会用于对打印机的分配,在一个进程正在打印时,不会采用剥夺的方法来解除死锁

(3)请求与保持条件:为了破坏请求与保持条件,可以采用预先静态分配方法。预先静态分配方法要求进程在其运行前一次性申请她所需要的全部资源,在他的资源未满足前,不把他投入运行。一旦投入运行后,这些资源就一直归他所有,也不再提出其他资源请求,这样就可以保证系统不会发生死锁。这种方法既简单又安全,但降低了资源利用率,采用这种方法必须事先知道该进程的全部资源,即使有地资源只能在运行后期使用,甚至有的资源在正常运行中根本不用,也不得不预先统一申请,结果使得系统资源不能充分利用;以打印机为例,一个作业可能旨在最后完成时才需要打印计算结果,但在作业运行前就把打印机分配给它,那么作业整个执行过程中打印机基本处于闲置状态

(4)环路等待条件:为了破坏环路等待条件,可以采用有序资源分配法。有序资源分配法是将系统中所有资源都按类型赋予一个编号(例如打印机为1,磁带机为2等),要求 每一个进程都严格按照递增的次序请求资源,同类资源一次申请完。也就是说,只要进程提出资源Ri,则在以后的资源请求中只能请求排在Ri后面的资源(i为资源编号),对资源请求做了这种限制后,系统中不会再出现几个进程对资源四年的请求形成环路的情况。

这种方法由于对资源编号后不宜修改,从而限制了新设备的添加:不同作业对资源使用顺序也不会完全相同,即便系统对资源编号考录到多数情况,但总会由与系统编号不符的作业,从而造成资源浪费:对资源按序使用也会增加程序编写的复杂性

 

19、死锁的避免

预防死锁的方法中所采用的几种策略,总的来说都是施加了较强的限制条件,虽然实现起来较为简单,但却严重损害了系统性能。在避免死锁的方法中,所施加的限制条件较弱,有可能获得较好的系统性能。在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终处于安全状态,便可以避免死锁的发生

(1)安全状态和不安全状态

在避免死锁的方法中,允许进程动态的申请资源,系统在进行资源分配之前,先计算资源分配的安全性。若此次分配不会导致系统进入不安全状态,便将资源分配给进程,否则进程必须等待

若在某一时刻,系统能按照某种顺序来为每个进程分配其所需的资源,直至最大需求,使每个进程都可顺利完成,则称此时的系统状态为安全状态,称该序列为安全序列。若某一时刻系统存在一个非安全序列,称此时的系统状态为不安全状态。需要注意的是,安全序列在某一时刻可能并不唯一,即可以同时存在多种安全序列

虽然并非所有的不安全状态都是死锁状态,但在系统进入不安全状态后,便可能进入死锁状态;反之,只需系统处于安全状态,系统便可避免进入死锁状态

(2)银行家算法

当一个进程申请使用资源的时候,银行家算法通过先 试探 分配给该进程资源,然后通过安全性算法判断分配后的系统是否处于安全状态,若不安全则试探分配作废,让该进程继续等待。

 

20、死锁的避免与解除

 若系统为进程分配资源时不采取任何措施,则应该是提供死锁检测和解除的手段。

 1.资源分配图:

     系统死锁,可利用资源分配图来描述。

       如上图, 用圆圈代表一个进程,用框代表一类资源。由于一种类型的资源可能有多个,用框中的一个点代表一类资源中的一个资源。从进程到资源的有向边叫请求边,表示该进程申请一个单位的该类资源;从资源到进程的边叫分配边,表示该类资源已经有一个资源被分配给了该进程。

2.死锁定理:

       可以通过将资源分配图简化的方法来检测系统状态  S  是否为死锁状态。简化方法如下:

       (1)、在资源分配图中,找到既不阻塞又不是孤点的进程 Pi (即找出一条有向边与它相连,且该有向边对应资源的申请数量小于等于系统中已有空闲资源数量)。消去它所有的请求边和分配边,使之成为孤立的结点。 在这里要注意一个问题,判断某种资源是否有空闲,应该用它的资源数量减去它在资源分配图中的出度。

       (2)、进程 Pi 所释放的资源,可以唤醒某些因等待这些资源而阻塞的进程,原来的阻塞进程可以变为非阻塞进程。根据(1)中的方法进行一系列简化后,若能消去图中所有的边,则称该图是可完全简化的。S为死锁的条件是:当且仅当 S 状态的资源分配图是不可完全简化的,该条件为死锁定理。
3、死锁解除

一旦检测出系统中出现了死锁,就应该陷入死锁的进程从死锁状态中解除出来,常用的解除死锁的方法有两种:

  • 剥夺资源:从其他进程中抢占足够的资源给死锁的进程以解除其死锁状态
  • 撤销进程:撤销一些进程,知道有足够的资源以分配给其他进程,解除死锁状态。

 

21、死锁与饿死(长时间等待未果)

死锁、饥饿、饿死通常是容易混淆的概念,这里特别说明下

在一个动态系统中,资源的请求与释放是经常发生的进程行为。对于每类系统资源,操作系统需要确定一个分配策略,当多个进程同时申请某类资源时,有分配策略确定资源分配给进程的次序。资源分配策略可能是公平的,能保证请求者在有限的时间内获得所需资源:资源分配策略也可能是不公平的 ,即不能保证等待时间上界的存在。在后一种情况下,即使系统没有发生死锁,某些进程也可能会长时间等待。当等待时间给进程推进和相应带来明显影响时,则称此时发生了进程饥饿,当饥饿到一定程度的进程所赋予的任务即使完成也不再具有实际意义时,称该进程被饿死。

考虑一台打印机分配的例子,当有多个进程需要打印文件时,系统按照短作业优先(SJF)的策略排序,该策略具有平均等待时间短的有带你,似乎非常合理,担当短文件打印任务源源不断时,长文件的打印任务将被无限期推迟,导致饥饿以及饿死

有界相关的另外一个概念时活锁。在忙式等待条件下发生的饥饿,称为活锁,例如不公平的互斥算法。虽然此时进程仍然在执行,但有些进程由于无法调度执行,好像发生了死锁一样

饿死与死锁有一定联系:二者都是由于竞争资源而引起的,但又有明显差别,主要表现在如下几个方面

  • 从进程状态考虑,死锁进程都处于等待状态:忙式等待(处于运行或就绪状态)的进程并非处于等待状态,但却可能被饿死
  • 死锁进程等待的是永远不会被释放的资源:而饿死进程等待的是会被释放杠但却不会分配自己的资源,表现为等待时限没有上界(排队等待或忙式等待)
  • 死锁一定发生了循环等待,而饿死则不然。这也表明通过资源分配图可以检测死锁存在与否,但却不能检测是否有进程饿死
  • 死锁一定涉及多个进程,而饥饿或饿死的进程可能只有一个

饥饿和饿死与资源分配策略有关,因而防止饥饿与饿死可从公平性考虑,确保所有进程不被忽视,如多级反馈队列调度算法

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值