【资源】
在系统中,有许多不同类型的资源,其中可能会引起死锁的主要是采用互斥访问机制、不可被抢占的资源,即临界资源,例如:打印机、数据文件、信号量等
可将系统中的资源分为两大类:可剥夺与非可剥夺性资源、永久性资源与临时性资源
其中,可剥夺与非可剥夺性资源有:
- 可剥夺性资源:分配给进程后可以被高优先级的进程剥夺,例如 CPU 、主存
- 不可剥夺性资源:分配给进程后只能在进程用完后释放,例如磁带机、打印机
永久性资源与临时性资源有:
- 永久性资源:可供用户重复使用多次的资源,例如打印机
- 临时性资源:在进程运行期间,由进程动态地创建与消耗,例如数据资源
【死锁】
概述
多道程序系统借助并发执行改善资源利用率,提高系统吞吐量,但可能会发生死锁问题,当进程处于死锁状态时,若无外力作用,它们都将无法再向前推进。
一组进程中的每一个进程都在等待仅由该组进程中的其他进程才能引发事件,那么该组进程是死锁的。
简单来说,死锁,是指多个进程在运行过程中,因争夺资源而造成的一种僵局,
死锁状态不同于饥饿状态,死锁指进程之间因为争夺资源而无休止地互相等待,饥饿则是指一个进程无休止地等待
产生死锁的原因
死锁产生的原因,主要是进程间竞争资源与进程推进顺序不当两大方面,由于竞争的资源的类别,因此,产生死锁的情况有以下三种:
- 竞争不可抢占资源:通常系统中所拥有的不可抢占资源数量不足以满足多个进程运行的需要,使得进程在运行过程中,会因争夺资源而陷入死锁
- 竞争可消耗资源:在进程运行过程中,由于可消耗资源是由进程动态创建与消耗的,因此如果进程运行顺序不当,就会使得进程间为可消耗资源而竞争,从而陷入死锁
- 进程推进顺序不当:由于进程在运行中具有异步性的特征,因此对资源的请求和释放的操作顺序会导致多进程向前推进具有推进顺序合法、推进顺序非法两种状态,当处于推进顺序非法状态时,会导致死锁产生
产生死锁的条件
形成死锁的条件有四个,这四个条件缺一不可,只有当全部满足时,才会出现死锁:
- 互斥条件:进程对所分配到的资源进行排他性使用,即在一段时间内,某资源只能被一个进程占用
- 请求和保持条件:进程已经保持了至少一个资源,又提出新的资源请求,而新请求资源被其他进程占有只能造成自身进程阻塞,但对自己已获得的其他资源保持不放,必然影响其他进程
- 不剥夺条件:进程已获得的资源未使用完之前不能被剥夺,只能在使用完时由自己释放
- 环路等待条件:在发生死锁时,必然存在一个进程-资源循环链,即对于进程集 $\{P_0,P_1,…,P_n\}$,$P_0$ 正在等待 $P_1$ 的资源,而 $P_1$ 正在等待 $P_2$ 的资源,…,$P_n$ 正在等待 $P_0$ 的资源
处理死锁的方法
目前处理死锁的方法可归结为 4 种:
- 预防死锁:设置限制条件,破坏产生死锁四个必要条件中的一个或几个来进行预防
- 避免死锁:在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免产生死锁
- 检测死锁:运行进程在运行过程中出现死锁,但要通过检测机制及时检测出死锁的产生,然后采用适当的措施将进程从死锁中解脱出来
- 解除死锁: 当检测到系统中已发生死锁时,就采取相应措施,将进程从死锁状态中解脱出来
上述四种方法对死锁的防范程度逐渐减弱,但相应的,资源利用率有所提高,且进程因资源因素而阻塞的频度下降(并发程度的提高)