关闭

死锁

724人阅读 评论(0) 收藏 举报
分类:

在多道程序系统中,由于多个进程的并发执行,改善了系统资源的利用率并提高了系统的处理能力。然而,多个进程的并发执行也带来了新的问题——死锁。所谓死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。

原理

我在进程与线程这篇文章中提到过死锁,大家可以看一下。

了解了死锁的定义,我们来看一看死锁产生的原因

1.  竞争资源。当系统中供多个进程共享的资源如打印机、公用队列等,其数目不足以满足诸进程的需要时,会引起诸进程对资源的竞争而产生死锁;

2.  进程间推进顺序非法。进程在运行过程中,请求和释放资源的顺序不当,也同样会导致产生进程死锁。比如信号量使用不当,具体的案例可以参考进程与线程。

 

产生死锁必须同时满足以下四个条件,只要其中任一条不成立,死锁就不会发生。

1.      互斥条件:进程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。

2.      不剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能 由获得该资源的进程自己来释放(只能是主动释放)。

3.      请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放

4.      循环等待条件:存在一种进程资源的循环等待链,链中每一个进程已获得的资源同时被链中下一个进程所请求。即存在一个处于等待状态的进程集合{Pl, P2, ..., pn},其中Pi等待的资源被P(i+1)占有(i=0, 1, ..., n-1),Pn等待的资源被P0占有,如图所示。


为使系统不发生死锁,必须设法破坏产生死锁的四个必要条件之一,或者允许死锁产生,但当死锁发生时能检测出死锁,并有能力实现恢复。目前,处理死锁的方法可以归为以下四类:

预防死锁:设置某些限制条件,破坏产生死锁的四个必要条件中的一个或几个,以防止发生死锁。这是一种比较容易实现的方法,已被广泛使用,但是由于所施加的限制条件往往太过于严格,可能导致系统资源利用率和系统吞吐量降低。

避免死锁:在资源的动态分配过程中,用某种方法防止系统进入不安全状态,从而避免死锁。

这种方法只需要事先施加较弱的限制条件,便可以获得较高的资源利用率和系统吞吐量,但是实现上有一定困难。

检测死锁:允许系统在运行过程中发生死锁,但可以通过系统所设置的检测机构及时地检测出死锁的发生,并精确地确定与死锁有关的进程和资源,然后将已发生的死锁清除。

解除死锁:在是与检测死锁配套的措施,通过撤销或者挂起某些进程,来回收一部分资源将这些资源分配给阻塞状态的进程,使之转为就绪状态。这种方法实现起来是最难的。

 

饥饿

与死锁相关的另一个问题是无限期阻塞(Indefinite Blocking)或“饥饿” (Starvation),即进程在信号量内无穷等待的情况。

产生饥饿的主要原因是:在一个动态系统中,对于每类系统资源,操作系统需要确定一个分配策略,当多个进程同时申请某类资源时,由分配策略确定资源分配给进程的次序。有时资源分配策略可能是不公平的,即不能保证等待时间上界的存在。在这种情况下,即使系统没有发生死锁,某些进程也可能会长时间等待。当等待时间给进程推进和响应带来明显影响时,称发生了进程“饥饿”,当“饥饿”到一定程度的进程所赋予的任务即使完成也不再具有实际意义时称该进程被“饿死”。

饥饿”并不表示系统一定死锁,但至少有一个进程的执行被无限期推迟。“饥饿”与死锁的主要差别有:

进入“饥饿”状态的进程可以只有一个,而由于循环等待条件而进入死锁状态的进程却必须大于或等于两个。

处于“饥饿”状态的进程可以是一个就绪进程,如静态优先权调度算法时的低优先权进程,而处于死锁状态的进程则必定是阻塞进程。

我在调度算法中有提到过饥饿这个状态,大家可以去看一看。



1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:248770次
    • 积分:4149
    • 等级:
    • 排名:第7737名
    • 原创:146篇
    • 转载:0篇
    • 译文:0篇
    • 评论:78条
    博客专栏