死锁形成的原因是不同进程所持有和申请的锁形成了一个环,出现死锁一般表明程序代码中有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、环路等待
这四个条件都是死锁发生所必须的条件,只要破坏这其中的某一个条件就行了