6.5 死锁避免

在讨论死锁检测时,我们假设当一个进程请求资源时,它一次就请求所有的资源(见图6-6中的矩阵R)。不过在大多数系统中,一次只请求一个资源。系统必须能够判断分配资源是否安全,并且只能在保证安全的条件下分配资源。问题是:是否存在一种算法总能做出正确的选择从而避免死锁?答案是肯定的,但条件是必须事先获得一些特定的信息。本节我们会讨论几种死锁避免的方法。

6.5.1 资源轨迹图

避免死锁的主要算法是基于一个安全状态的概念。在描述算法前,我们先讨论有关安全的概念。通过图的方式,能更容易理解。虽然图的方式不能被直接翻译成有用的算法,但它给出了一个解决问题的直观感受。

在图6-8中,我们看到一个处理两个进程和两种资源(打印机和绘图仪)的模型。横轴表示进程A执行的指令,纵轴表示进程B执行的指令。进程A在I1 处请求一台打印机,在I3 处释放,在I2 处请求一台绘图仪,在I4 处释放。进程B在I5 到I7 之间需要绘图仪,在I6 到I8 之间需要打印机。

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

阅读 ‧ 电子书库
图 6-8 两个进程的资源轨迹图

图6-8中的每一点都表示出两个进程的连接状态。初始点为p,没有进程执行任何指令。如果调度程序选中A先运行,那么在A执行一段指令后到达q,此时B没有执行任何指令。在q点,如果轨迹沿垂直方向移动,表示调度程序选中B运行。在单处理机情况下,所有路径都只能是水平或垂直方向的,不会出现斜向的。因此,运动方向一定是向上或向右,不会向左或向下,因为进程的执行不可能后退。

当进程A由r向s移动穿过I1 线时,它请求并获得打印机。当进程B到达t时,它请求绘图仪。

图中的阴影部分是我们感兴趣的,画着从左下到右上斜线的部分表示在该区域中两个进程都拥有打印机,而互斥使用的规则决定了不可能进入该区域。另一种斜线的区域表示两个进程都拥有绘图仪,且同样不可进入。

如果系统一旦进入由I1 、I2 和I5 、I6 组成的矩形区域,那么最后一定会到达I2 和I6 的交叉点,这时就产生死锁。在该点处,A请求绘图仪,B请求打印机,而且这两种资源均已被分配。这整个矩形区域都是不安全的,因此决不能进入这个区域。在点t处惟一的办法是运行进程A直到I4 ,过了I4 后,可以按任何路线前进,直到终点u。

需要注意的是,在点t进程B请求资源。系统必须决定是否分配。如果系统把资源分配给B,系统进入不安全区域,最终形成死锁。要避免死锁,应该将B挂起,直到A请求并释放绘图仪。