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)
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。