死锁
2016-07-29 22:59
323 查看
死锁的定义:
如果一组进程(线程)中的每一个进程(线程)都在等待仅由该组进程(线程)中的其他进程(线程)才能引发的事件,那么该组进程(线程)是死锁的。
常见的死锁现象是如何产生的呢?
一般情况下,如果同一个线程先后两次调用lock,在第二次调用时,由于锁已经被占用,该线程会挂起等待别的线程释放锁,然而锁正是被自己占用着的,该线程又被挂起而没有机会释放锁, 因此就永远处于挂起等待状态了,这叫做死锁(Deadlock)。另一种典型的死锁情形是这样:线程A获得了锁1,线程B获得了锁2,这时线程A调用lock试图获得锁2,结果是需要挂起等待线程 B释放锁2,而这时线程B也调用lock试图获得锁1,结果是需要挂起等待线程A释放锁1,于是线程A和B都永远处于挂起状态了。
产生死锁的四个必要条件:
1.互斥条件:一个资源在同一时刻只能被一个进程占用,直到该资源被该进程释放。
2.请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已经被其他进程占有,此时请求进程被阻塞,但对自己已经获得的资源保持不放。
3.不可抢占条件:进程已获得的资源在未使用完之前不能被剥夺,只能在进程使用完时由自己释放。
4.循环等待条件:在发生死锁时,若干进程之间必然存在头尾相接的循环等待资源的关系链。
那如何来处理死锁呢?目前主要有以下几种方法来处理:
1.预防死锁。
这是一种较简单和直观的事先预防的方法。方法是通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或者几个,来预防发生死锁。预防死锁是一种较易实现的方法,已被广泛使用。但是由于所施加的限制条件往往太严格,可能会导致系统资源利用率和系统吞吐量降低。
2.避免死锁。
该方法同样是属于事先预防的策略,但它并不须事先采取各种限制措施去破坏产生死锁的的四个必要条件,而是在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。
3.检测死锁。
这种方法并不须事先采取任何限制性措施,也不必检查系统是否已经进入不安全区,此方法允许系统在运行过程中发生死锁。但可通过系统所设置的检测机构,及时地检测出死锁的发生,并精确地确定与死锁有关的进程和资源,然后采取适当措施,从系统中将已发生的死锁清除掉。
4.解除死锁。
这是与检测死锁相配套的一种措施。当检测到系统中已发生死锁时,须将进程从死锁状态中解脱出来。常用的实施方法是撤销或挂起一些进程,以便回收一些资源,再将这些资源分配给已处于阻塞状态的进程,使之转为就绪状态,以继续运行。死锁的检测和解除措施,有可能使系统获得较好的资源利用率和吞吐量,但在实现上难度也最大。
如果一组进程(线程)中的每一个进程(线程)都在等待仅由该组进程(线程)中的其他进程(线程)才能引发的事件,那么该组进程(线程)是死锁的。
常见的死锁现象是如何产生的呢?
一般情况下,如果同一个线程先后两次调用lock,在第二次调用时,由于锁已经被占用,该线程会挂起等待别的线程释放锁,然而锁正是被自己占用着的,该线程又被挂起而没有机会释放锁, 因此就永远处于挂起等待状态了,这叫做死锁(Deadlock)。另一种典型的死锁情形是这样:线程A获得了锁1,线程B获得了锁2,这时线程A调用lock试图获得锁2,结果是需要挂起等待线程 B释放锁2,而这时线程B也调用lock试图获得锁1,结果是需要挂起等待线程A释放锁1,于是线程A和B都永远处于挂起状态了。
产生死锁的四个必要条件:
1.互斥条件:一个资源在同一时刻只能被一个进程占用,直到该资源被该进程释放。
2.请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已经被其他进程占有,此时请求进程被阻塞,但对自己已经获得的资源保持不放。
3.不可抢占条件:进程已获得的资源在未使用完之前不能被剥夺,只能在进程使用完时由自己释放。
4.循环等待条件:在发生死锁时,若干进程之间必然存在头尾相接的循环等待资源的关系链。
那如何来处理死锁呢?目前主要有以下几种方法来处理:
1.预防死锁。
这是一种较简单和直观的事先预防的方法。方法是通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或者几个,来预防发生死锁。预防死锁是一种较易实现的方法,已被广泛使用。但是由于所施加的限制条件往往太严格,可能会导致系统资源利用率和系统吞吐量降低。
2.避免死锁。
该方法同样是属于事先预防的策略,但它并不须事先采取各种限制措施去破坏产生死锁的的四个必要条件,而是在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。
3.检测死锁。
这种方法并不须事先采取任何限制性措施,也不必检查系统是否已经进入不安全区,此方法允许系统在运行过程中发生死锁。但可通过系统所设置的检测机构,及时地检测出死锁的发生,并精确地确定与死锁有关的进程和资源,然后采取适当措施,从系统中将已发生的死锁清除掉。
4.解除死锁。
这是与检测死锁相配套的一种措施。当检测到系统中已发生死锁时,须将进程从死锁状态中解脱出来。常用的实施方法是撤销或挂起一些进程,以便回收一些资源,再将这些资源分配给已处于阻塞状态的进程,使之转为就绪状态,以继续运行。死锁的检测和解除措施,有可能使系统获得较好的资源利用率和吞吐量,但在实现上难度也最大。
相关文章推荐
- 校外实习-7.29
- 标识符起作用范围----作用域、连接类型、存储期
- Badboy+Jmeter性能测试搭建
- spark实战:对日志进行查询
- 简单链表
- Android Studio 快捷键
- activemq listener 配置问题
- Timer vs TimerTask
- 【POJ1562】Oil Deposits
- linux使用GDB 调试
- 剑指offer——二叉树的镜像
- android NDK 获取本机IP
- Android之在ubuntu过滤日志以及ps总结
- Efi Ext驱动支持
- replace的用法及其几种案例
- HDU 1227 Fast Food (DP)
- IntentFilter的匹配规则
- 使用 RequireJS 优化 Web 应用前端
- MD(markdown)语法
- IndexOf的几种用法