免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6395 | 回复: 6

[中断] spin_lock_irqsave 一般什么时候用 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2014-08-02 20:55 |显示全部楼层
现在写代码 一般就用spin_lock和spin_lock_bh。

比如有一个哈希表,可能被多个cpu写,所以我会用spin_lock,防止多个cpu同时写哈希表。
比如有一个哈希表,可能被多个cpu写,同时定时器函数也会执行写哈希表操作,这种情况就用spin_lock_bh,
可以防止当某cpu加锁访问哈希表时,该cpu的定时器软中断到来,再次执行spin_lock时的死锁这种情况。

所以请问在哪种情况下,会使用spin_lock_irqsave,我没用过。能否给小弟一个例子。多谢

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
发表于 2014-08-02 21:10 |显示全部楼层
如果想在加锁后的代码不被中断打断时采用。

特别的,如果在中断里也有拿这把spin_lock的代码,用spin_lock就有可能导致死锁,而spin_lock_irqsave能规避这一点。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2014-08-03 09:21 |显示全部楼层
回复 2# Tinnal

能力有限,不太明白。您说的第一句话,不就是spin-lock-bh使用的情况吗?
第二句话,您说的,中断里加锁,形象点是否可以理解为定时器里加锁?某CPU定时器软中断到来,加锁,其他CPU访问加锁,这种情况不会死锁啊?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2014-08-03 09:25 |显示全部楼层
回复 2# Tinnal
我觉得怎么描述的和spin-lock-bh一样,能否细说,多谢。

论坛徽章:
9
辰龙
日期:2014-08-18 20:38:42未羊
日期:2014-09-04 08:50:45丑牛
日期:2014-09-06 00:12:55寅虎
日期:2014-12-22 20:50:56摩羯座
日期:2015-01-14 22:28:15巳蛇
日期:2015-01-23 20:39:272015年辞旧岁徽章
日期:2015-03-03 16:54:1515-16赛季CBA联赛之青岛
日期:2016-03-13 23:37:1915-16赛季CBA联赛之深圳
日期:2016-03-29 18:52:38
发表于 2014-08-03 10:17 |显示全部楼层
回复 3# mrpre


"您说的第一句话,不就是spin-lock-bh使用的情况吗?"
spin_lock_bh是防下半部(软中断)的。而spin_lock_irqsave是防上半部(硬中断的)。


他们两都是为了防止异步中断导致死锁。举个例,如是有一个中断处理程序要改一个全局变量,而另外一个内核线程也会轮训硬件并更改这个全局变量,我们采用spin-lock锁去保护它。在某一时间,内核线程拿到锁了,就在此刻,中断来了,它也想改这个全局变量,他也想拿这把spin_lock,但此时锁已经被别人拿了,他只能在那死等(spin),期望拿到锁的人赶紧放锁,但中断处理程序返回前那个拿到锁的线程根本不可以得到执行。因此就出现了死锁(这里假定那个线程和中断都在同一核心上)。如果用户spin_lock_irqsave就不一样了,内核线程拿到锁后,中断就不可能发生了。也就解决了这种死锁的可能。
如果是中断先拿到锁,那是不会和线程死锁了,但还要放同核的其它中断拿同一把锁呀。
如果发生在不同核上,是没有问题了,但我们不能作这种假设。重另外一个角度来说,对不同核而言spin_lock_irqsave和spin_lock效果是一样的,因为它只关本核的中断,并没有把另外一个核的中断给关闭。


spin_lock_bh和上面的过程一样,把上述的“中断”改为“软中断”就行。


此外还有一个函数spin_lock_irq,他是不支持嵌套调用户的,而spin_lock_irqsave可以。

论坛徽章:
2
寅虎
日期:2014-11-25 21:47:342015小元宵徽章
日期:2015-03-06 15:58:18
发表于 2014-08-05 07:18 |显示全部楼层
临界区资源会被硬中断修改的时候,就用spin_lock_irqsave

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
发表于 2014-08-05 09:50 |显示全部楼层
回复 1# mrpre
应用情景有下面两种考虑:
1。持锁期间不希望中断发生,临界区不允许被中断打断
2。持锁的时候中断状态不确定,可能中断使能, 也可能中断没有使能。不管中断是否使能,释放锁的时候要求将这种状态能恢复到持锁之前的状态。这样整个代码的运行环境与持锁前一样。


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP