免费注册 查看新帖 |

Chinaunix

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

请教一个spin_lock问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-04-26 13:48 |只看该作者 |倒序浏览
对spin_lock有一个问题不太明白:

spin_lock()在进程级别使用时,如果和中断存在数据共享,可以使用spin_lock_irq()防止抢占;

但如何和中断不存在数据共享,那我们还要不要使用spin_lock_irq()?还是只使用spin_lock()?

我觉得应该使用spin_lock_irq(),因为自旋锁执行的代码段要力求简短快速,如果有中断抢占,
时间代价会有增加(虽然中断打断处理可能时间并不长)



请各位发表自己的观点,多谢。

论坛徽章:
0
2 [报告]
发表于 2011-04-26 13:51 |只看该作者
能让中断运行就让中断运行。

论坛徽章:
0
3 [报告]
发表于 2011-04-26 14:05 |只看该作者
本帖最后由 zhanglong71 于 2011-04-26 14:11 编辑

"自旋锁执行的代码段要力求简短快速" 是因为关闭中断(在此情景中)的时间不能太长。

如果中断不会访问此数据,为什么要关中断呢? 

论坛徽章:
0
4 [报告]
发表于 2011-04-26 15:29 |只看该作者
本帖最后由 gqbfree 于 2011-04-26 16:14 编辑

回复 3# zhanglong71


我的意思是:假设spin_lock在任务级使用,此时有中断产生,如果让中断运行,那么势必会占用一部分时间,这样是不是会让spin_lock锁的时间加长?那么其它CPU的等待时间是不是相应也会加长?

论坛徽章:
0
5 [报告]
发表于 2011-04-26 20:20 |只看该作者
spin_lock忙时会浪费处理器时间, 这是使用spin_lock付出的代价吧!

论坛徽章:
0
6 [报告]
发表于 2011-04-26 23:10 |只看该作者
回复 4# gqbfree

spin_lock在任务级使用?啥意思?spin_lock不是只有内核支持吗?而且spin_lock是处理器间的锁,如果别的处理器的中断要用当前被锁的临界区那只能忙等了。

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
7 [报告]
发表于 2011-04-27 08:47 |只看该作者
在spin_lock进入前会禁止抢占,那么即使被中断了,返回点也不会调用schedule或者去执行softirq。所以我认为,尽管这样可以被中断,但不会对内核有影响(因为持有锁的进程不会被抢占而睡眠)。
个人愚见,不足还请指教

论坛徽章:
0
8 [报告]
发表于 2011-04-27 09:44 |只看该作者
回复 7# amarant


    不关本地中断的spin_lock仅用于SMP环境下的中断上下文中,所以不会存在被中断打断的情况

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
9 [报告]
发表于 2011-04-27 10:39 |只看该作者
回复 8# azzurris


    刚才我在kernel文件夹下grep '\<spin_lock\>' kernel/*.c ,随便追踪了一个看,在__exit_signal函数里面有一个 spin_lock(&sighand->siglock);  然后我随着这个函数的调用路线往上走,__exit_signal  ->  release_task -> exit_notify -> do_exit   此路线追踪下来并无关中断,也不是在中断上下文。

小弟并无冒犯之意,只是对你这句话表示怀疑。。非中断上下文不能调用spin_lock吗?

论坛徽章:
0
10 [报告]
发表于 2011-04-27 12:00 |只看该作者
回复 9# amarant


    你客气了。在您所说的函数__exit_signal内的spin_lock前面有一句rcu_read_lock(); 这个函数在kernel/rcupreempt.c里面实现为__rcu_read_lock,在该函数内会去关本地中断                local_irq_save(flags);
所以接着rcu_read_lock()这一句后面才会去写spin_lock,而不是spin_lock_irqsave了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP