免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3143 | 回复: 6
打印 上一主题 下一主题

[中断] 为什么获取spin_lock之前要先关掉中断 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-04-27 20:54 |只看该作者 |倒序浏览
没看明白怎么会造成死锁?


假如驱动中某个接口A
spin_lock(&lock)
//do something

spin_unlock(&lock)

在do something期间,中断来了,在中断中也要获取lock这个锁,于是

//interrupt
spin_lock(&lock)

这时,中断调用了spin_lock()想获取lock这个锁,但是它已经被占用了,中断就只好等着它被释放,可是接口A有可能释放lock吗? 如果中断不退出,(1)cpu的运行环境就恢复不回去执行接口A吗?
(2)如果中断在调用spin_lock()获取lock之前关掉硬件中断,再调用spin_lock()来获取lock,显然它也是不能获取到的,也需要等,此时是说因为中断已经给关上了,所以它在等待期间会被切换到其他进程吗?也就是说开中断的时候是原子的,不能被切换出去的?

论坛徽章:
0
2 [报告]
发表于 2013-04-27 22:30 |只看该作者
   没看太明白你的意思,不过即使关中断的话,也应该是在驱动程序加锁spin_lock之前关中断,防止加锁期间被中断打断出现的死锁。

论坛徽章:
0
3 [报告]
发表于 2013-04-27 23:00 |只看该作者
luoyan_xy 发表于 2013-04-27 22:30
没看太明白你的意思,不过即使关中断的话,也应该是在驱动程序加锁spin_lock之前关中断,防止加锁期间被 ...


其实就一个疑问:为什么在加锁spin_lock之前关中断就可以达到防止死锁的发生?

上面我的帖子里有一些是我自言自语的。。。。

论坛徽章:
0
4 [报告]
发表于 2013-04-28 10:07 |只看该作者
为什么在加锁spin_lock之前关中断就可以达到防止死锁的发生?
其实你自己已经回答了。我给你梳理一下。
如果没有关中断,若在do something中发送了中断,在中断中,若调用spin_lock()想获取lock这个锁,
在中断中不能产生调度,在中断返回时才可能发生调度,因此,不会回来处理do something,
因此就形成了死锁。

所以如果中断和普通的线程使用同个spinlock,那么必须加锁。

论坛徽章:
0
5 [报告]
发表于 2013-04-28 17:04 |只看该作者
回复 1# testh
需要和中断服务程序互斥,如果你需要互斥寄存器这些。用spin_lock_irqsave/irqrestore. 如果是自己的数据,你看看trylock,能不能满足你的要求。不能的话,同样需要前面两个接口。

   

论坛徽章:
0
6 [报告]
发表于 2013-05-01 15:27 |只看该作者
jwwzhh 发表于 2013-04-28 10:07
为什么在加锁spin_lock之前关中断就可以达到防止死锁的发生?
其实你自己已经回答了。我给你梳理一下。
如 ...

感谢梳理。

论坛徽章:
0
7 [报告]
发表于 2013-05-01 15:28 |只看该作者
回复 5# xs3c


    是的,谢谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP