linux中的死锁

来源:互联网 发布:类似于企查查的软件 编辑:程序博客网 时间:2024/06/05 10:58

死锁:是指两个或两个以上的进程(线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于“死锁”状态或系统产生了死锁,这些永远在互相等待的进程(线程)称为死锁进程(线程)。由于资源占用时互斥的,当某个进程提出申请资源后,使得有关进程(线程)在无外力协助下,永远分配不到必备的资源而无法运行,这就产生了一种特殊现象死锁。

一种交叉等待死锁的情形,此时执行程序中两个或多个线程发生永久堵塞(等待),每个线程都在等待被其他线程占用并堵塞的资源。例如,如果线程1锁住了记录A并等待记录B,而线程2锁住了记录B并等待记录A,这样两个线程就发生了死锁现象。

死锁的条件:

1.互斥:一次只有一个进程可以使用一个资源,其他进程不能访问已分配给其他进程的资源。

2.占有且等待:当一个进程等待其他进程时,继续占有已分配的资源。

3.不可抢占:不能强行抢占进程已占有的资源。

在很多情况下这些条件都是合乎要求的。例如,为确保结果的一致性和数据库的完整性,互斥是非常有必要的。同理,不能随意的进行资源抢占。比如,当涉及数据资源时,必须提供回滚恢复机制(rollback recovery machanism)以支持抢占资源,这样才能把进程和他的资源恢复到以前适当的状态,使得进程最终可以重复他的动作。

前三个条件都是死锁存在的必要条件,但不是充分条件。对死锁的产生还需要第四个条件:

4.循环等待:存在一个封闭的进程链,使得每个进程至少占有此链中下一个进程所需要的一个资源。

死锁避免:

在死锁预防中通过约束资源请求,防止四个死锁条件中至少一个的发生。这可以通过防止发生三个必要策略条件中的一个(互斥、占有且等待、非抢占)间接完成,也可以通过防止循环等待直接完成,但这都会导致低效的资源使用和低效的进程执行。死锁避免则相反,它允许三个必要条件,但通过明智的选择,确保永远不会到达死锁点,因此死锁避免需要更多地并发。在死锁避免中,是否允许当前的资源分配请求是通过判断该请求是否可能导致死锁来决定的。因此,死锁避免需要知道将来的进程资源请求的情况。

两种避免死锁的方法:

1.如果一个进程的请求会导致死锁,则不启动此进程。

2.如果一个进程增加的资源请求会导致死锁,则不允许此分配。

0 0