”;电流“;和“;上一个”;在“__附表”;功能,为什么不直接使用电流?

”;电流“;和“;上一个”;在“__附表”;功能,为什么不直接使用电流?,c,linux-kernel,scheduled-tasks,scheduler,C,Linux Kernel,Scheduled Tasks,Scheduler,从内核源代码: 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();

从内核源代码:

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)
        .....
(2)中的结果日志为:

[4184.164038]上一个->pid=0,当前=0
[4184.165365]上一个->pid=12,当前=12
[4186.008068]上一个->pid=0,当前=0
[4186.009396]上一个->pid=30,当前=30
[4188.008046]上一个->pid=0,当前=0
[4188.009334]上一个->pid=30,当前=30
[4188.164041]上一个->pid=0,当前=0
[4188.165315]上一个->pid=12,当前=12
[4190.008047]上一个->pid=0,当前=0
[4190.009431]上一个->pid=30,当前=30
显示屏显示结果相同

  • 为什么不使用当前的
    
    而不是

prev
是一个变量,用于在当前任务与运行队列中的新任务交换时临时记住当前任务。当然,如果您在执行
prev=rq->curr
之后立即查看
prev
,您将获得
prev==rq->curr==current
,因为它刚刚分配给它

如果您想检查下一步要运行的任务,则必须在
\u schedule()
执行以下操作时进行检查:

next=选择下一个任务(rq、prev和rf);

现在
next
将不同于
prev

的方式,它的完成方式会禁用抢占。使用
current
可能有竞争条件。结构成员是
curr
,而不是
current
@stark-whoops,thanks@MarcoBonelli谢谢你的回答,我想知道的是为什么不使用
current
而不是``cpu=smp\u processor\u id();rq=cpu_rq(cpu);prev=rq->curr```@Joey是这样看的:调度器算法处理运行队列,无论全局
current
变量是否存在,它都应该工作。这样,实现算法的结构和代码就不依赖于外部因素。调度器并不关心当前是否存在,它只是一个全局变量(实际上是一个宏),当内核代码的其他部分需要它时,为了方便起见而存在。
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);
    cpu = smp_processor_id(); 
    rq = cpu_rq(cpu); 
    prev = rq->curr;