Linux多线程_死锁

死锁

1、死锁产生的原因

    死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若是无外力作用,他们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

    一个简单的例子,哲学家进餐问题。假如有五个哲学家围坐在一张圆桌上思考问题,每个人的左手边和右手边各有一只筷子,当哲学家饿了,会拿起左右两边的筷子进餐,如果能拿到两只筷子,就可以进餐,如果不能,就只能等旁边的哲学家将筷子用完放回来才可以得到两只筷子,如果五个哲学家同时拿起了自己左手或者右手的筷子,那么谁也无法获得两只筷子,也就都不能进餐,那么会一直陷入等待。这就是一个典型的死锁问题。

2、死锁产生的条件

    虽然进程在运行过程中,可能发生死锁,但是死锁的发生也必须具备一定的条件,死锁的发生必须具备以下四个必要条件:

    1)互斥条件:指进程对分配到的资源进行排他使用。即在一段时间内某资源只由一个进程占用。如果此时还有其他进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。

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

    3)不剥夺条件:指进程已经获得的资源,在未使用完成之前,不能被剥夺,只能在使用完了之后由自己释放。

    4)环路等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,...,Pn}中的P0正在等待一个P1占用的一个资源;P1正在等待P2占用的资源,Pn正在等待被P0占用的资源。

死锁的预防

    理解了死锁产生的原因,主要是四个必要条件,可以避免、预防和解除死锁。只要打破四个必要条件之一就能有效地预防死锁的发生。

死锁的处理:

    在系统中已经出现死锁后,应当及时检测到死锁的产生并采取合适的措施来解除死锁。

    死锁预防:

    这是一种简单的事先预防的方式,通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或者几个,来预防发生死锁。预防死锁是比较容易的方法,但是由于所施加的限制条件往往比较严格。可能会导致系统资源利用率低或者吞吐量变低。

    死锁避免:

    系统对于进程发出的每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,如果分配后系统可能发生死锁,则不予分配,否则予以分配。这是一种保证系统不会进入死锁的动态策略。

    死锁检测和解除:

    先检测:这种方法不须事先采取任何限制性措施,也不必检查系统是否已经进入不安全区,此方法允许系统在运行过程中发生死锁。但可通过系统所设置的检测机构,及时地检测出死锁的发生,并精确地确定与死锁有关的进程和资源。检测方法包括定是检测,效率低时检测。进程等待时检测等。

    然后解除死锁:采取适当措施。从系统中将已经发生的死锁清除掉。

猜你喜欢

转载自blog.csdn.net/qq_40425540/article/details/80165469