防止死锁的发生只需破坏死锁产生的四个必要条件之一即可。
1.破坏互斥条件
如果允许系统资源都能共享使用,则系统不会进入死锁状态。但有些资源根本不能同时访问,如打印机等临界资源只能互斥使用。所以,破坏互斥条件
而预防死锁的方法不太可行,而且在有的场合应该保护这种互斥性。
2.破坏不可剥夺条件:
当一个已保持了某些不可剥夺资源的进程,请求新的资源而得不到满足时,它必须释放已经保持的所有资源,待以后需要时再重新申请。这意味着,一个进程
已占有的资源会被暂时释放,或者说是被剥夺了,或从而破坏了不可剥夺条件。
该策略实现起来比较复杂,释放已获得的资源可能造成前一阶段工作的失效,反复得申请资源和释放资源会增加系统开销,降低系统的吞吐量。这种方法
常用于状态易于保存和恢复的资源,如CPU 的寄存器及内存资源,一般不能用于打印机之类的资源。
3.破坏请求和保持条件:
采用预先静态分配方法,即进程在运行前一次申请完它所需要的全部资源,在它的资源未满足前,不把它投入运行。一旦投入运行,这些资源就一直归它
所有,也不再提出其他资源请求,这样就可以保证系统不会发生死锁。
这种方法实现简单,但缺点也显而易见,系统资源被严重浪费,其中有些资源可能仅在运行初期或运行快结束时才使用,甚至根本不会使用。而且还是导致
“饥饿”现象,当由于个别资源长期被其他进程占用,将致使等待该资源的进程迟迟不能开始运行。
4.破坏循环等待条件:
为了破坏循环等待条件,可采用顺序资源分配法。首先给系统中的资源编号,规定每个进程,必须按编号递增的顺序请求资源,同类资源一次申请完。也就是
说,只要进程提出申请分配资源 Ri ,则该进程在以后的资源申请中,只能申请编号大于 Ri 的资源。
这种方法存在的问题是,必须编号相对稳定,这就限制了新类型设备的增加;尽管在为资源编号时已考虑到大多数作业实际使用这些资源的顺序,但也经常会
发生作业使用资源的顺序与系统规定顺序不同的情况,造成资源的浪费;此外,这种按规定次序申请资源的方法,也必然会给用户的编程带来麻烦。