”;电流“;和“;上一个”;在“__附表”;功能,为什么不直接使用电流?
从内核源代码:”;电流“;和“;上一个”;在“__附表”;功能,为什么不直接使用电流?,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;