请教一个spin_lock问题
对spin_lock有一个问题不太明白:
spin_lock()在进程级别使用时,如果和中断存在数据共享,可以使用spin_lock_irq()防止抢占;
但如何和中断不存在数据共享,那我们还要不要使用spin_lock_irq()?还是只使用spin_lock()?
我觉得应该使用spin_lock_irq(),因为自旋锁执行的代码段要力求简短快速,如果有中断抢占,
时间代价会有增加(虽然中断打断处理可能时间并不长)
请各位发表自己的观点,多谢。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
能让中断运行就让中断运行。
本帖最后由 zhanglong71 于 2011-04-26 14:11 编辑
"自旋锁执行的代码段要力求简短快速" 是因为关闭中断(在此情景中)的时间不能太长。
如果中断不会访问此数据,为什么要关中断呢?
本帖最后由 gqbfree 于 2011-04-26 16:14 编辑
回复 3# zhanglong71
我的意思是:假设spin_lock在任务级使用,此时有中断产生,如果让中断运行,那么势必会占用一部分时间,这样是不是会让spin_lock锁的时间加长?那么其它CPU的等待时间是不是相应也会加长?
spin_lock忙时会浪费处理器时间, 这是使用spin_lock付出的代价吧!
回复 4# gqbfree
spin_lock在任务级使用?啥意思?spin_lock不是只有内核支持吗?而且spin_lock是处理器间的锁,如果别的处理器的中断要用当前被锁的临界区那只能忙等了。
在spin_lock进入前会禁止抢占,那么即使被中断了,返回点也不会调用schedule或者去执行softirq。所以我认为,尽管这样可以被中断,但不会对内核有影响(因为持有锁的进程不会被抢占而睡眠)。
个人愚见,不足还请指教
回复 7# amarant
不关本地中断的spin_lock仅用于SMP环境下的中断上下文中,所以不会存在被中断打断的情况
回复 8# azzurris
刚才我在kernel文件夹下grep '\<spin_lock\>' kernel/*.c ,随便追踪了一个看,在__exit_signal函数里面有一个 spin_lock(&sighand->siglock); 然后我随着这个函数的调用路线往上走,__exit_signal -> release_task -> exit_notify -> do_exit 此路线追踪下来并无关中断,也不是在中断上下文。
小弟并无冒犯之意,只是对你这句话表示怀疑。。非中断上下文不能调用spin_lock吗?
回复 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了。