仅检查TIF_NEED_RESCHED,不检查preempt_count?
2017-01-11
1. 何时设置 TIFNEEDRESCHED
任务task01还没有完成, 但调度器认为 其运行的够久了, 就设置TIFNEEDRESCHED, 这样, 在合适的时机, task01就会被调度走, 由其他task使用cpu.
除了schedulertick会设置外, 当一个优先级高的进程进入可执行状态的时候, trytowakeup()也会设置这个标志。
2. 不检查preempt_count?
例 linux-3.10.86/arch/arm/kernel/entry-armv.S
__vector_irq()
|--__irq_usr() @entry-armv.S
| |--usr_entry()
| |--irq_handler()
| |--ret_to_user_from_irq() @entry-common.S
| | |--work_pending()
| | | |--do_work_pending @signal.c
do_work_pending
{
do {
if (likely(thread_flags & _TIF_NEED_RESCHED))
schedule();
else
...
}
}
这里仅判断TIFNEEDRESCHED, 没有判断 preemptcount, 为啥?
难道说, 禁用抢占依旧会发生抢占?
答: 假定这个时间点上, preemptcount不为0, 那么, 之后就返回用户态, 没有机会再操作 preemptcount了.
这样就相当于 在内核态过程中 对preempt count进行的加减不平衡, 这事不该发生, 故当前切换到用户态前, 并没有检查preempt_count(). 我们认为其结果是可以预见, 总是0, 允许抢占发生.
本文地址: https://awakening-fong.github.io/posts/scheduler/scheduler_02_preempt
转载请注明出处: https://awakening-fong.github.io
若无法评论, 请打开JavaScript, 并通过proxy.
blog comments powered by Disqus