题记:也许真的老了,半夜coding的质量已经退化了。。。也许还没老,因为半夜还能看出哪里死锁了...
1. 法则(待补充):
(1) 读写锁不能嵌套
(2) 读锁不能升级为写锁
(3) 当进程上下文,bh上下文,中断上下文共用临界区域时,要证只在最高优先级的情况下持有锁
2. 法则之外:
(1) 除了锁,还有别的同步方法。锁不是最高效的。
(2) 如果在循环中反复地加锁解锁,或者增减使用/引用计数时,小心地管理每一个循环出口。
(3) 在检查死锁问题中,二分printk的方法依然很有效。
(4) 2.6的高版本内核中,有spin lock的检查模块。
最近发现的几个死锁问题:
循环中逻辑较复杂地反复加锁解锁,写挂了...这个属于比较傻的问题,这里就不再详述了。
进程上下文和软中断上下文共同使用了一块临界区,进程上下文如果hold住spin lock之后,被中断打断,中断结束后在同一个核上调用了软中断,而软中断在玩命等这个倒霉的spin lock被释放,遥遥无期。。。那一个核就此不再干活。[以前与这个问题类似的一个死锁问题是proc依靠timer更新,但读取的时候是在进程上下文,加锁保护不当,挂掉。]
阅读(1573) | 评论(0) | 转发(0) |