产生死锁的必要条件:
1. 互斥条件:就是一个资源同时只能有一个进程占有,不能有两个或是两个以上的占有。
2. 不可抢占条件:在一个进程所获取的资源在未使用完毕之前,资源申请者不能强行的从资源占有者手中抢夺资源。
3. 占有申请条件:进程已经占有了一个资源,但是有申请新的资源;但是新申请的资源已经被别的进程占有了,此时该进程就会阻塞,但是在获取申请的资源之前他还会一直占有已占有的那个资源。
4. 循环等待条件:存在一个循环等待序列,p1等待p2,p2等待p3,p3等待p1。形成一个进程循环等待。
上述四个条件在死锁是会同时发送,也就是只要一个必要条件不通过,则就不会产生死锁。
静态策略:避免死锁
(1)打破互斥条件:允许进程同时访问某些资源,但是,有的资源不允许被同时访问。
(2)打破不可抢占的条件:就是说允许进程强行从资源的占有者那里抢夺资源。这种方法实现起来很困难,会降低性能。
(3) 打破占有申请条件:可以实现资源预先分配策略,在进程运行前一次性向系统申请他所需要的全部资源。如果进程所需的资源不能满足,则不分配任何资源,进程暂时不运行。(问题:1.在很多时候,一个进程在执行之前不可能知道它所有的全部资源,进程在执行的过程中,是动态的。2.资源利用率低。3.降低进程的并发性,因为资源有效,有加上存在浪费,能分配的所需全部资源的进程个数必然很少。)
(4)打破循环等待条件:实行资源的有序分配策略,把资源事先分类编号,按号分配,使进程在申请,占用资源时候不能形成环路,所有进程对资源的请求必须严格按照资源号递增的顺序提出,进程占用了小号的资源,才能申请大号资源。就会形成环路。(缺点:限制进程对资源的请求,同时对系统中的所有资源合理编号也是很有困难的,增加额外的系统开销。)
动态策略:银行家算法可以避免死锁
银行家算法需要确保以下四点:
当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客顾客可以分期贷款, 但贷款的总数不能超过最大需求量
当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可- 推迟支付