什么是死锁?产生的条件?如何避免?

死锁:一般情况下,如果同一个线程先后两次调用lock,在第一次调用时,由于锁已经被占用,该线程会挂起等待别的线程释放锁,然而锁正是被自己占用着的,该线程又被挂起而没有机会释放锁,因此 就永远处于挂起等待状态了,这叫做死锁(Deadlock)。 另一种典型的死锁情形是这样:线程A获 得了锁1,线程B获得了锁2,这时线程A调lock试图获得锁2,结果是需要挂起等待线程B释放 锁2,这时线程B也调用lock试图获得锁1,结果是需要挂起等待线程A释放锁1,于是线程A和B都 永远处于挂起状态了。

产生的条件:

互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。

请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。

非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。

循环等待条件(Circular wait):系统中若干进程组成环路,改环路中每个进程都在等待相邻进程正占用的资源。

如何避免:

1.忽略该问题。例如鸵鸟算法,该算法可以应用在极少发生死锁的的情况下。为什么叫鸵鸟算法呢,因为传说中鸵鸟看到危险就把头埋在地底下,可能鸵鸟觉得看不到危险也就没危险了吧。跟掩耳盗铃有点像。

2.检测死锁并且恢复。

3.仔细地对资源进行动态分配,以避免死锁。

4.通过破除死锁四个必要条件之一,来防止死锁产生。

时间: 2024-10-12 21:12:53

什么是死锁?产生的条件?如何避免?的相关文章

详细分析死锁产生的条件与原因

一.定义 死锁:集合中的每一个进程都在等待只能由本集合中的其他进程才能引发的事件,那么该组进程是死锁的. 由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了死锁这一特殊现象. 二.产生死锁的必要条件 1)互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用.如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程 用毕释放. 2)请求和保持条件:指进程已经保持至少一个资源,但又提出

死锁产生的条件以及解决方法

本文主要讲为什么会产生死锁?如何避免以及发生死锁该如何恢复死锁? 产生死锁的四个必要条件:(1) 互斥条件:一个资源每次只能被一个进程使用.(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放.(3) 不可剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺.(4) 环路等待条件:若干进程之间形成一种头尾相接的循环等待资源关系.只要系统发生了死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁. 1.预防死锁预防死锁的发生只需破坏死锁产生的四个必要条件之一即

【操作系统-死锁】死锁发生的条件是什么?死锁的避免和预防方法

digest:本文章简要概述操作系统死锁的原因以及预防和解决方法. 1.死锁的定义 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种进程间相互阻塞的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程.                                                                ——汤小丹等.<计算机操作系统>:西安电子科技大学出版社,2012.

死锁产生的条件与避免方法

所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程.由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁. 死锁的发生必须具备以下四个必要条件: (1)互匙条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用.如果此时还有其它进程请求资

死锁的产生条件和预防处理

所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程.由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁. 虽然进程在运行过程中,可能发生死锁,但死锁的发生也必须具备一定的条件,死锁的发生必须具备以下四个必要条件. 1)互斥条件: 指进程对所分配到的资源进行排它性

死锁产生的原因和条件简述

深入理解死锁产生的原因和条件,对于日后避免死锁的产生有着非常重要的意义.死锁产生的原因主要是竞争资源,其产生的条件包括资源互斥.请求保持.不能剥夺和循环等待. 死锁产生的根本原因是资源竞争.如果若干个线程正常运行,遇到彼此需要对方占有的资源时,就可能产生线程死锁.如果若干个线程异常运行,资源的请求与释放的顺序不当,也可能产生死锁. 死锁产生的条件包括以下4点: 资源互斥:即资源仅能让一个线程使用而不支持多个线程同时使用. 请求保持:已经拥有资源的线程在请求其他资源时并没有释放当前资源. 不能剥夺

关于死锁的一些概念

1.死锁:如果一组进程中的每一个进程都在等待仅由该组进程中的其它进程才能引发的事件,那么该组进程是死锁的. 2.产生死锁的原因: (1)竞争不可抢占性资源. (2)竞争可消耗资源. 当系统中供多个进程共享的资源如打印机,公用队列等,其数目不足以满足诸进程的需要时,会引起诸进程对资源的竞争而产生死锁. (3)进程推进顺序不当. 进程在运行过程中,请求和释放资源的顺序不当,也同样会导致产生进程死锁.如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入

Linux环境下线程的同步与互斥以及死锁问题

由于本次要讨论操作系统的死锁问题,所以必须先研究的是linux环境下的线程同步与互斥 先看下面的代码 大家猜想输出应该是什么呢? 结果是下面这个样子 好吧,似乎并没有什么区别... 那么下面再看这段代码(请无视并忽略屏蔽的内容...) 大家猜想正确的结果是什么呢?5000,10000? 好吧,或许你们都错了. 在运行了一段时间后,它的结果是这样的. 是不是又对又错? 为什么呢? 这就是因为程序中printf语句作用:本身是库函数,所以必须进行系统调用,必须进入内核进行切换,有很大概率形成数据的混

死锁产生的原因、必要条件和场景解析·

死锁是是进程死锁的简称,指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进.它是计算机操作系统乃至并发程序设计中最难处理的问题之一. 举个简单的例子,系统中只有一台CD-ROM驱动器和一台打印机,某一个进程占有了CD-ROM驱动器,又申请打印机:另一进程占有了打印机,还申请CD-ROM.结果,两个进程都被阻塞,永远也不能自行解除.这就是死锁. 产生死锁的主要原因有三点: (一)系统资源不足: (二)进程运行推进的顺序不对: (三)系统

线程的同步与互斥,死锁

线程的同步与互斥 多个线程同时访问共享数据时可能会发生冲突,比如两个线程同时把一个全局变量加1,结果可能不是我们所期待的: 我们看这段代码的执行结果: #include <stdio.h> #include <stdlib.h> #include <pthread.h> static int g_count=0; void *thread(void *arg) { int index=0; int tmp=0; while(index++<5000) { tmp=