本文已收录到 AndroidFamily,技能和职场问题,请关注公众号 [彭旭锐] 提问。

前语

大家好,我是小彭。

在上一篇文章里,咱们聊到了核算机的冯诺依曼架构,以及核算机的五大部件:控制器、运算器、存储器、输入设备和输出设备。在现在核算机体系中,CPU 是整个核算机的中心,首要包含控制器和运算器两大部件。

在后续文章中,咱们将从 CPU 的根本知道开端,逐步将 CPU 与履行体系、存储体系 和 I/O 体系串联起来,请关注。


思维导图:

程序员学习 CPU 有什么用?


1. 知道 CPU 中央处理器

1.1 什么是 CPU?

中央处理单元(Central Processing Unit,CPU)也叫中央处理器或主处理器,是整个核算机的中心,也是整台核算机中造价最昂贵的部件之一。

从硬件的视点: CPU 由超大规模的晶体管组成;

从功用的视点: CPU 内部由时钟、寄存器、控制器和运算器 4 大部分组成。

  • 1、时钟(Clock): 担任宣布时钟信号,也能够坐落 CPU 外部;
  • 2、寄存器(Register): 担任暂存指令或数据,坐落存储器体系金字塔的顶端。运用寄存器能够补偿 CPU 和内存的速度差,削减 CPU 的访存次数,前进 CPU 的吞吐量;
  • 3、控制器(Control Unit): 担任控制程序指令履行,包含从主内存读取指令和数据发送到寄存器,再将运算器核算后的成果写回主内存;
  • 4、运算器(Arithmetic Logic Unit,ALU): 担任履行控制器取出的指令,包含算术运算和逻辑运算。

冯诺依曼架构

程序员学习 CPU 有什么用?

—— 图片引证自 Wikipedia

1.2 为什么要学习 CPU?

关于大部分程序员,日常所处理的作业都是在跟 Java 和 C++ 等高档言语打交道,并不会直接地与 CPU 打交道。那么,为什么咱们还要花这么多时刻去学习 CPU 呢?我认为有以下原因:

  • 原因 1 – 掌握 CPU 原理能够开发更高功用的程序: 了解 CPU 的作业原理有助于规划出更高功用的算法或代码,例如通过避免伪同享、前进缓存命中率等方法前进程序运转功率,就需求对 CPU 的缓存机制有必定的了解;

  • 原因 2 – 扩展计划堆集: CPU 是整个核算机体系中最杂乱的模块,也是当代核算机科学的制高点。堆集 CPU 内部的处理计划,能够为将来的遇到类似问题提供思路,到达举一反三的效果。例如 CPU 缓存淘汰策略与运用内存的缓存淘汰策略有相似之处;

  • 原因 3 – CPU 是常识体系最底层的常识: 当咱们在考虑或处理某一个问题时,就需求利用到更深层次的常识堆集来解说,而 CPU 便是坐落常识体系中最底层常识。例在内存体系的可见性、履行体系的 IO_WAIT 和线程池规划等问题中,都需求对 CPU 的履行机制有必定了解。

CPU

程序员学习 CPU 有什么用?

—— 图片引证自 图片来历

1.3 通用处理器和专用处理器

在早期的核算机体系中,只要 1 个通用处理器,运用 1 个处理器就能够完结一切核算使命。后来人们发现能够把一些核算使命分离出来,单独规划专门的芯片微架构,在履行功率上会远远高于通用处理器,最典型的专用处理器便是 GPU 图形处理器。

这种用来专门处理某种核算使命的处理器便是专用处理器,那为什么专用处理器在处理某些特定问题时更快呢,我认为有 3 点解说:

  • 1、最优架构: 专用处理器只处理少量类型的作业,能够为特定作业规划最优芯片架构,而通用处理器只能规划大局最优架构,但不必定是履行特定作业的最优机构;
  • 2、硬件加快: 能够把多条指令的核算作业直接用硬件完结,比较于 CPU 一条条地履行指令,能够节约许多指令周期;
  • 3、本钱更低: 专用处理器履行的核算流程是固定的,不需求 CPU 的流水线控制、乱序履行等功用,完结相同核算功用的造价更低。

现代核算机架构都是 1 个通用处理器加上多个专用处理器,这种将不同类型的核算使命选用不同的核算单元完结的规划,也叫 异构核算(Heterogeneous Computing)。

多处理器架构

程序员学习 CPU 有什么用?


2. 指令集架构 ISA

2.1 什么是指令集架构?

CPU 所能了解的机器言语便是 指令(Instruction Code), 一个 CPU 所能了解的一切指令便是 指令集(Instruction Set)。

为了确保芯片间的兼容性,芯片厂商并不为每款新芯片规划一个新的指令集,而是将指令集推广为标准规范,这个规范便是 指令集架构(Instruction Set Architecture,ISA)

相关于指令集架构,CPU 在完结具体指令集功用的硬件电路规划便是 微架构(Micro Architecture)。 假如用软件的考虑方法,ISA 便是 CPU 的功用接口,界说了 CPU 的标准规范,而微架构便是 CPU 的功用完结,界说了 CPU 的具体电路规划,一种指令集能够兼容不同的微架构。

2.2 两种干流的指令集架构

由于 CPU 坐落整个核算机体系最底层且最中心的部件,假如 CPU 的兼容性都出问题了,那么曾经开发的运用软件乃至操作体系将无法在新的 CPU 上运转,这对芯片厂商的生态破坏是致命的。因而,指令集架构是相对稳定的,芯片厂商在 ISA 中添加或删除指令时会非常慎重。

目前,能够有用占据市场份额的只要 2 个 ISA ,它们也分别代表了杂乱与精简 2 个开展方向:

  • x86 架构: Intel 公司在 1970 年代推出的杂乱指令集架构;
  • ARM 架构: ARM 公司在 1980 年代推出的精简指令集架构,咱们熟悉的 Apple M1 芯片、华为麒麟芯片和高通骁龙芯片都是 ARM 架构(其实,ARM 公司并不生产芯片,而是以技能授权的形式运转)。

2.3 杂乱指令集和精简指令集

在 CPU 指令集的开展过程中,形成了 2 种指令集类型:

  • 杂乱指令集(Complex Instruction Set Computer,CISC): 着重单个指令能够一起履行多个根本操作,用少量指令就能够完结许多作业,履行功率更高;
  • 精简指令集(Reduced Instruction Set Computer,RISC): 着重单个指令只能履行一个或少量根底操作,指令之间没有重复或冗余的功用,完结相同作业需求运用更多指令。

在早期的核算机体系中,指令集普遍很简略,也没有杂乱和精简之分。跟着运用软件的功用越来越丰富,运用层也在反向推动芯片架构师推出更强壮的指令集,以简化程序编写和前进功用。例如,一些面向音视频的指令能够在一条指令内一起完结多个数据进行编解码。

这在当时的确是不错的选择。 原因是 CPU 和主存的速度差真实太大了,用更少的指令完结程序功用(指令密度更高)能够削减访存次数。 凭仗这一点,杂乱指令集对精简指令集的优势是简直全面性的:

  • 优势 1: 能够削减程序占用的内存和磁盘空间巨细;
  • 优势 2: 能够削减从内存或磁盘获取指令所需求的带宽,能够前进总线体系的传输功率;
  • 优势 3: CPU L1 Cache 能够包容更多指令,能够前进缓存命中率。且现代核算机中多个线程会同享 L1 Cache,指令越少对缓存命中率越有利;
  • 优势 4: CPU L2 Cache 能够包容更多数据,对操作许多数据的程序也有利于前进缓存命中率。

然而,这些优势都是有价值的:

  • 缺陷 1 – 处理器规划杂乱化: 指令越杂乱,用于解析指令的处理器电路规划肯定会越杂乱,履行功用功耗也越大;
  • 缺陷 2 – 指令功用重叠: 许多新增的指令之间产生了功用重叠,不符合指令集的正交性准则,并且新增的许多杂乱指令运用率很低,但处理器却付出了不成正比的规划本钱;
  • 缺陷 3 – 指令长度不统一: 指令长度不统一,虽然有利于运用哈夫曼编码进一步前进指令密度(频率高的指令用短长度,频率高的指令用大长度),但是指令长度不同,履行时刻也有长有短,不利于完结流水线式结构。

因而,到 1980 年代,精简指令集 RISC 逐步浮出水面。目前,大多数低端和移动体系都选用 RISC 架构,例如 Android 体系、Mac 体系和微软 Surface 系列。

比较于杂乱指令集,精简指令集愈加着重 “正交性” ,单个指令只能履行一个或少量根底操作,指令之间没有重复或冗余的功用。并且精简指令集的每条 指令长度相同 ,非常便于完结流水线式结构。

网上许多材料有一个误区: 精简指令集简化了指令集的巨细。 这是不对的,准确的说法是简化了指令集的杂乱度。

总结一下: 杂乱指令集凭仗更高的指令密度,在功用方面全体优于精简指令集(内存 / 磁盘占用、CPU Cache 命中率、TLB 未命中率),而精简指令集献身了指令密度换取更简略的处理器架构,以功用换取功耗的平衡。

指令集类型 CISC RISC
指令数量 指令数量庞大 指令数量相对较少
指令长度 长度不同 长度相同
指令功用 有重叠 正交
举例 x86 ARM、MIPS

3. CPU 的功用指标

3.1 履行体系参数

  • 1、主频(Frequency/Clock Rate): 在 CPU 内部有一个 晶体振荡器(Oscillator Crystal) ,晶振会以必定的频率向控制器宣布信号,这个信号频率便是 CPU 的主频。主频是 CPU 最首要的参数,主频越快,核算机单位时刻内能够完结的指令越快。 CPU 的主频并不是固定的,CPU 在运转时能够选择低频、满频乃至超频运转, 但是作业频率越高,意味着功耗也越高;

  • 2、时钟周期(Clock Cycle): 主频的另一面,即晶振宣布信号的时刻距离, 时钟周期=1/主频;

  • 3、外频: 外频是主板为 CPU 提供的时钟频率,早期核算机中 CPU 主频和外频是相同的,但跟着 CPU 主频越来越高,而其他设备的速度还跟不上,所以现在主频和外频是不相等的;

  • 4、程序履行时刻:

    • 4.1 消逝时刻(Wall Clock Time / Elapsed Time): 程序开端运转到程序完毕所消逝的时刻;

    • 4.2 CPU 时刻(CPU Time): CPU 实践履行程序的时刻,仅包含程序获得 CPU 时刻片的时刻(用户时刻 + 体系时刻)。由于 CPU 会并行履行多个使命,所以程序履行时刻会小于消逝时刻;

    • 4.3 用户时刻(User Time): 用户态下,CPU 切换到程序上履行的时刻;

    • 4.4 体系时刻(Sys Time): 内核态下,CPU 切换到程序上履行的时刻;

3.2 存储体系参数

  • 字长(Word): CPU 单位时刻内一起处理数据的根本单位,多少位 CPU 便是指 CPU 的字长是多少位,比如 32 位 CPU 的字长便是 32 位,64 位 CPU 的字长便是 64 位;

  • 地址总线宽度(Address Bus Width): 地址总线传输的是地址信号,地址总线宽度也决议了一个 CPU 的寻址才能,即最多能够访问多少量据空间。举个例子,32 位地址总线能够寻址 4GB 的数据空间;

  • 数据总线宽度(Data Bus Width): 数据总线传输的是数据信号,数据总线宽度也决议了一个 CPU 的信息传输才能。

区别其它几种容量单位:

  • 字节(Byte): 字节是核算机数据存储的根本单位,即使存储 1 个位也需求按 1 个字节存储;

  • 块(Block): 块是 CPU Cache 管理数据的根本单位,也叫 CPU 缓存行;

  • 段(Segmentation)/ 页(Page): 段 / 页是操作体系管理虚拟内存的根本单位。

  • 相关文章:核算机的存储器金字塔长什么样?


4. 影响 CPU 功用的要素

CPU 作为核算机的中心部件,未来必定是朝着更强壮的功用出发。在看待 CPU 的视角上,咱们也要具有必定的大局观:

  • 1、提高 CPU 功用不止是 CPU 的使命: 核算机体系是多个部件组成的杂乱体系,脱离全体谈局部没有意义;
  • 2、平衡功用与功耗: 一般来说,CPU 的核算功用越高,功耗也越大。咱们需求归纳考虑功用和功耗的联系,脱离功耗谈功用没有意义。

4.1 提高 CPU 主频

提高主频对 CPU 功用的影响是最直接的,曩昔几十年 CPU 的首要开展方向也是在怎么提高 CPU 主频的问题上。

不过,最近几年 CPU 主频的速度好像遇到瓶颈了。由于想要主频越快,要么让 CPU 满频或超频运转,要么晋级芯片制程,在单位体积里塞进去更多晶体管。这两种方法都会提高 CPU 功耗,带来续航和散热问题。假如不处理这两个问题,就无法突破主频瓶颈。

主频的瓶颈

程序员学习 CPU 有什么用?

—— 图片引证自 Wikipedia

4.2 多核并行履行

已然单核 CPU 的功用遇到瓶颈,那么在 CPU 芯片里一起塞进去 2 核、4 核乃至更多,那么整个 CPU 芯片的功用不就直接翻倍提高吗?

抱负很美好,现实是功用并不总是跟着中心数线性添加。在中心数较小时,添加并行度得到的加快效果近似于线性提高,但添加到必定程度后会趋于一个极限, 说明添加并行度的提高效果也是有瓶颈的。

为什么呢?由于不管程序并行度有多高,终究都会有一个成果汇总的使命,而汇总使命无法并行履行,只能串行履行。例如,咱们用 Java 的 Fork/Join 框架将一个大使命分解为多个子使命并行履行,终究仍是需求串行地合并子使命的成果。

这个定论也有一个经验定律 —— 阿姆达尔定律(Amdahl’s Law) ,它解说了处理器并行核算后功率提高状况。咱们把串行的部分称为串行重量 WsW_s ,把并行的部分称为并行重量 WpW_p ,正是串行重量约束了功用提高的极限,串行重量越大,极限越低。

  • 并行后的履行时刻是 Wpp+Ws\frac{W_p}{p} + W_s
  • 并行后的加快倍数是 Ws+WpWs+Wpp\frac{W_s+W_p}{W_s+\frac{W_p}{p}} ,当并行度 p 趋向于 无穷大时,提高极限便是 Ws+WpWs\frac{W_s+W_p}{W_s}

并行度、并行重量对提高效果的影响

程序员学习 CPU 有什么用?

—— 图片引证自 Wiki 百科

提示: 以绿色的曲线为例,程序能够的并行重量是 95%,串行重量是 5%,终究得出的提高极限就会 20 倍。

4.3 指令重排序

添加中心数是提高并行度最直接的方法,但并不是唯一的方法。

现代 CPU 为了前进并行度,会在遵守单线程数据依赖性准则的前提下,对程序指令做必定的重排序。事实上不止是 CPU,从源码到指令履行一共有 3 种等级重排序:

  • 1、编译器重排序: 例如将循环内重复调用的操作提前到循环外履行;
  • 2、处理器体系重排序: 例如指令并行技能将多条指令重叠履行,或许运用分支猜测技能提前履行分支的指令,并把核算成果放到重摆放缓冲区(Reorder Buffer)的硬件缓存中,当程序真的进入分支后直接运用缓存中的结算成果;
  • 3、存储器体系重排序: 例如写缓冲区和失效行列机制,即是可见性问题,从内存的视点也是指令重排问题。

指令重排序类型

程序员学习 CPU 有什么用?

  • 相关文章:12 张图看懂 CPU 缓存一致性与 MESI 协议,真的一致吗?

4.4 SoC 芯片 —— 片内片外双总线结构

跟着芯片集成电路工艺的前进,在冯诺依曼架构中的五大部件(运算器、控制器、存储器、输入和输出设备接口)也能够集成在一个芯片上,形成一个近似于完整核算机的体系,这种芯片也叫 片上体系(System on Chip,Soc)。 SoC 芯片将本来分布在主板上的各个部件聚合到同一个芯片上,不同部件之间的总线信息传输功率更高。

  • 相关文章:图解核算机内部的高速公路 —— 总线体系

5. 总结

今天,咱们简略了讨论了 CPU 的根本概念,许多问题仅仅浅尝辄止。在后续的文章里,咱们将从履行体系、存储体系和 I/O 体系三个视点与 CPU 串联起来。请关注。


参考材料

  • CPU 通识课 —— 靳国杰 张戈 著
  • 浅显易懂核算机组成原理 —— 徐文浩 著,极客时刻 出品
  • Code Density Concerns for New Architectures —— Vincent M. Weaver 等著
  • Central processing unit —— Wikipedia
  • Instruction set architecture —— Wikipedia
  • Complex instruction set computer —— Wikipedia
  • Reduced instruction set computer —— Wikipedia
  • Application binary interface —— Wikipedia
  • Clock Rate —— Wikipedia
  • Amdahl’s law —— Wikipedia

程序员学习 CPU 有什么用?

本文正在参与「金石计划 . 分割6万现金大奖」