宋宝华: Linux死锁的成因和常规调试方法(预告片)

有一次给一群码农演讲,我喷口水喷了快一个小时,说spinlock等的正确使用以及死锁的原因。下面有个人突然问,“老师,请问什么叫死锁?”。

我心里想,把这个人拉出去枪毙一万次 :-) ,你这样是怎么做了几年码农的?这样民族自强的机会在哪里?但是我还是耐心地跟他解答了。我跟他说:“死锁就是我们两约好一起去跳楼,然后我们都跑到了顶层88楼的天台,然后我跟你说一句,'you jump, I jump',你也跟我说一句'you jump, I jump',最后你特马也没jump,我特马也没jump,所以跳楼这个壮举就算是因为死锁而永久地搞不下去了。”然后我问他明白了没有,他说:“没听懂”。这个时候我狠不得把自己拉出去枪毙一万次......

以上段子来源于真实事件,如有雷同,纯属巧合。哈哈哈哈。

言归正传,我们来看看死锁的几种形成原因。我认为起码有三种:

1.自己掉坑里了,这种我姑且简称自杀型。行动特征:

640?wx_fmt=png

有人说,死锁不是两个人的事情吗?一个人也能自己把自己玩死?真的是可以的。最简单的自杀型就是在10号中断服务程序里面调用irq_disable(10),因为irq_disable()会执行一个同步,等正在执行的10号中断服务程序执行完,才继续disable 10号中断的动作。在10号中断服务程序里面调用irq_disable(10),等于在自己里面等自己结束,而自己结束又必须irq_disable(10)返回。

2.A等B做完某事才能继续,B也等A做完某事才能继续;这种我姑且称为互杀型。行动特征:

640?wx_fmt=png

3.A等B做完某事才能继续,B等C做完某事才能继续,C等A做完某事才能继续;这种我姑且称为群殴型。行动特征:

640?wx_fmt=png

互杀型应该是最简单也最容易理解的,我们先从互杀型开始。下面的代码演示中2个线程child1和child2,展示了最简单的互杀模型:

640?wx_fmt=png

周末大家早点回家休息,读过一个愉快的周末!

周一见~~~,周一早8点准时推送全文

感谢您对Linux阅码场公众号的支持!


更多精彩,尽在"Linux阅码场",扫描下方二维码关注

640?wx_fmt=png

你的随手转发或点个在看是对我们最大的支持!

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宋宝华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值