p=task_of(se);if(prev != p) {//【3】完成prev和next的交接,这会涉及到二者的parent层级structsched_entity *pse = &prev->se;//从prev和se的叶子节点不断向上level调整层级,直到二者的se->cfs_rq一致,即同一个level为止while(!(cfs_rq = is_same_group(se, pse))) {//循环对prev和next se做...
void(*set_next_task)(structrq*rq,structtask_struct*p,boolfirst); 1. 2. 源码路径 :linux-5.6.18\kernel\sched\sched.h#1724 ~ 1725 ; 二、select_task_rq 函数 ( 为进程选择 CPU ) sched_class 调度类结构体 中的 select_task_rq 函数指针 , 指向一个函数 , ...
pick_next_task 函数就是从从就绪队列中选择最适合运行的调度实体,即虚拟时间最小的调度实体,下面我们看下 CFS 调度器如何通过 pick_next_task 的回调函数 pick_next_task_fair 来选择下一个进程的。 选择下一个进程 pick_next_task_fair 会判断上一个 task 的调度器是否是 CFS,这里我们默认都是 CFS 调度: ...
每个调度器类sched_class都必须提供一个pick_next_task函数用以在就绪队列中选择一个最优的进程来等待调度, 而我们的CFS调度器类中, 选择下一个将要运行的进程由pick_next_task_fair函数来完成 之前我们在将主调度器的时候, 主调度器schedule函数在进程调度抢占时, 会通过__schedule函数调用全局pick_next_task选择...
#define for_each_task(p) \ for(p=&init_task;(p=p->next_task)!=&init_task;) (4) unsigned long volatile jiffies; Linux的基准时间(见kernal/sched.c)。系统初始化时清0,以后每隔10ms由时钟中断服务程序do_timer()增1。 (5) int need_resched; ...
again标签用于循环的进行pick_next操作 CONFIG_FAIR_GROUP_SCHED宏指定了组调度情况下的pick_next操作, 如果不支持组调度, 则pick_next_task_fair将直接从simple开始执行 2 simple无组调度最简单的pick_next_task_fair 在不支持组调度情况下(选项CONFIG_FAIR_GROUP_SCHED), CFS的pick_next_task_fair函数会直接执行...
每个调度器类sched_class都必须提供一个pick_next_task函数用以在就绪队列中选择一个最优的进程来等待调度, 而我们的CFS调度器类中, 选择下一个将要运行的进程由pick_next_task_fair函数来完成 之前我们在将主调度器的时候, 主调度器schedule函数在进程调度抢占时, 会通过__schedule函数调用全局pick_next_task选择...
Next:指向下一个调度类,用于在函数pick_next_task、check_preempt_curr、set_rq_online、set_rq_offline用于遍历整个调度类根据调度类的优先级选择调度类。优先级为stop_sched_class->dl_sched_class->rt_sched_class->fair_sched_class->idle_sc*hed_class enqueue_task:将任务加入到调度类中 dequeue_task:将...
enqueue_task:将task放入runqueue,在CFS中task会加入一个红黑树;dequeue_task:将task从runqueue拿出来;pick_next_task:调度时候选取下一个run的task,比如对于rt调度类而言就是找bitmap上第一个bit的queue里面的task;task_tick:在调度tick发生时被调用,比如对于CFS而言,它会更新当前运行task的vruntime和sum_...
pick_next_task:调度时候选取下一个run的task,比如对于rt调度类而言就是找bitmap上第一个bit的queue里面的task; task_tick:在调度tick发生时被调用,比如对于CFS而言,它会更新当前运行task的vruntime和sum_exec_runtime,并可能设置need_resched; wakeup_preempt:一个task被唤醒的时候(也可能是调度策略或者优先级更改...