免费注册 查看新帖 |

Chinaunix

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

请问软中断的处理过程中会发生任务切换吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-20 19:51 |只看该作者 |倒序浏览
对中断处理和任务切换还不是太熟悉,有个问题一直没想明白,假设如下场景:

1. 任务A在执行
2. 硬件产生中断,进入do_IRQ()
3. 在do_IRQ()返回之前,进入do_softirq()
4. 因为3是开中断的,有可能被时间中断打断,do_IRQ()->do_timer()
5. do_timer()->update_process_times()->scheduler_tick(),任务A的时间片减一,如果降到0,则置位need_resched
6. 时间中断的do_IRQ()返回到ret_from_intr,会检查need_resched,进而调用schedule()

请问这个执行序列会不会发生?总感觉软中断跟任务调度是无关的(而且也是无法调度的)?

PS:在6中检查need_resched之前还有对peempt_count的检查,在中断处理中有没有增加preempt_count从而跳过对need_resched的检查?

-------------------------------------------------------------------------------------------
因为3里在执行do_softirq,所以local_bh_count是大于0的,即in_interrupt为真,
而schedule()的第一句就是BUG_ON(in_interrupt()),因此这个序列应该是不会发生的?

但具体是什么机制保证了不会出现上面的情景?

论坛徽章:
0
2 [报告]
发表于 2007-06-20 21:05 |只看该作者
原帖由 netentsec 于 2007-6-20 19:51 发表于 1楼  
对中断处理和任务切换还不是太熟悉,有个问题一直没想明白,假设如下场景:

1. 任务A在执行
2. 硬件产生中断,进入do_IRQ()
3. 在do_IRQ()返回之前,进入do_softirq()
4. 因为3是开中断的,有可能被时间中 ...


不会,软中断的处理是在内核态,并且是在中断上下文中,这个时候不会发生进程切换。
此外,内核调用软中断处理函数是在irq_exit(),这个时候还没有从do_IRQ返回,所以ret_from_intr还不会被调用,也就是说中断其实还没返回。
软中断的意义在于它缩短了中断屏蔽时间(因为在处理软中断的时候是可以响应中断),从而提高了系统对中断的响应能力。

论坛徽章:
0
3 [报告]
发表于 2007-06-20 22:18 |只看该作者

回复 #2 zx_wing 的帖子

3x, i see

enter_irq():add_preempt_count(HARDIRQ_OFFSET);
irq_exit():在调用invoke_softirq()之前,sub_preempt_count(HARDIRQ_OFFSET-1),
所以处理软中断的过程中peempt_count至少为1  (invoke_softirq()返回后才减一)

所以即便发生事件5,在事件6中由于peempt_count非0,故而不会跳转到need_resched。

PS:才发现之前看的do_IRQ/do_softirq都是2.4.21的代码(2.4中没有内核抢占)………

论坛徽章:
0
4 [报告]
发表于 2007-06-21 15:00 |只看该作者
to zx_wing,

LZ已经知道了没有调度的真正原因了。

但你这个回答也十分有问题。你自己在研究一下。

(哈,SORRY, 我是容易挑毛病的,为了学习吗)

原帖由 zx_wing 于 2007-6-20 21:05 发表于 2楼  


不会,软中断的处理是在内核态,并且是在中断上下文中,这个时候不会发生进程切换。
此外,内核调用软中断处理函数是在irq_exit(),这个时候还没有从do_IRQ返回,所以ret_from_intr还不会被调用,也就是说 ...

论坛徽章:
0
5 [报告]
发表于 2007-06-21 15:21 |只看该作者
原帖由 思一克 于 2007-6-21 15:00 发表于 4楼  
to zx_wing,

LZ已经知道了没有调度的真正原因了。

但你这个回答也十分有问题。你自己在研究一下。

(哈,SORRY, 我是容易挑毛病的,为了学习吗)


请指出。如果你说的是抢占的话,那我想说任务调度和抢占不一样

论坛徽章:
0
6 [报告]
发表于 2007-06-21 15:24 |只看该作者
还有请版主下次能够直接指出问题,因为我一般发出回复的时候都已经认真考虑过了。如果真是有错,那肯定是我一开始就对它认识错误了,自己也不知道。

论坛徽章:
0
7 [报告]
发表于 2007-06-21 15:28 |只看该作者
和抢占与否无关。

因为LZ从schedule()函数中已经知道了结果,就是不会发生进程切换,LZ问为什么不会?在那里检查分支的不会调度。你你又告诉LZ ”在中断上下文中,这个时候不会发生进程切换。“。等于重复了LZ的结论。

还有第二行lz的情况ret_from_intr会走到的。

1)不会,软中断的处理是在内核态,并且是在中断上下文中,这个时候不会发生进程切换。
2)此外,内核调用软中断处理函数是在irq_exit(),这个时候还没有从do_IRQ返回,所以ret_from_intr还不会被调用,也就是说 ...

论坛徽章:
0
8 [报告]
发表于 2007-06-21 15:29 |只看该作者
还有第二行lz的情况ret_from_intr会走到的。LZ的时间中断是中断嵌套了。第一个do_IRQ还没有完,第二个已经返回ret_from_intr了。

论坛徽章:
0
9 [报告]
发表于 2007-06-21 15:34 |只看该作者
原帖由 思一克 于 2007-6-21 15:28 发表于 7楼  
和抢占与否无关。

因为LZ从schedule()函数中已经知道了结果,就是不会发生进程切换,LZ问为什么不会?在那里检查分支的不会调度。你你又告诉LZ ”在中断上下文中,这个时候不会发生进程切换。“。等于重复了 ...

》》因为LZ从schedule()函数中已经知道了结果,就是不会发生进程切换,LZ问为什么不会?在那里检查分支的不会调度。你你又告诉LZ ”在中断上下文中,这个时候不会发生进程切换。“。等于重复了LZ的结论。
哦,这个啊,我到没去仔细研究lz的话。因为我个人是做虚拟机的,对上下文非常敏感,在什么上下文中能做什么不能做什么是明确的。所以回答问题就先从上下文入手了,倒没注意是否重复了lz的结论。

》》还有第二行lz的情况ret_from_intr会走到的。。
什么意思??

论坛徽章:
0
10 [报告]
发表于 2007-06-21 15:41 |只看该作者
原帖由 思一克 于 2007-6-21 15:29 发表于 8楼  
还有第二行lz的情况ret_from_intr会走到的。LZ的时间中断是中断嵌套了。第一个do_IRQ还没有完,第二个已经返回ret_from_intr了。

我并没有说ret_from_intr不会走到啊,我的意思说相对于它这次中断来说,它的下半部操作在这次中断返回之前。
我想lz是明白我的意思的,要把话说的滴水不漏,那是很费劲的,也没必要。
例如版主这里说中断嵌套了。那我可以说我这时处理的中断是IPI或NMI,优先级比timer中断高,它写TPR把timer屏蔽了,在它处理完之前不会有嵌套。
所以这样就没必要了,能让提问者明白问题就行。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP