前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >宋宝华: Linux死锁的成因和常规调试方法(预告片)

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

作者头像
Linux阅码场
发布2019-11-23 20:53:20
6060
发布2019-11-23 20:53:20
举报
文章被收录于专栏:LINUX阅码场LINUX阅码场

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

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

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

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

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

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

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

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Linux阅码场 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档