mac处理器的核心负载( 三 )


▍用户发起的线程(Userthreads)
所有QoS高于9的线程处理都大同小异 , 它们之间的区别无非就是它们的优先级不同 。高QoS的线程有资格运行在任何一种核心或者集群上 , 不过M1和M1Pro/Max上的处理方式又有所不同 。
在M1上 , 由于只有1个P集群和1个E集群 , 而物理核心总计有8个 , 因此同一时刻最多只有8个线程可以分配到这两个集群上 , 每个集群均可以分到4个线程 。如果同一时刻需要分配到线程数小于等于4时 , 系统会尽量将他们放在P集群上运行;除非当前队列中有更多更高QoS级别的线程等待运行 , 这时才会额外使用E集群运行这类任务 。在上述情况下 , P核心的频率的最大值将为3GHz , E核心的频率最大值则为2GHz , 是运行QoS为9的线程时的两倍 。
但M1Pro/Max却有3个集群 , 两个分别拥有4个P核的集群 , 以及一个拥有2核的E集群 。如果同一时刻需要分配到线程数小于等于4时 , 系统会主动将线程分为到第一个P(P0)集群上 , 第二个P集群将始终保持未加载和不活跃的节能状态;如果同一时刻需要分配的线程多余4时 , 多出来的线程(大于等于5个小于等于8个)将被分配到第二个P(P1)集群上;如果此时还有更多的线程(大于等于1个小于等于2个)等在运行 , 那么这些进程将会再分配到E集群上 。在上述情况下 , P核心的频率的最大值将为3228MHz , E核心的频率最大值则为2064MHz 。
M1Ultra芯片总共有5个集群 , 每个集群有4个核心 。它们的策略大体与M1Pro/Max相同 , 只不过在使用E集群之前 , 优先调用的是4个P集群 。
不过 , 有两种情况下 , 代码似乎只在单个核心上运行:
第一种情况发生在引导过程中 , 在内核初始化并运行在其他核心之前 , 代码只运行在单个E核上 。另一种情况则发生在 , 下载完macOS更新以后处于「准备」阶段时 , 在M1Pro/Max芯片上 , macOS的5个更新线程仅仅被赋予了一个P核的活动驻留权利 , 即2个P集群中的第一个集群中的第一个(P0 , 下面标为核心3) 。
mac处理器的核心负载
文章图片

文章图片

在准备安装更新的30分钟内 , 这种不常见的的活动驻留一直都在
▍负载模式下的图形(Patternsunderload)
这里有几个关于macOS策略影响调度的典型例子 , 这些例子取自活动监视器的CPU历史窗口 。
mac处理器的核心负载
文章图片

文章图片

上图显示了M1芯片的一系列负载的情况 , 这些负载来自于逐渐增多的CPU密集型线程 。上面提到过M1有两个集群E和P0 , 这里分别用蓝框进行划分 。从左开始 , 第1~4个高优先级的进程的负载全部由P0集群承担 , 而后续第5~8个进程的负载则逐步由E集群开始承担 。
mac处理器的核心负载
文章图片

文章图片

这张图则展示了重负载下M1Pro不断变化的负载情况 , 其中一些线程是后台进程 , 而另一部分则是高优先级进程 , 虽然绝大部分的负载都由E集群承担 , 但P0集群也承担了不少负载 , 而P1集群主要被用来处理一些峰值负载 。
mac处理器的核心负载
文章图片

文章图片

最后一张图则是M1Ultra上的运行情况 , 作者本人已将对应的核心重新排列到了对应的集群中 , 其中E位于顶部 , P0~P3从第二排开始从左到右、从上到下依次进行排列 。而图中所示的负载则是一个非常典型的情况——系统登录后的前几分钟 , 可以看到E和P0承担了绝大多数时候的负载 , 而且在负载更重的时的初期 , 系统会将更多的任务调度到P1~P3剩下的3个P集群上 , 以更快地完成任务 。