前言
在多CPU系统中,调度器需要统筹所有的CPU做进程调度。每一个CPU多维护一个调度队列,调度队列上是该CPU需要调度的进程。
有些CPU调度队列上的进程可能比较少,甚至空闲;而有些CPU调度队列上的进程可能比较多,这样就会导致有些CPU闲置,有些CPU繁忙。为了解决这种负载不均衡的状态,引入了负载均衡的概念,负载均衡的基本思路是,如果当前CPU发现本地调度队列上的进程非常少,或者空了,就会从其他CPU调度队列拿一些进程过来;如果当前CPU发现本地调度队列上的进程非常多,也会主动把本地调度队列上的一些进程分给其他CPU。
这里有个关键问题,如果系统中有多个CPU,比如8个,那么怎么在另外7个CPU中做选择呢?仅仅根据这7个CPU的负载就可以了呢?答案是否定的,因为进程在不同的CPU之间迁移的时候,代价是不一样的。
下面是一个典型的Soc架构简图,只画除了CPU和memory,不过对于了解进程调度就足够了。我们可以看到一个SoC可能集成了多个NUMA Node,每个Node可能集成了多个Cluster,每个Cluster可能集成了多个Core,每个Core有有可能虚拟出来多个逻辑Core,称为thread,或者超线程。下面我们分章节来探讨下SoC的多层次架构。
NUMA Node
一个SoC中可能集成了多个NUMA Node。一般来说,提升S