macOS是怎么进行核心分配的?
在活动监视器的CPU历史窗口中,根据时间显示核心负载(即CPU%),最早的值显示在最左侧。左侧奇数序列号的核心是真实的核心,显示大负载下的8核英特尔至强W。右侧偶数序列号的核心是超线程模拟的虚拟核心,也负责处理大负载。
macOS是怎么进行核心分配的?
1.架构
CPU核心有两种M1系列芯片:
E核心,其内部处理单位约为P核心的一半,最大时钟频率为2064MHz。
P核心,频率最高,原始M1为324MHz,M1Pro/Max/Ultra为3228MHz。
CPU核心配置M1系列芯片有三种方式:
原始M1包含4个E和4个P核心,用于MacbookAir。
M1Pro和Max有2个E和8个P核心,用于14英寸和16英寸Macboo和MacstudioMax。
MacstudioUltra有4个E和16个P核心。
M1Pro芯片的缩水版在一些14寸MacbookPro笔记本中使用,其P核心数量从8个降到6个。
为了简化核心管理,macOS根据其功能将核心分为2~4个相同类型的核心。不幸的是,系统级别的核心编号(如powertrics等工具显示的核心编号)与活动监视器中看到的核心编号不同。为了与后者保持一致,我们在这里使用了活动监视器中看到的核心编号,但是集群的编号与系统的编号一致。在macosmonterey12.3.1中,三个芯片的功能如下:
在原始M1中,每种类型的核心只有一个簇,分别是E0和P0,每个簇包含四个核心的同一类型;
M1Pro和Max有一个串(E0)包含两个E核,两个串(P0和P1)分别包含四个P核;
M1Ultra有一个簇(E0)包含4个E核心,四个簇(P0.P1.P2.P3)分别包含4个P核心。
每个集群中的所有核心在同一时钟频率下运行,并且通常(但不是在所有情况下)保持集群中的负载平衡。偶尔,负载分配不均匀。在某些极端情况下,一些线程可能被分配到集群中的单个核心。
2.线程控制。
与Asashilinux不同,macos不支持直接访问核心。核心类型或集群,至少开放的API不提供这些功能。通常,它们需要由GrandCentraldispatch设置的服务质量来管理,MacOS使用这个功能来确定线程管理策略。
最低QOS的线程只能在E簇上运行,较高的QOS的核心可以分配给E或P核心。通过taskpolicy命令行工具或setpriority()函数动态修改,可以对后者的行为进行修改。这些工具可以限制高QOS线程只能在E和核心上运行,也可以在E或P核心上运行。然而,它们不能改变最低QOS线程的规则,这些线程只能在E核心上运行。
MacOS本身采用的策略是,大多数后台任务都以最低QOS运行。这些任务包括自动时间机器备份。Spotligt索引维护等。其中还包括归档工具的压缩和解压缩任务。例如,如果你以xip格式下载Xcode,解压缩需要很长时间,因为代码只能在核心运行,无法更改。
3.后台线程。
由于E簇大小不同,原始M1和M1Pro/Max芯片上最低QOS线程的加载和运行方式也不同。
原来的M1芯片有四个E核心,所以当QOS9的线程运行时,时钟频率会设置为1000MHz(1GHz)左右。M1Pro/Max,只有两个E核心,采用了不同的方法:如果只有一个线程,它会以1000MHz左右的频率在簇上运行,但是如果有两个或两个以上的线程,频率会增加到2064MHz。这样可以保证M1Pro/Max的E簇可以在不同的情况下提供至少相当于原始M1的后台任务性能。
一个常见的例外是,一些具有最低QOS的线程(如backupd)也会受到I/O的限制,这种线程将以1000MHz的频率在M1Pro/Max上运行。
4.用户线程。
所有QOS高于9的线程处理方法都是相似的,但是不同的队列优先级会导致不同的结果。
由于高QOS的线程可以在任何类型的线程上运行,M1和M1Pro/Max的管理模式是不同的。原来的M1只有一个P簇,所以每次最多可以分配8个线程到两个线程,每个线程运行4个线程。当线程数小于或等于4时,将尽可能全部分配到P簇上运行,只有当队列中有更多高QOS线程时,才会使用E簇。P核心的执行频率约为3GHz,而E核心的执行频率为2GHz,约为QOS9线程运行频率的两倍。
M1Pro和Max芯片有三个簇,其中两个包含四个P核心,另一个包含两个E核心。队列中的前四个线程将被分配到第一个P簇(P0);如果有5~8的线程,它将被分配到第二个P簇(P1),否则第二个P簇将是免费的,以减少功耗。如果队列中有更多的线程,它将被分配到E核心。每个核心类型的最大频率是:P0.P1为3228MHz,E0为2064MHz。
M1ultra芯片有五个集群,每个集群有四个核心。它的策略与M1Pro/Max芯片相同,但只有当所有四个P集群都被使用时,才会使用E0。
然而,在两种情况下,代码似乎只在一个核心上运行:在引导过程中,代码只在一个活跃的E核心上运行,直到操作系统核心初始化并运行其他核心。另一种情况是在安装MacOS更新之前。当准备下载更新时。在M1Pro/Max芯片上,分配了五个相当于一个核心的线程资源,因此可以看出CPU的利用率是100%,但限制在一个P核心,即第二个P集群(P0)中的第一个核心。