deadlock
来源:互联网 发布:编程用笔记本 编辑:程序博客网 时间:2024/05/16 18:51
死锁形成的原因是不同进程所持有和申请的锁形成了一个环,出现死锁一般表明程序代码中有bug。
在Linux内核中,为了避免死锁,有几条措施:
1 spin lock获得后不会发生进程调度;
2 获取多把spin lock时,所有进程按照锁的地址大小顺序获取;
3 要使用多个锁的子系统中,对各种锁的使用会形成一个获取顺序的约定,(可参考mm/rmap.c)
4 Linux内核中有一个nmi不可屏蔽中断,如果系统发现关中断时间过长,就会认为发生了死锁,触发这个中断。当然这种措施并不能发现那些未关中断获取的锁导致的死锁。
总而言之,死锁是一种bug,linux内核中并没有什么能够在系统发生死锁之后还能够恢复过来的机制。 不过美国washington大学的Nooks项目好像在这方面有些改进。(参见http://nooks.cs.washington.edu/)
在Linux内核中,为了避免死锁,有几条措施:
1 spin lock获得后不会发生进程调度;
2 获取多把spin lock时,所有进程按照锁的地址大小顺序获取;
3 要使用多个锁的子系统中,对各种锁的使用会形成一个获取顺序的约定,(可参考mm/rmap.c)
4 Linux内核中有一个nmi不可屏蔽中断,如果系统发现关中断时间过长,就会认为发生了死锁,触发这个中断。当然这种措施并不能发现那些未关中断获取的锁导致的死锁。
总而言之,死锁是一种bug,linux内核中并没有什么能够在系统发生死锁之后还能够恢复过来的机制。 不过美国washington大学的Nooks项目好像在这方面有些改进。(参见http://nooks.cs.washington.edu/)
说得好,系统最好能尽可能的检测到死锁的发生,然后直接panic来个核心转储,这样有利于分析和解决问题。
Solaris就是这样做的,部分死锁就会被内核检测并panic。
银行家算法就是个学院派的东西,我至今没看到哪个系统用这种方法预防死锁!用一句话来概括就是:理论上可
行的东西,实践上未必可行!
通常避免死锁类的方法,实现起来都不可行,包括单一资源和多种资源的银行家算法,以及两阶段加锁法。
应用的比较多的是死锁的检测和预防,死锁产生的有下列四个条件:
1、互斥
2、占有且等待
3、不可抢占
4、环路等待
这四个条件都是死锁发生所必须的条件,只要破坏这其中的某一个条件就行了
- Deadlock
- deadlock
- Deadlock
- Deadlock
- DeadLock
- DeadLock
- Deadlock
- deadLock
- 死锁(deadlock)
- Oracle Deadlock
- Deadlock --- 死锁
- python deadlock
- Deadlock troubleshooting
- DeadLock Lesson
- go deadlock
- DeadLock Prevention
- 死锁deadlock
- deadlock avoidance
- DOM和IE跨浏览器的事件对象
- 模拟Context调用
- C# 获取当前时间,格式化输出
- Java开发中的23种设计模式之十:桥接模式(Bridge)
- 归并排序
- deadlock
- <meta http-equiv=名称 content=值>
- 1048. Find Coins (25)
- 固定序列找相差最小的一组(2014华为应届毕业生上机笔试试题)
- java静态变量
- HTML5又一个例子:KineticJS加入画布设置行,大家觉得怎么样?
- putty的全屏与退出,SecureCRT的全屏与退出
- Java多线程-工具篇-BlockingQueue
- Java开发中的23种设计模式之十一:组合模式(Composite)