死锁及死锁的解决
什么是死锁
如果一组进程中的每一个进程都在等待仅由该组进程中的其它进程才能引发的事件,那么该组进程是死锁的,
死锁产生的原因
(1)竞争不可抢占性资源。
当系统把某资源分配给该进程后,就不能将它强行收回,只能在进程用完后自行释放。
(2)竞争可消耗资源。
当系统中供多个进程共享的资源如打印机,公用队列等,其数目不足以满足诸进程的需要时,会引起诸进程对资源的竞争而产生死锁。
(3)进程推进顺序不当。
进程在运行过程中,请求和释放资源的顺序不当,也同样会导致产生进程死锁。
必须要注意:一个线程也可引起死锁。
死锁产生的四个必要条件
(1) 互斥条件:
一个资源每次只能被一个进程使用。
(2) 请求和保持条件:
一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不可抢占条件:
进程已获得的资源,在末使用完之前,不能强行剥夺,只能在进程使用完时由自己释放。
(4) 循环等待条件:
若干进程之间形成一种头尾相接的循环等待资源关系。
避免死锁的方法
(1)破坏“互斥”条件:
就是在系统里取消互斥。若资源不被一个进程独占使用,那么死锁是肯定不会发生的。但一般“互斥”条件是无法破坏的。
(2)破坏“请求和保持”条件
方法一:所有进程在运行之前,必须一次性地申请在整个运行过程中所需的全部资源。
优点:简单、易行且安全。
缺点:a.资源被严重浪费,严重恶化了资源的利用率。
b.使进程经常会发生饥饿现象。
方法二:要求每个进程提出新的资源申请前,释放它所占有的资源。
(3)破坏“不可抢占”条件:
允许对资源实行抢夺。
方法一:如果占有某些资源的一个进程进行进一步资源请求被拒绝,则该进程必须释放它最初占有的资源,如果有必要,可再次请求这些资源和另外的资源。
方法二:如果一个进程请求当前被另一个进程占有的一个资源,则操作系统可以抢占另一个进程,要求它释放资源。只有在任意两个进程的优先级都不相同的条件下,该方法才能预防死锁。
(4)破坏“循环等待”条件:
将系统中的所有资源统一编号,进程可在任何时刻提出资源申请,但所有申请必须按照资源的编号顺序(升序)提出。这样做就能保证系统不出现死锁。
死锁解除的两种方法
1) 抢占资源。
从一个或多个进程中抢占足够数量的资源,分配给死锁进程,以解除死锁状态。
2) 终止(或撤销)进程。
终止(或撤销)系统中的一个或多个死锁进程,直至打破循环环路,使系统从死锁状态解脱出来。