本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 发问。
前言
大家好,我是小彭。
在上一篇文章里,咱们聊到了计算机的冯·诺依曼架构,以及计算机的五大部件:控制器、运算器、存储器、输出设施和输出设备。在当初计算机体系中,CPU 是整个计算机的外围,次要蕴含控制器和运算器两大部件。
在后续文章中,咱们将从 CPU 的根本意识开始,逐渐将 CPU 与执行零碎、存储系统 和 I/O 零碎串联起来,请关注。
小彭的 Android 交换群 02 群曾经建设啦,扫描文末二维码进入~
思维导图:
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): 负责执行控制器取出的指令,包含算术运算和逻辑运算。
冯·诺依曼架构
—— 图片援用自 Wikipedia
1.2 为什么要学习 CPU?
对于大部分程序员,日常所解决的工作都是在跟 Java 和 C++ 等高级语言打交道,并不会间接地与 CPU 打交道。那么,为什么咱们还要花这么多工夫去学习 CPU 呢?我认为有以下起因:
- 起因 1 – 把握 CPU 原理可能开发更高性能的程序: 了解 CPU 的工作原理有助于设计出更高性能的算法或代码,例如通过防止伪共享、进步缓存命中率等形式进步程序运行效率,就须要对 CPU 的缓存机制有肯定的了解;
- 起因 2 – 扩大计划积攒: CPU 是整个计算机系统中最简单的模块,也是当代计算机科学的制高点。积攒 CPU 外部的解决方案,可能为未来的遇到相似问题提供思路,达到举一反三的作用。例如 CPU 缓存淘汰策略与利用内存的缓存淘汰策略有相似之处;
- 起因 3 – CPU 是常识体系最底层的常识: 当咱们在思考或解决某一个问题时,就须要利用到更深层次的常识积攒来解释,而 CPU 就是位于常识体系中最底层常识。例在内存零碎的可见性、执行零碎的 IO_WAIT 和线程池设计等问题中,都须要对 CPU 的执行机制有肯定了解。
CPU
—— 图片援用自 图片起源
1.3 通用处理器和专用处理器
在晚期的计算机系统中,只有 1 个通用处理器,应用 1 个处理器就可能实现所有计算工作。起初人们发现能够把一些计算工作分离出来,独自设计专门的芯片微架构,在执行效率上会远远高于通用处理器,最典型的专用处理器就是 GPU 图形处理器。
这种用来专门解决某种计算工作的处理器就是专用处理器,那为什么专用处理器在解决某些特定问题时更快呢,我认为有 3 点解释:
- 1、最优架构: 专用处理器只解决大量类型的工作,能够为特定工作设计最优芯片架构,而通用处理器只能设计全局最优架构,但不肯定是执行特定工作的最优机构;
- 2、硬件加速: 能够把多条指令的计算工作间接用硬件实现,相比于 CPU 一条条地执行指令,可能节俭大量指令周期;
- 3、老本更低: 专用处理器执行的计算流程是固定的,不须要 CPU 的流水线管制、乱序执行等性能,实现雷同计算性能的造价更低。
古代计算机架构都是 1 个通用处理器加上多个专用处理器,这种将不同类型的计算工作采纳不同的计算单元实现的设计,也叫 异构计算(Heterogeneous Computing)。
多处理器架构
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 功耗,带来续航和散热问题。如果不解决这两个问题,就无奈冲破主频瓶颈。
主频的瓶颈
—— 图片援用自 Wikipedia
4.2 多核并行执行
既然单核 CPU 的性能遇到瓶颈,那么在 CPU 芯片里同时塞进去 2 核、4 核甚至更多,那么整个 CPU 芯片的性能不就间接翻倍晋升吗?
现实很美妙,事实是性能并不总是随着外围数线性减少。在外围数较小时,减少并行度失去的减速成果近似于线性晋升,但减少到肯定水平后会趋于一个极限, 阐明减少并行度的晋升成果也是有瓶颈的。
为什么呢?因为不论程序并行度有多高,最终都会有一个后果汇总的工作,而汇总工作无奈并行执行,只能串行执行。例如,咱们用 Java 的 Fork/Join 框架将一个大工作合成为多个子工作并行执行,最终还是须要串行地合并子工作的后果。
这个论断也有一个教训定律 —— 阿姆达尔定律(Amdahl’s Law),它解释了处理器并行计算后效率晋升状况。咱们把串行的局部称为串行重量 $W_s$,把并行的局部称为并行重量 $W_p$,正是串行重量限度了性能晋升的极限,串行重量越大,极限越低。
- 并行后的执行工夫是 $\frac{W_p}{p} + W_s$
- 并行后的减速倍数是 $\frac{W_s+W_p}{W_s+\frac{W_p}{p}}$,当并行度 p 趋向于 无穷大时,晋升极限就是 $\frac{W_s+W_p}{W_s}$
并行度、并行重量对晋升成果的影响
—— 图片援用自 Wiki 百科
阐明: 以绿色的曲线为例,程序能够的并行重量是 95%,串行重量是 5%,最终得出的晋升极限就会 20 倍。
4.3 指令重排序
减少外围数是晋升并行度最间接的办法,但并不是惟一的办法。
古代 CPU 为了进步并行度,会在恪守单线程数据依赖性准则的前提下,对程序指令做肯定的重排序。事实上不止是 CPU,从源码到指令执行一共有 3 种级别重排序:
- 1、编译器重排序: 例如将循环内反复调用的操作提前到循环外执行;
- 2、处理器零碎重排序: 例如指令并行技术将多条指令重叠执行,或者应用分支预测技术提前执行分支的指令,并把计算结果放到重排列缓冲区(Reorder Buffer)的硬件缓存中,当程序真的进入分支后间接应用缓存中的结算后果;
- 3、存储器零碎重排序: 例如写缓冲区和生效队列机制,即是可见性问题,从内存的角度也是指令重排问题。
指令重排序类型
相干文章: 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