首先,我们来了解一下什么是进程死锁。
所谓进程死锁,就是如果多个进程同时占有对方需要的资源而同时请求对方的资源,而它们在得到请求之前不会释放所占有的资源,那么就会导致死锁的的发生,也就是进程不能实现同步。
产生死锁的原因:
1.系统资源不同。
2.进程(线程)推进的顺序不当。
3.资源分配不当。
产生死锁的四个必要条件:
1.互斥条件:资源不能共享,只能由一个进程使用。
2.请求与保持条件:已经得到资源的进程可以再次申请新的资源。
3.非剥夺资源:已经分配的资源不能从相应的进程中被强制地剥夺。
4.循环等待条件:系统中若干进程组成环路,该环路中每个进程在等待相邻进程正占用的资源。
那么如何避免死锁的产生,前面提到死锁的产生需要满足其必要条件,那么要避免死锁就要破坏其必要条件。但死锁的互斥条件不可破坏,进程(线程)对临界资源的访问必须保证互斥。
基本思想:
允许三个必要条件存在,系统在进行资源分配之前,应先计算此次资源分配后状态的安全性。若此次分配后的状态是安全状态,则将资源分配给进程,否则,令进程等待。
避免死锁的算法:
银行家算法:是一个避免死锁的著名算法,是由艾兹格迪杰斯特拉在1965年为T.H.E系统设计的一种算法。它以银行
借贷系统的分配策略为基础,判断并保证系统的安全运行。
背景知识:
在银行中,客户申请贷款的数量是有限的,每个客户在第一次申请贷款时要声明完成该项目所需的最大资金量,在满足所有贷款要求时,客户应及时归还。银行家在客户申请的贷款数量不超过自己拥有的最大值时,都应尽量满足客户的需要。在这样的描述中,银行家就好比操作系统,资金就是资源,客户就相当于要申请资源的进程,
银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。为实现银行家算法,系统必须设置若干的数据结构。
要解释银行家算法,必须先解释操作系统安全状态和不安全状态。
安全序列是指一个进程序列{P1,...,Pn}是安全的,即对于每一个进程Pi,它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj( j<i )当前占有资源量之和。
安全状态:
如果存在一个由系统中所有进程构成的安全序列P1,...,Pn,则系统处于安全状态。安全状态一定是没有死锁发生。
不安全状态:
不存在一个安全序列。不安全状态不一定导致死锁。
算法原理:
我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。为保证资金安全,规定:
1.当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客;
2.顾客可以分期贷款,但贷款的总数不能超过最大需求量;
3.当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款。
4.当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金。
操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。若超过则拒绝分配资源,若能满足则按当前的申请量分配资源,否则也要推迟分配。