一、什么是死锁
例如系统中只有一台扫描机与刻录机,现在,两个进程都准备扫描文档并且将其刻录到CD上,在某一时刻,进程P1占用扫描机,进程P2占用刻录机,后来P1又去请求刻录机但是因为他被分配给P2从而获得不了这个资源,相同原理,P2请求扫描机也不能获得这个资源,而双方都希望对方先释放其占用的资源,但他们都因为不能获得所需资源去继续运行,从而无法释放自己占用的资源,因此双方就一直处于这种僵持的状态,从而使得两个进程陷入了求而不得的情况,最终导致其产生死锁的情况。
二、死锁的定义
如果一组进程中的每一个进程都在等待仅有该组进程中的其他进程才能引起的事件,那么该组进程是死锁的。
由于没有事件能够被触发,故死锁是永久性的。
由于死锁是在多个进程竞争资源时发生的,因此所有的死锁永远都涉及两个多个进程之间对资源需求的请求。
三、死锁中的资源问题
(一)可重用资源
1、概念
可重用资源是指一次只能供一个进程安全的使用,并且不会由于使用而耗尽的资源(可供用户重复使用多次的资源),进程得到资源单元,后来又释放供其他进程再次使用。
2、性质
- 每一个可重用资源中的单元只能分配给一个进程使用,不允许进程之间的共享
- 进程在使用可重用资源之时,必须按照下面的顺序:请求资源(如果失败,请求进程将会被阻塞或循环等待)—>>使用资源—->>释放资源
- 系统中的每一类可重用资源中的单元数目是相对固定的,进程在运行期间不能创建也不能删除
- 对资源的请求和释放,一般是通过系统调用来完成的
3、应用
可重用资源包含:I/O通道,内存,外存,设备,以及类似文件,数据库,信号量之类的数据结构
(二)可消耗资源
1、概念
可消耗资源是指可以被创建(生产)和销毁(消耗)的资源。通常对某种类型可消耗资源的数目没有限制,一个无阻塞的生产进程可以创建任意数目的这类资源,当消费进程得到一个资源时,该资源就不在存在。
2、性质 - 每一类可消耗资源的单元数目在进程运行期间是不断变化的(可以为0)
- 进程在运行期间可以不断地创建可消耗资源,并将它们放在该资源类的缓冲区中,以增加该资源类的单元数目
- 进程在运行期间,可以请求若干个可消耗性资源单元,用于进程消耗,不在将他们返回给该资源类中
- 可消耗资源通常由生产者进程创建,由消耗者进程消耗,例如:进程间通信的消息等
3、应用
可消耗资源包含:中断、信号、消息、I/O缓冲区中的信息
(三)可抢占性资源
1、概念
可抢占资源是指某一进程在获得这类资源后,该资源可以在被其他进程或系统抢占。
2、应用
优先级高的进程可以抢占优先级低的进程的处理机
在内存紧张之时,可将一个进程从内存调到外存中,抢占该进程在内存中的资源
CPU与主存均属于可抢占资源,该类资源不会发生死锁
(四)不可抢占资源
1、概念
不可抢占资源是指一旦系统把某资源分配给进程后,就不能将其强行收回,只能在进程用完后自行释放
2、应用
不可抢占资源包含:磁带机,打印机
总结:除了可抢占性资源不能导致死锁情况的产生,其他资源均可能导致死锁的放生。
四、死锁产生的条件
死锁产生的必要条件
1、互斥:一次只有一个进程可以使用一个资源。如果此时还有其他进程请求该资源,则请求进程只能等待,直至占用该资源的进程用完释放。(保证结果的一致性和数据库的完整性)
2、占用且等待(请求和保持条件):当一个进程等待其他进程时,继续占用已经分配的资源(当去请求其他资源但是被占有从而没有获得之时,此时请求进程被阻塞,但是对于自己所占有的资源保持不放)
3、不可抢占 :不能强行抢占进程已占有的资源(利用回滚机制,把进程和他的资源恢复到以前适当的状态,使得进程最终可以重复他的动作)
以上三个是死锁产生的必要条件,如果有死锁的产生,必须还要有第四个条件
4、循环等待:存在一个封闭的进程链,使得每一个进程至少占用此链中下一个进程所需要的一个资源。
只有当以上四个条件同时具备,才会产生死锁,只要一个条件不满足,则不会有死锁问题的产生。
五、预防死锁
对于死锁的预防,简单的来说,就是阻止以上某种条件的发生,从而有效的避免死锁的产生。
对于“互斥”此种条件在预防死锁中是不可能禁止的
(一)破坏“请求和保持”条件
1、可以要求进程一次性地请求所有需要的资源,如果此时当前进程所需的资源没有,则此进程进入等待队列,即使其他资源空闲,也不分配给该进程。
优点:简单,易行且安全
缺点:资源严重被浪费,严重的恶化了资源的资源的利用率。使得进程经常会发生饥饿问题。
2、允许一个进程只获得运行初期所需的资源后,就开始运行,在运行过程中,在逐步已分配给自己、且已用毕的全部资源,然后在请求新的所需资源。
优点:提高设备的利用率,减少进程发生饥饿问题
(二)破坏“不可抢占”条件
1、如果占有某些资源的一个进程进行进一步资源请求被拒绝,则该进程必须释放它最初占有的资源,如果又必要,可再次请求这些资源和另外的资源
2、如果一个进程请求当前被另一个进程占有的一个资源时,则操作系统可以抢占另一个进程,要求他释放该资源,(必须发生在任意两个进程的优先级都不相同的条件下)
缺点:增加系统的开销,降低了系统的吞吐率
(三)破坏“循环等待”条件
对系统所有资源类型进行线性排序。如果一个进程已经分配到了R类型资源那么他接下来请求的资源只能是那些排在R类型之后的资源后类型。
六、死锁避免
在死锁预防中,通过约束资源请求,防止四个死锁条件中至少一个产生
而在死锁避免中,他允许三个必要条件的放生,但是通过明智的选择,确保永远不会达到死锁点
死锁避免的方法
1、如果一个进程的请求会导致死锁,则不启动此进程
2、如果一个进程增加的资源请求会导致死锁,则不允许此分配
以上两种死锁避免的条件中,是为了使得进程进入一个安全的状态,所谓安全状态,是指系统能按某种进程推进顺序(P1,P2……P n)
为每个进程Pi分配其所需要的资源,直至满足每个进程对资源的最大需求,使得每个进程都可以顺利的完成。此时称(P1,P2……Pn)为安全序列,如果系统无法到达这样一种状态,则会产生死锁的问题。
不需要死锁预防中的抢占和回滚机制,并且比死锁预防的限制少
死锁避免的限制:
- 必须事先声明每个进程请求的最大资源
- 考虑的进程必须是无关的,也就是说,他们的执行顺序必须没有任何同步要求的限制
- 进程分配的资源数目必须是固定的
- 在占有资源时,进程不会退出。
七、死锁检测
对于死锁检测来说,只要有可能,被请求的资源就被授权给进程
检查死锁的好处:他使得可以尽早的检测死锁的情况,并且由于此方法基于系统状态的逐渐变化情况,因而算法相对比较简单。另一方面,这种频繁的检查会耗费相当多的处理器时间。
1、资源分配图
2、死锁定理
S为死锁的充分条件是:当且仅当S的资源分配图是不可完全简化的,则该充分条件被称为死锁定理。
八、死锁恢复
1、取消所有的死锁进程。
2、把每个死锁进程回滚到前面定义的某些检查点,并且重新启动所有进程(在系统构造回滚和重启机制)
3、连续取消死锁进程直到不再存在死锁
4、连续抢占资源直到不再存在死锁。一个资源被抢占必须回滚到获得这个资源之前的某一个状态。
对于以上3、4点,原则上采用下面的一种
- 目前为止消耗处理器时间最少
- 目前为止产生的输出最少
- 预计剩下的时间最长
- 目前为止分配的资源总量最少
优先级最低
over
只有不停的奔跑,才能不停留在原地!!!