免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
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 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中没有内核抢占)………
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP