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/)


说得好,系统最好能尽可能的检测到死锁的发生,然后直接panic来个核心转储,这样有利于分析和解决问题。

Solaris就是这样做的,部分死锁就会被内核检测并panic。


银行家算法就是个学院派的东西,我至今没看到哪个系统用这种方法预防死锁!用一句话来概括就是:理论上可

行的东西,实践上未必可行!

通常避免死锁类的方法,实现起来都不可行,包括单一资源和多种资源的银行家算法,以及两阶段加锁法。

应用的比较多的是死锁的检测和预防,死锁产生的有下列四个条件:

1、互斥

2、占有且等待

3、不可抢占

4、环路等待

这四个条件都是死锁发生所必须的条件,只要破坏这其中的某一个条件就行了

原创粉丝点击