前言
在多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。一般来说,提升SoC性能的方案有两种,一是提升主频,二是增加Core的数量,然而目前来说,主频是有上限的,于是Core的数量越来越多。Core数量增加有个瓶颈就是内存通道拥堵,Core的数量越多,内存通道就越拥堵,由此提出了NUMA的概念,非一致性内存架构。基本思路是将一定数量的Core划分到一个Node中,Node中的所有Core共用一个memory控制器,而Node和Node之间使用独立的memory控制器。这很好的