免费注册 查看新帖 |

Chinaunix

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

单cpu抢占模式下自旋锁为什么会要禁止抢占? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-07 20:01 |只看该作者 |倒序浏览
单cpu抢占模式下,spin_lock定义是禁止抢占。在网上查了些文章,大概意思是说如果如果不禁止抢占,会造成死锁。但是我觉得理论上应该不会造成死锁。一个进程获得了资源的自旋锁,在访问资源期间,被其他进程抢占。新的进程为了访问该资源,去获得该锁。此时形成了一个竞态条件。如果没有外界干预,就是死锁现象。但是,因为存在中断,他可能打断新进程的忙等,老进程有机会获得cpu,完成对资源的访问并释放锁,从而避免死锁。
所以,我觉得单cpu spin_lock中禁止抢断并不会造成死锁,而是有可能引起性能的下降。不知道理解是否正确?

谢谢

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
2 [报告]
发表于 2009-02-07 22:13 |只看该作者

回复 #1 xiegang112 的帖子

不太清楚你这是什么版本的内核,在单cpu下,spin lock只是一条空语句,就是什么也不干。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
3 [报告]
发表于 2009-02-07 23:13 |只看该作者
原帖由 dreamice 于 2009-2-7 22:13 发表
不太清楚你这是什么版本的内核,在单cpu下,spin lock只是一条空语句,就是什么也不干。


dreamice兄对内核中的锁很有研究啊。。。

论坛徽章:
0
4 [报告]
发表于 2009-02-08 11:27 |只看该作者

回复 #2 dreamice 的帖子

我指的是单内核下,并选择了抢占支持。这个时候,spin lock里面是禁止抢占

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
5 [报告]
发表于 2009-02-08 14:54 |只看该作者

看看

Spinlock的语义,你就知道为什么了.
Spinlock是怎么定义的?

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
6 [报告]
发表于 2009-02-08 15:59 |只看该作者
原帖由 xiegang112 于 2009-2-8 11:27 发表
我指的是单处理器下,并选择了抢占支持。这个时候,spin lock里面是禁止抢占


你说的是对的。由于2.6内核版本加入了抢占的特性,但我们可以配置为抢占和非抢占模式。
在单处理器2.6版本的非抢占模式下,spin_lock被编译为一条空语句,什么都不干;
在单处理器2.6版本的抢占模式下,spin_lock可以理解为一个抢占disable的开关,并在spin_unlock中被enable;

在SMP的2.6的抢占模式下,spin_lock才真正发挥了他的全部功能:防止SMP中并发访问临界区,防止内核抢占造成的竞争;并在spin_unlock中退出临界区。

这部分可以看一下代码的实现来分析理解。

关于什么情况下发生抢占,下面贴一段internet上search到的:

linux抢占发生的时间

最后在了解下linux抢占发生的时间,抢占分为用户抢占和内核抢占。

用户抢占在以下情况下产生:

● 从系统调用返回用户空间

● 从中断处理程序返回用户空间

内核抢占会发生在:

● 当从中断处理程序返回内核空间的时候,且当时内核具有可抢占性;

● 当内核代码再一次具有可抢占性的时候。(如:spin_unlock时)

● 如果内核中的任务显式的调用schedule()

● 如果内核中的任务阻塞。

论坛徽章:
0
7 [报告]
发表于 2009-02-08 18:11 |只看该作者

回复 #6 dreamice 的帖子

谢谢楼上的分析,我大概明白了。
关于单cpu抢占模式下的spin_lock实现成抢断禁止开关,我个人理解是,在抢占模式下,进入零界区(不考虑该零界区会被中断访问)之前,如果不禁用抢占,在当前进程访问零界区的时候,可能发生抢占导致进程切换。这个时候,如果新的进程也访问零界区,那么就会造成冲突。但,只要在前一个进程访问该临界区的时候,不发生抢占,该临界区就是安全的。所以,在单cpu抢占模式下,只要把spin_lock实现成禁止抢占的就行了,而没有必要像smp中的spin_lock那样,去循环测试一个lock。

不知道我理解是否正确

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
8 [报告]
发表于 2009-02-08 19:51 |只看该作者

回复 #7 xiegang112 的帖子

是的,应该就是这样的。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
9 [报告]
发表于 2009-02-08 22:00 |只看该作者
LDD3的第五章讲的spinlock,应该谈到这个问题了

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
10 [报告]
发表于 2009-02-08 22:40 |只看该作者
LDD3上的解释:
The kernel preemption case is handled by the spinlock code itself. Any time kernel code holds a spinlock, preemption is disabled on the relevant processor. Even uniprocessor systems must disable preemption in this way to avoid race conditions. That is why proper locking is required even if you never expect your code to run on a multiprocessor machine.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP