前面已经学习了deactivate_task这个接口,它是将当前的任务从rq中移除,移除之后自然需要pick_next_task来选取下一个执行的任务。Pick_next_task接口会首先判断当前程序的调度类是不是公平调度,以及rq中running状态的任务数和rq中cfs调度rq中的running状态的任务数目,条件符合就使用CFS的pick_next_task_fair方法选取下一个执行任务,核心的调用流程如下:
pick_next_task_fair
put_prev_task
pick_next_entity
set_next_entity
idle_balance
put_prev_task是将当前的进程重新加入到rq中,以CFS为例,如果prev任务还处于rq中,流程会调用updata_curr来更新rq上曾在执行任务的关键参数,流程如下:
1,计算已经执行的时间 exec_time = now - curr->exec_start,更新执行时间
curr->exec_start = now;
2,更新curr总共执行的时间curr->sum_exec_runtime += exec_time;