Linux调度分析(7)调度core之调度过程

无论主动调度还是被动调度,最终通过__schedule()函数实现。操作如下:
image
(1) 若idle过程退出时schedule,对于SCX不使能时,没有可运行的task,此时选择prev task作为下一个task运行;否则步骤(2);
(2) 调用pick_next_task()选择下一个task运行;
(3) 若选择下一个task不是prev task时,调用context_switch()进行调度上下文切换;否则进行负载均衡;

选择下一个task过程

通过pick_next_task()选择下一个task如下所示:
image
过程如下:
(1) 若当前只有fair调度层的task时,直接调用fair调度层class->pick_next_task()选择下一个task,如果没有选择到task,选择idle线程;
(2) 调用class->balance()做负载均衡,以便在pick_next_task时可以选择到task;
(3) 对于每个调度class,从高优先级到低优先级,通过调用class->pick_next_task或class->pick_task查询下一个可运行的task,若找到则直接返回,否则在下一个class中查找;

调度上下文切换context_switch过程

通过context_switch()选择真正的调度操作如下所示:
image
上下文切换主要包含两方面内容:
(1)进程地址空间切换。对于内核线程,调和enter_lazy_tlb()不用刷TLB;对于用户线程,更新asid并可能刷TLB;
(2)寄存器切换。保存上一个进程相关的寄存器保存到thread中,并将准备运行的进程的寄存器加载到寄存器中,这些寄存器包括FPSIMD及通用寄存器等。

寄存器切换

image

posted @ 2026-01-13 12:00  耳朵一样  阅读(23)  评论(0)    收藏  举报