“__schedule”函数中的“current”和“prev”有什么区别,为什么不直接使用current?

Joe*_*eys 2 c scheduler scheduled-tasks linux-kernel

从内核源代码来看:

static void __sched notrace __schedule(bool preempt)
{
        struct task_struct *prev, *next;
        unsigned long *switch_count;
        struct rq_flags rf;
        struct rq *rq;
        int cpu;

        cpu = smp_processor_id();
        rq = cpu_rq(cpu);
        prev = rq->curr;  // <=================(1)
        .....
Run Code Online (Sandbox Code Playgroud)

上面第 (1) 行中的current和之间有什么区别?prev

在该行之后添加printk()

static void __sched notrace __schedule(bool preempt)
{
        struct task_struct *prev, *next;
        unsigned long *switch_count;
        struct rq_flags rf;
        struct rq *rq;
        int cpu;

        cpu = smp_processor_id();
        rq = cpu_rq(cpu);
        prev = rq->curr;
        //if(prev->pid != current->pid)
        printk("the prev->pid =%d, The current = %d \n", prev->pid, current->pid); // <===========(2)

        schedule_debug(prev);

        if (sched_feat(HRTICK))
                hrtick_clear(rq);
Run Code Online (Sandbox Code Playgroud)

(2) 得到的日志是:

static void __sched notrace __schedule(bool preempt)
{
        struct task_struct *prev, *next;
        unsigned long *switch_count;
        struct rq_flags rf;
        struct rq *rq;
        int cpu;

        cpu = smp_processor_id();
        rq = cpu_rq(cpu);
        prev = rq->curr;  // <=================(1)
        .....
Run Code Online (Sandbox Code Playgroud)

显示结果表明结果是相同的。

  • 为什么不使用current 而不是
    cpu = smp_processor_id(); 
    rq = cpu_rq(cpu); 
    prev = rq->curr; 
Run Code Online (Sandbox Code Playgroud)

Mar*_*lli 5

prev是一个变量,用于在当前任务与运行队列中的新任务交换时临时记住当前任务。当然,如果你prev在做完之后看完全正确的话,prev = rq->curr你就会有prev == rq->curr == current,因为它刚刚被分配给它。

如果您想检查接下来选择运行哪个任务,则必须注意该任务何时__schedule()执行:

next = pick_next_task(rq, prev, &rf);
Run Code Online (Sandbox Code Playgroud)

现在next将有所不同prev