关于linux内核中自旋锁

进行中 2013-06-30 02:41:29
在linux内核设计与实现时看到一句话“在中断处理程序中使用自旋锁时,一定要在获取锁之前,首先禁用中断,防止造成死锁”。我有点不明白的是,中断处理程序本来就是在中断时执行,在这里禁止中断没有错,但是在这个中断前的代码是不是也要禁止中断呢?我的感觉就是在使用自旋锁的时候都要禁止中断,否则就可能造成死锁,大牛们怎么看呢?
...全文
211 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
mayer 2013-07-01
  • 打赏
  • 举报
回复
我顶
lr2131 2013-07-01
  • 打赏
  • 举报
回复
引用 楼主 jasonsungblog 的回复:
在linux内核设计与实现时看到一句话“在中断处理程序中使用自旋锁时,一定要在获取锁之前,首先禁用中断,防止造成死锁”。我有点不明白的是,中断处理程序本来就是在中断时执行,在这里禁止中断没有错,但是在这个中断前的代码是不是也要禁止中断呢?我的感觉就是在使用自旋锁的时候都要禁止中断,否则就可能造成死锁,大牛们怎么看呢?
linux内核设计与实现 说得很清楚了,是在获取锁之前要禁用中断,防止造成死锁。 这个,你想想哈。要是不禁用中断,获取锁,也就是加锁,如果某个线程获取到了锁,但是还没运行到解锁的地方,而这个时候,系统调度了,调度到其他的线程,然后新的线程禁用中断了,继续往后走,如果它现在也要获取锁,但是因为之前那个线程已经得到了锁但没释放,这个新线程又要获取锁,自旋锁自身的特性,它要一直不停的去获取。又由于关中断了,系统调度的异步调度特性就没用了,依赖于sleep这类同步调度特性的线程也没有运行的机会,那结果就是,这个线程切换不出去了,又没法往下走,一直在这里打转,这不就是死锁吗。前一个线程A等待B开启中断以便调度器调度它,后一个线程B等待A释放自旋锁。A和B相互持有对方的资源而不释放。死锁了。 上面给出了自旋锁前不加锁死锁的简单例子,可能这个例子也有不太正确的地方,不过也罢了。如果考虑到多核多CPU的情况,很复杂,我也说不上来。 楼上说得对,不需要自旋锁,不需要禁用中断。 为了防止自旋锁的死锁,当前线程需要禁止中断,从而关闭了调度的特性(单核单CPU),然后也不可能在自旋锁中有同步调度的特性。所以调度器整个的都被禁止了,基本上就不会出现死锁的问题了。 而你自己问的问题:“我有点不明白的是,中断处理程序本来就是在中断时执行,在这里禁止中断没有错,但是在这个中断前的代码是不是也要禁止中断呢?” 这个问题其实是不存在的问题。其实楼上也已经说了。你想想,你就算在中断前的代码禁止中断,你怎么禁止,你知道什么时候禁止吗!!!中断具有异步特性,代码是同步特性,你没法知道在刚要发送中断前的那一刻使用代码去禁止中断。否者你只能对每一条指令的前后禁止和开启中断,你说这样的代码有意义吗!
Carl_CCC 2013-06-30
  • 打赏
  • 举报
回复
获取自旋锁前要禁止中断,你不获取锁不需要禁止中断啊。自旋锁过程中是一直禁止中断的呀。

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧