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