中断处理函数中使用自旋锁的疑问

comdoc 2010-12-04 06:06:18
书上说“在中断处理程序中可以使用自旋锁”

那么,假设自旋锁锁定了一个临界区,而且一个进程正在持有该锁,此时发生中断,中断服务函数中又申请该自旋锁,那岂不是会造成死锁,因为中断服务函数在等待自旋锁,但是进程将永远得不到释放自旋锁的机会。

就是这点搞不清楚,求解,谢谢。
...全文
1364 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xmd1983 2011-08-23
  • 打赏
  • 举报
回复
所以,应该还是用spin_lock_irqsave/spin_unlock_irq,比较好
xmd1983 2011-08-23
  • 打赏
  • 举报
回复
1. 根据《Linux内核设计与实现》第二版,第九章内核同步方法之所述:P110,第二段,“在单处理器机器上,编译的时候并不会加入自旋锁,仅当做一个设置内核抢占机制是否被启动的开关”。由此可见,如果是单核情况下,这个情况不会发生;

2. 在SMP架构,如果上锁的进程和申请锁的中断不在同一个cpu上,也是不会死锁的;

3. 但如果两者出现在同一cpu上,看上去会有死锁之风险;

4. 关于spin_lock_irqsave之用法,是否为:关闭本地CPU的中断,防止在当前中断上锁时,有更高级的中断打断并争抢资源,从而导致更高级的中断被自旋锁住?

以上拙见,请各位大牛指正!
liujun01203 2010-12-09
  • 打赏
  • 举报
回复
[Quote=引用楼主 comdoc 的回复:]
书上说“在中断处理程序中可以使用自旋锁”

那么,假设自旋锁锁定了一个临界区,而且一个进程正在持有该锁,此时发生中断,中断服务函数中又申请该自旋锁,那岂不是会造成死锁,因为中断服务函数在等待自旋锁,但是进程将永远得不到释放自旋锁的机会。

就是这点搞不清楚,求解,谢谢。
[/Quote]
“在中断处理程序中可以使用自旋锁”意思是使用自旋锁即使它一时获取不到需要的资源,也会在那里自旋,不会让出处理器,而导致睡眠。

你所说的引起死锁是有可能发生的,但这需要使用者去保证不要让这种情况发生,如果一个资源可能在中断处理程序中获取,那么获取这种资源,使用自旋锁应该使用spin_lock_irqsave(),禁止中断。而不是spin_lock()了。
RichardYSteven 2010-12-09
  • 打赏
  • 举报
回复
我看了,ldd3上说
当获取spinlock时,要disable interrupt
RichardYSteven 2010-12-09
  • 打赏
  • 举报
回复
楼主说的情况貌似确实会发生死锁
xbw_2010 2010-12-08
  • 打赏
  • 举报
回复
自旋锁最多只能被一个可执行线程持有。自旋锁不会引起调用者睡眠,如果一个执行线程试图获得一个已经被持有的自旋锁,那么线程就会一直进行忙循环,一直等待下去,在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。
一个执行单元要想访问被自旋锁保护的共享资源,必须先得到锁,在访问完共享资源后,必须释放锁。如果在获取自旋锁时,没有任何执行单元保持该锁,那么将立即得到锁;如果在获取自旋锁时锁已经有保持者,那么获取锁操作将自旋在那里,直到该自旋锁的保持者释放了锁。

无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁。


Welson80 2010-12-08
  • 打赏
  • 举报
回复
使用自旋锁不是死锁的原因,而是由于他获得资源后不能释放。如果没有保护和精心设计,任何排他的同步都可能造成死锁。
自旋锁确实在多处理器内核同步时使用较多,我想可能是由于自旋锁是个循环等待,一般效率很低,但如果自旋锁使用在多处理器间的资源保护,自旋锁被占有时,说明该资源正在被别的处理器访问,因为获得自旋锁前一定会禁止内核抢占,循环等待不会浪费太多时间,因而在单处理器资源保护使用信号量而多处理器使用自旋锁。
另外,占有一个资源不能释放的这种情况,不知道能不能称作死锁
comdoc 2010-12-04
  • 打赏
  • 举报
回复
我大概明白了,自旋锁使用在多核情况下,不然就是普通进程间也会出现死锁。
Welson80 2010-12-04
  • 打赏
  • 举报
回复
在中断中使用自旋锁时,内核会先禁止本地中断。

4,436

社区成员

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

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