基本原理
schedule domain分为三个层次,从低到高依次为SMT,MC和ALL Cpu。SMT即single multi thread,level0调度域,同一个物理Core中的所有thread都在该调度域中;MC即multi Core,level 1调度域,同一个cluster中的所有物理Core中的CPU都在该调度域中;ALL Cpu,level2调度域,也是最高级别的调度域,该调度域包括SoC中所有的CPU。其中如果不支持超线程,则没有SMT调度域,如果是单核SoC,则没有MC调度域,但是包括所有CPU的调度域一定是存在的,也就是说单核系统只有一个调度域,这个调度域中只有一个CPU。
下面我们用一个比较典型架构的SoC来做说明:
SoC拓扑
该SoC集成了两个NUMA Node,每个NUMA Node集成两个cluster,每个Cluster集成了两个物理Core,每个物理Core又虚拟出了两个逻辑CPU。
从Cpu0的视图来看调度域
Cpu0和Cpu1同属于一个物理Core,所以他们两个属于一级调度域;Cpu0,Cpu1,Cpu2和Cpu3同属于一个Cluster,所以他们四个属于二级调度域;Cpu0-Cpu15属于三级调度域。由此拓扑我们可以归纳出几个特性要点:
- 一级调度域中的CPU亲和性最高。
- 高一级的调度域覆盖低一级的调度域。
- 做负载均衡的时候应该先尝试在一级调度域做均衡,一级调度域均衡失败,再考虑二级调度域,二级调度域失败再考虑三级调度域。
从Cpu8的视图看调度域
Cpu8和Cpu9同属于一个物理Core,所以他们两个属于一级调度域;Cpu8,Cpu9,Cpu10和Cpu11同属于一个Cluster,所以他们四个属于二级调度域;Cpu0-Cpu15属于三级调度域。由此我们可以知道,对不同的CPU来说,一级调度域和二级调度域可能是不同的,但是三级调度域一定是相同的,都包括所有的CPU。
CPU拓扑
DTS中定义的CPU拓扑最终要反应到软件上,ARM64的CPU拓扑用结构体struct cpu_topology来描述,本章节会详细介绍该结构体的定义以及初始化。
cpu_topology结构体定义
struct cpu_topology {
int thread_id;
int core_id;
int cluster_id;
cpumask_t thread_sibling;
cpumask_t core_sibling;
};
每一个CPU都会维护这么一个结构体实例,用