社区
Linux_Kernel
帖子详情
中断处理函数中使用自旋锁的疑问
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
打赏
举报
回复
在中断中使用自旋锁时,内核会先禁止本地中断。
正确
使用
自旋锁
、互斥锁
最近在看alios-things的代码发现驱动程序
中
大量
使用
了
自旋锁
。 如tty.c里面的函数实现都是通过
自旋锁
来实现对资源的访问保护。 看到这里首先会有
疑问
,
自旋锁
能保护临界区吗? 一般来说,
自旋锁
是用于多核系统的...
自旋锁
使用
场景和实现分析(转载)
最近看到的一篇文章,觉得写的很清晰,通过场景应用解答了我对
自旋锁
使用
的一些
疑问
,推荐给大家。 引入问题: (1)如果cpu0持有锁,cpu1一直不释放锁怎么办? (2)什么场景下必须要用
自旋锁
,而不能用互斥量?...
自旋锁
与互斥锁的对比、手工实现
自旋锁
本文之前,我只是对
自旋锁
有所了解,知道它是做什么的,但是没有去测试实现过,甚至以为
自旋锁
只有kernel用这个,今天才发现POSIX有提供
自旋锁
的接口。下面我会分析一下
自旋锁
,并代码实现
自旋锁
和互斥锁的性能...
图解丨Linux内核
中
锁机制之原子操作、
自旋锁
很多人会问这样的问题,Linux内核
中
提供了各式各样的同步锁机制到底有何作用?追根到底其实是由于操作系统
中
存在多进程对共享资源的并发访问,从而引起了进程间的竞态。这其
中
包括了我们所熟知的SMP系统,多核间的...
Linux 网络协议栈之内核锁(七)—— 读写
自旋锁
读写
自旋锁
(rwlock)是一种比
自旋锁
粒度更小的
自旋锁
机制,它保留了“自旋”的概念。 但是在写操作方面,只能最多有一个写进程,在读方面,同时可拥有多个执行单元,当然读和写也不能同时进行。 一句话:防写...
Linux_Kernel
4,436
社区成员
17,460
社区内容
发帖
与我相关
我的任务
Linux_Kernel
Linux/Unix社区 内核源代码研究区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章