4

我正在查看 Linux 中的调度程序代码:

if (prev->state && !(preempt_count() & PREEMPT_ACTIVE)) {
    if (unlikely(signal_pending_state(prev->state, prev))) {
        prev->state = TASK_RUNNING;
    } else {
        deactivate_task(rq, prev, DEQUEUE_SLEEP);
        prev->on_rq = 0;

据我了解,如果prev任务不可中断,则此代码将停用提供的任务(并从运行队列中删除)

preempt_count() & PREEMPT_ACTIVE == 0

有人可以向我解释什么是什么,什么preempt_count时候thread_info会满足这个条件?

4

1 回答 1

1

preempt_countpreempt_disable()and使用的计数器preempt_enable(),这使得它们可以嵌套使用。的高阶位preempt_count用于 hardirq 和 softirq 计数器、一个 NMI 位和一个PREEMPT_ACTIVE位。这些定义在include/linux/preempt_mask.h. 在 x86 架构中,PREEMPT_NEED_RESCHED也使用了一点preempt_count,用于优化决定重新调度。

现在,不清楚. 在我研究过的内核版本 3.17 中,在所有情况下,它都是在调用之前设置并在调用之后立即重置,除非它是从. 这意味着,inside ,被设置在,当因为内核抢占而被调用时,即,不是故意为某些其他操作系统功能而使用的。这种“其他操作系统功能”会有所不同,具体取决于您是否使用 、 或 构建内核,但它包括对互斥体的显式阻塞。PREEMPT_ACTIVEpreempt_countPREEMPT_ACTIVEpreempt_count__schedule()schedule()__schedule()PREEMPT_ACTIVEpreempt_count__schedule()schedule()CONFIG_PREEMPTCONFIG_PREEMPT_VOLUNTARYCONFIG_PREEMPT_NONE

于 2017-05-20T17:19:01.117 回答