6.4.2 破坏占有和等待条件 另一种破坏占有和等待条件的略有不同的方案是,要求当一个进程请求资源时,先暂时释放其当前占用的所有资源,然后再尝试一次获得所需的全部资源。 6.4.3 破坏不可抢占条件 破坏关于死锁的第三个条件(不可抢占)也是可能的。假若一个进程已分配到一台打印机,且正在进行打印输出,如果由于它需要的绘图仪无法获得而强制性地把它占有的打印机抢占掉,会引起一片混乱。但是,一些资源可以通过虚拟化的方式来避免发生这样的情况。假脱机打印机向磁盘输出,并且只允许打印机守护进程访问真正的物理打印机,这种方式可以消除涉及打印机的死锁,然而却可能带来由磁盘空间导致的死锁。但是在大容量磁盘的情况下,要消耗完所有的磁盘空间一般是不可能的。 6.4.3 破坏不可抢占条件 然而,并不是所有的资源都可以进行类似的虚拟化。例如,数据库中的记录或者操作系统中的表都必须被锁定,因此存在出现死锁的可能。 6.4.4 破坏环路等待条件 现在只剩下一个条件了。消除环路等待有几种方法,一种是保证每一个进程在任何时刻只能占用一个资源,如果要请求另外一个资源,它必须先释放第一个资源。但假若进程正在把一个大文件从磁带机上读入并送到打印机打印,那么这种限制是不可接受的。另一种避免出现环路等待的方法是将所有资源统一编号,如图6-12 a)所示。现在的规则是:进程可以在任何时刻提出资源请求,但是所有请求必须按照资源编号的顺序(升序)提出。进程可以先请求打印机后请求磁带机,但不可以先请求绘图仪后请求打印机。 图6-12 破坏环路等待条件 6.2.2 死锁恢复 另一种方法是选一个环外的进程作为牺牲品,释放该进程的资源。在使用这种方法时,选择一个要被杀死的进程要特别小心,它应该正好持有环中某些进程所需的资源。比如,一个进程可能持有一台绘图仪而需要一台打印机,而另一个进程可能持有一台打印机而需要一台绘图仪,因而这两个进程是死锁的。第三个进程可能持有另一台同样的打印机和另一台同样的绘图仪而且正在运行着。杀死第三个进程将释放这些资源,从而打破前两个进程的死锁。 6.2.2 死锁恢复 有可能的话,最好杀死可以从头开始重新运行而且不会带来副作用的进程。比如,编译进程可以被重复运行,由于它只需要读入一个源文件和产生一个目标文件。如果将它中途杀死,它的第一次运行不会影响到第二次运行。 另一方面,更新数据库的进程在第二次运行时并非总是安全的。如果一个进程将数据库的某个记录加1,那么运行一次,将它杀死后,再次执行,就会对该记录加2,这显然是错误的。 6.3 死锁避免 在前面讨论死锁检测时,我们假设当一个进程请求资源时,它一次就请求了所有的资源。实际上在大多数系统中,通常一次只请求一个资源。系统必须能够判断分配资源是否安全,并且只能在保证安全的条件下分配资源。也确实存在一种算法总能做出正确的选择从而避免死锁,但条件是必须事先获得一些特定的信息。 6.3.1 资源轨迹图 避免死锁的主要算法是基于一个安全状态的概念。 在图6-7中,我们看到一个处理两个进程和两种资源(打印机和绘图仪)的模型。横轴表示进程A执行的指令,纵轴表示进程B执行的指令。进程A在I1处请求一台打印机,在I3处释放,在I2处请求一台绘图仪,在I3处释放。进程B在I5到I7之间需要绘图仪,在I6到I8之间需要打印机。 图6-7 两个进程的资源轨迹图 6.3.1 资源轨迹图 图6-7中的每一点都表示出两个进程的连接状态。初始点为p,没有进程执行任何指令。如果调度程序选中A先运行,那么在A执行一段指令后到达q,此时B没有执行任何指令。在q点,如果轨迹沿垂直方向移动,表示调度程序选中B运行。在单处理机情况下,所有路径都只能是水平或垂直方向的,不会出现斜向的。因此,运动方向一定是向上或向右,不会向左或向下,因为进程的执行不可能后退。 6.3.1 资源轨迹图 当进程A由r向s移动穿过I1线时,它请求并获得打印机。当进程B到达t时,它请求绘图仪。图中的阴影部分是我们感兴趣的,左下到右上斜线部分表示在该区域中两个进程都拥有打印机,而互斥使用的规则决定了不可能进入该区域。另一种斜线的区域表示两个进程都拥有绘图仪,同样不可进入。 6.3.1 资源轨迹图 如果系统一旦进入由I1、I2和I5、I6组成的矩形区域,那么最后一定会到达I2和I6的交叉点,这时就产生死锁。在该点处,A请求绘图仪,B请求打印机,而且这两种资源均已被分配。这整个矩形区域都是不安全的,因此决不能进入这个区域。在点t处唯一的办法是运行进程A直到I4,过了I4后,可以按任何路线前进,直到终点u。 需要注意的是,在点t处进程B请求资源,系统必须决定是否分配。如果系统把资源分配给B,系统进入不安全区域,最终形成死锁。要避免死锁,应该将B挂起,直到A请求并释放绘
原创力文档

文档评论(0)