预防死锁
目录
参考资料:
预防死锁的方法是通过破坏产生死锁的四个必要条件中的一个或几个,以避免发生死锁。
互斥条件 不可抢占条件 占有并等待条件 循环等待条件
由于互斥条件是非共享设备所必须的,不仅不能改变,还应加以保证,因此主要另外三个条件来破坏死锁。
破坏“请求和保持”条件
为了能破坏“请求和保持”条件,系统必须保证做到:当一个进程在请求资源时,它不能持有不可抢占资源。该保证可通过如下两个不同的方式实现:
一次性分配策略
一次性获取所需的全部资源
使用该方式,所有进程在开始运行之前,必须一次性地申请其在整个运行过程中所需的全部资源。此时若系统有足够的资源分配给某进程,便可把其需要的所有资源分配给它。这样,该进程在整个运行期间,便不会再提出资源要求,从而破坏了“请求”条件。系统在分配资源时,只要有一种资源不能满足进程的要求,即使其它所需的各资源都空闲也不分配给该进程,而让该进程等待。由于该进程在等待期间未占有任何资源,于是破坏了“保持”条件,从而可以预防死锁的发生。
优点:简单、易行且安全
缺点:
- 资源被严重浪费,严重地恶化了资源的利用率。进程在开始运行时就一次性地占用了整个运行过程所需的全部资源,其中有些资源可能仅在运行初期或运行快结束时才使用,甚至根本不使用。
- 使进程经常会发生饥饿现象。因为仅当进程在获得了其所需的全部资源后才能开始运行,这样就可能由于个别资源长期被其它进程占用,而致使等待该资源的进程迟迟不能开始运行,而个别资源有可能仅在进程运行到最后才需要,如打印机往往就是如此。
只获取部分资源即运行
该方式是对第一种方式的改进,它允许一个进程只获得运行初期所需的资源后,便开始运行。进程运行过程中再逐步释放已分配给自己的、且已用毕的全部资源,然后再请求新的所需资源。
我们可以通过一个具体例子来说明,第二种方式比第一种方式要好。
例如,有一个进程,它所要完成的任务是,先将数据从磁带上复制到磁盘文件上,然后对磁盘文件进行排序,最后把结果打印出来。在采用第一种方式时,进程必须在开始时就请求磁带机、磁盘文件和打印机。然而打印机仅在最后才会用到,既影响到其利用率,还会影响到其它进程的运行。此外,又如磁带机和磁盘文件虽然空闲,但因打印机已分配给其它进程因而进程还需要等待。// 第一种方式:必须拥有:磁带机+磁盘文件+打印机
在采用第二种方式时,进程在开始时只需请求磁带机、磁盘文件,然后就可运行。等到全部磁带上的数据已复制到磁盘文件中并已排序好后,便可将磁带机和磁盘文件释放掉再去请求磁盘文件和打印机。这不仅能使进程更快地完成任务,提高设备的利用率,还可减少进程发生饥饿的机率。// 第二种方式:先拥有:磁带机+磁盘文件,然后再申请打印机
破坏“不可抢占”条件
破坏“不可抢占”条件,即当一个已经保持了某些不可被抢占资源的进程,提出新的资源请求而不能得到满足时,它必须释放已经保持的所有资源,待以后需要时再重新申请。这意味着进程已占有的资源会被暂时地释放,或者说是被抢占了,从而破坏了“不可抢占”条件。//不能一直持有资源
该方式实现起来比较复杂,且需付出很大的代价。因为一个不可抢占的资源如打印机、CD 刻录机等在使用一段时间后被抢占,可能会造成进程前一阶段工作的失效,即使是采取了某些防范措施,也还会使进程前后两次运行的信息不连续。这种策略还可能因为反复地申请和释放资源致使进程的执行被无限地推迟,这不仅延长了进程的周转时间,而且也增加了系统开销,降低了系统吞吐量。//破坏不可抢占条件,代价比较大
破坏“循环等待”条件
资源有序分配法
为了能保证“循环等待”条件不成立,需要对系统所有资源类型进行线性排序并赋予不同的序号。在对系统所有资源类型进行线性排序后,规定每个进程必须按序号递增的顺序请求资源。如果需要多个同类资源单元,则必须一起请求。
在采用这种策略时,请求资源的顺序是十分重要的。一般情况下,进程总是先输入程序和数据,继而进行运算,最后将计算结果输出。故可以要求先获取输入设备(磁带机),然后再获取输出设备(打印机)。
这种预防死锁的策略与前两种策略比较,其资源利用率和系统吞吐量都有较明显的改善。但也存在下述问题:
- 为系统中各类资源所规定的序号必须相对稳定,这就限制了新类型设备的增加。
- 如果作业使用各类资源的顺序与系统规定的顺序不同,会造成对资源的浪费。
- 为方便用户,系统对用户在编程时所施加的限制条件应尽量少,然而这种按规定次序申请资源的方法必然会限制用户简单、自主地编程。