提示:该死锁(Deadlock)的相关知识主要是针对操作系统中的。
内容主要来源:汤小丹_计算机操作系统_教材
教材内容十分的详细,大家可以直接看教材哦,这个主要是个人笔记
一、死锁概述
- 死锁(Deadlock):指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,这些进程都将永远不能再向前推进。
(1)资源问题
- 引起死锁的主要是需要采用互斥访问方法的不可被抢占的资源。如打印机、数据文件、队列、信号量等。
1.可重用资源和可消耗资源
可重用资源(互斥使用)
- 可重用资源是一种供用户重复使用多次的资源。
- 每个可重用资源中的单元,只能分配给一个进程使用,而不允许多个进程共享。
- 系统中每类可重用资源中的单元数目是相对固定的,进程在运行期间既不能创建资源,也不能删除资源。
- 对资源的请求和释放通常都是利用系统调用来实现的。
可消耗资源
- 可消耗资源可称为临时性资源,它是在进程运行期间由进程动态创建和消耗的。
- 每类可消耗资源的单元数目在进程运行期间是可以不断变化的。
- 进程在运行过程中可以请求若干个可消耗资源单位,用于进程自己消耗,并不将它们返回给该类资源。
- 进程在运行过程中,可以不断地创造可消耗资源的单元,将它们放入该资源类的缓冲区中。
- 最典型的可消耗资源就是用于进程间通信的消息等。
2.可抢占资源和不可抢占资源
可抢占资源
- 可抢占资源是指,某进程在获得这类资源后,这类资源可以再被其他进程或系统抢占。
- 处理机和内存都属于可抢占资源。
- 这类资源不会引起死锁。
不可抢占资源
- 不可抢占资源是指,一旦系统把这类资源分配给某个进程后,就不能将它强行收回,而只能在进程用完后等待其自行释放。
- 刻录机、磁带机和打印机都属于不可抢占资源。
(2)计算机系统中的死锁
- 死锁是源于多个进程对资源的争夺,对不可抢占资源争夺,对可消耗资源的争夺和进程推进顺序不当时,会引起死锁。
1.竞争不可抢占资源引起死锁
- 通常,系统中所拥有的不可抢占资源的数量不足以满足多个进程运行的需要,这使得进程在运行过程中,会因争夺资源而陷入僵局。
2.竞争可消耗资源引起死锁
- 例如:不同进程之间互相发送消息的顺序不当而造成死锁。
3.进程推进顺序不当引起死锁
- 进程在运行过程中,对资源进行申请和释放的顺序是否合法,也是在系统中是否会产生死锁的一个重要因素。
(3)死锁的定义、必要条件与处理方法
1.死锁的定义
- 如果一组进程中的每个进程都在等待仅由该组进程中的其他进程才能引发的事件发生,那么该组进程是死锁的。
2.产生死锁的必要条件
互斥条件
- 在一段时间内,某资源只能被一个进程占用。(可重用类资源)
请求和保持条件
- 进程已经占有了至少一个资源,但又提出了新的资源请求,而该被请求的资源已被其他进程占有,此时请求进程被阻塞,同时其对自己占有的资源保持不放。
不可抢占条件
- 进程已经获得的资源在未使用完之前不能被抢占,只能在进程使用完时,由其自己释放。
循环等待条件
- 该条件指在发生死锁时,必然存在一个”进程-资源“循环链。(看了资源分配图就知道是一个怎样的链了)
3.死锁的处理方法
- 从原理上来说,处理死锁有三种主要的策略:
- 1.采用某个协议来预防或避免死锁,确保系统永远不会进入死锁状态。(预防死锁和避免死锁)
- 2.运行系统进入死锁,但是会检测它,然后恢复。(检测死锁和解除死锁)
- 3.完全忽略这个问题,并假设系统永远不会出现死锁 。(大多数系统采用的策略)
- (1)预防死锁。 这是一种较简单和直观的事先预防方法。该方法通过设置某些限制条件,去破坏产生死锁的4个必要条件中的一个或几个来预防死锁。
- (2)避免死锁。 在资源动态分配过程中,用某种方法防止系统进入不安全状态,从而避免发生死锁。
- (3)检测死锁。 这种方法无须事先采取任何措施,允许进程在运行过程中发生死锁。但可通过检测机构及时地检测出死锁的发生,然后采取适当措施把进程从死锁中解脱出来。
- (4)解除死锁。 当检测到系统中已发生死锁时就采取措施,将进程从死锁中解脱出来。
- 从(1)到(4)对死锁的防范程度逐渐减弱,但对应的资源利用率却逐渐提高,且进程因资源因素而阻塞的频度逐渐下降(即进程并发程度逐渐提高)
4.资源分配图
- 可利用资源分配图(resource allocation graph)来描述系统死锁。
- 资源分配图是一个有向图,它由一组节点N和一组边E组成的一个偶对G=(N, E)。
二、死锁预防
- 由于互斥条件是非共享设备所必须具备的条件,不仅不能改变,还应加以保证。因此,预防死锁时主要是破坏产生死锁的后3个条件。
(1)破坏“请求和保持”条件
- 为了能够破坏“请求和保持”条件,系统必须保证做到:当一个进程在请求资源时,它不能持有不可抢占资源。该保证可以通过下面两个不同的协议实现。
1.第一种协议
- 该协议规定,所有进程在开始运行之前,必须一次性地申请其在整个运行过程中所需要的全部资源。
- 缺点:
- 资源被严重浪费,严重地降低了资源利用率。
- 进程经常会发生饥饿现象。
2.第二种协议
- 该协议是对第一种协议的改进,它允许一个进程只获得允许初期所需要的资源后,便开始运行。进程运行过程中再逐步释放已分配给自己、且已用毕的全部资源,然后再请求新的所需资源。
(2)破坏"不可抢占"条件
- 规定,当一个已经保持了某些不可抢占资源的进程提出新的资源请求而不能得到满足时,它必须释放已经保持的所有资源,待以后需要时再重新申请。不可抢占资源 ====》可抢占资源
(3)破坏“循环等待”条件
三、死锁避免
- 在资源动态分配过程中,防止系统进入不安全状态,以避免发生死锁。(确保系统始终处于安全状态)
如何避免死锁可以看我另一篇银行家算法避免死锁的博客
银行家算法避免死锁
四、死锁的检测与解除
1.死锁的检测
- 为了能够对系统中是否已发生死锁进行检测,在系统中:①保存有关资源的请求和分配信息;②嵌入一种算法,使其能够利用这些信息来检测系统是否已进入死锁状态。
死锁定理
死锁检测中的数据结构
2.死锁的解除
- 最简单的处理措施就是立即通知操作员,请他通过人工方法解除死锁。
- 利用死锁解除算法,把系统从死锁状态中解脱出来。
- ①抢占资源,从一个或多个进程中抢占足够数量的资源,然后将它们分给死锁进程,以解除死锁状态。
- ②终止死锁进程,即终止系统中的一个或多个死锁进程,直至打破循环等待,使系统从死锁状态中解脱出来。
终止死锁进程的方法
- ①终止所有死锁进程
- ②逐个终止死锁进程
付出代价最小的死锁解除算法