请教一个spin_lock问题

发布于 2022-10-15 08:32:26 字数 298 浏览 30 评论 0

对spin_lock有一个问题不太明白:

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

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

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

不语却知心 2022-10-22 08:32:26

能让中断运行就让中断运行。

叶落知秋 2022-10-22 08:32:26

本帖最后由 zhanglong71 于 2011-04-26 14:11 编辑

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

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

岁月静好 2022-10-22 08:32:26

本帖最后由 gqbfree 于 2011-04-26 16:14 编辑

回复 3# zhanglong71

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

樱娆 2022-10-22 08:32:26

spin_lock忙时会浪费处理器时间, 这是使用spin_lock付出的代价吧!

与他有关 2022-10-22 08:32:26

回复 4# gqbfree

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

胡渣熟男 2022-10-22 08:32:26

在spin_lock进入前会禁止抢占,那么即使被中断了,返回点也不会调用schedule或者去执行softirq。所以我认为,尽管这样可以被中断,但不会对内核有影响(因为持有锁的进程不会被抢占而睡眠)。
个人愚见,不足还请指教

软糖 2022-10-22 08:32:26

回复 7# amarant

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

翻了热茶 2022-10-22 08:32:26

回复 8# azzurris

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

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

(り薆情海 2022-10-22 08:32:26

回复 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了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文