CPU 是 Central Processing Unit(中央处理器)的简称,它负责执行指令和计算,控制着计算机的所有组件。CPU 从无到有,从弱小到强大,经历了漫长发展过程,其间发生了无数的故事。
在本文将着重介绍 CPU 基础内容,从 CPU 的发展历史入手,看看世界上第一块 CPU 是怎么诞生的,再到当代 CPU 的组成,为什么 CPU 能为电脑处理那么多的事情?
回顾历史,世界上第一台真正意义上的计算机 ENIAC:(Electronic Numerical Integrator And Calculator,电子数字积分计算机),于 1946 年在美国宾夕法尼亚大学投入运行,采用十进制进行数据存储。最初也专门用于火炮弹道计算,后经多次改进而成为能进行各种科学计算的通用计算机。这台完全采用电子线路执行算术运算、逻辑运算和信息存储的计算机,运算速度比继电器计算机快 1000 倍。
ENIAC 的发明,奠定了电子计算机的发展基础,开辟了信息时代的新纪元,是人类第三次产业革命开始的标志,具有重要的历史意义。
与 ENIAC 不同且更为人知的是 EDVAC:(Electronic Discrete Variable Automatic Computer,电子离散变量自动计算机)。
1945 年 3 月由冯·诺伊曼本人与莫奇利、埃克特等提出,1951 年最终完成。EDVAC 是二进制串行计算机,具有加减乘和软件除的功能。一条加法指令约 864 微秒,乘法指令 2900 微秒(或 2.9 毫秒)。使用延迟线存储器,具有 1000 个 44 位(bit)的字。这是世界上首次提出的第一台采用二进制的冯·诺依曼计算机,由运算器、控制器、存储器、输入和输出设备 5 部分组成,也就是我们熟知的冯·诺依曼架构。
这种体系结构一直延续至今,现在使用的计算机,其基本工作原理仍然是存储程序和程序控制,所以现在一般计算机被称为冯诺依曼结构计算机。鉴于冯诺依曼在发明电子计算机中所起到关键性作用,他被西方人誉为"计算机之父"。(他在数学和经济学领域的贡献也很卓著,被称为“博弈论之父”)
有了冯·诺依曼架构所奠定的基础,CPU 架构也就逐渐向着近现代发展,接下来我们按照几个重要时间点来回顾一下 CPU 的发展历史。在 1971 年,世界上第一个 CPU——4004,在 Intel 公司诞生了。虽然相比于现在的 CPU,它无论是功能还是运行速度都弱小的十分可怜。但他出现却具有划时代的意义。
随后 Intel 又接着推出了 16 位的微处理器 i8088 在接下来的十年中 CPU 迎来了它的发展黄金时期,几乎每年都会在技术上做出重大突破。尽管 Intel 公司做了相当大的付出,运营了一定的时间,但归根结底当年的它还是家小公司,但仅过了没多久,就在 1982 年,Intel 公司生产出了一款具有跨时代意义的 CPU80286,由此 CPU 进入了 286 时代。
Intel 公司在这段时间一直在为 IBM 公司供货,为了保证货源不断,IBM 公司强迫 Intel 公司将微处理器的授权交给另一家公司,也就是我们所熟知的 AMD。没过多久,AMD 生产出市场定位和性能与 Intel80287 基本相同的 CPU,至此两家两大芯片巨头维系至今的技术角逐也正式拉开序幕,直到今天也不能说谁的技术更好,只能说是各有千秋,但是多亏了这两家公司的竞争让 CPU 芯片技术蓬勃发展。
时间到了 1985 年,英特尔公司成为了世界上一流的芯片制造公司,当年 10 月 17 日,英特尔制造出了 80386xd,内含 27.5 万个晶体管,它的出现使 32 位 CPU 成为了 PC 工业的标准。到了 1989 年,英特尔公司制作出了 80386sd,它的价格相对较低,在性能方面大大强于 80286,所以被广泛的使用。同年 Intel 公司又造出了 80486,它突破了 100 万晶体管的界限,拥有 120 万的晶体管其性能是 80386DX 的四倍。
1991 年,AMD 也宣布自己的新产品,AMD386,核心代号 p9,跟 Intel386 一样有 DX 和 SX 之分,且两家公司的 CPU 在性能上没有太大的差别。同样,仅过了两年,AMD 也研制出了 AMD 486DX,随后 AMD 又衍生出一系列 486 的衍生产品,AMD 486DX–2,AMD 486DX–4 等,值得一提的是,AMD 486DX4–120,在频率上第一次超过了自己的竞争对手 Intel 公司。
1993 年 3 月 22 日,Intel 公司生产出了 80586,它有另一个令人熟知的名字––奔腾(Pentium)。奔腾系列是 x86 系列的一大革新,但是它当时浮点除数法出现了错误,导致 Intel 大量回收了他们的第一代产品,1995 年 3 月 27 日,奔腾系列有增添了一位新成员,Pentium 120MHZ 处理器,并在随后的两年时间内奔腾有增添了很多的成员包括 Pentium 150mhz,Pentium 166mhz,Pentium200mhz 等。
1997 年 1 月 Pentium MMX 的出现更是将 Pentium 系列的强度提升了一个档次,最后在 1997 年 5 月 7 日,Pentium Ⅱ系列诞生了,这一时期衍生出了 Pentium Ⅱ 233,Pentium Ⅱ 266,Pentium Ⅱ 300,这三款 CPU 均采用 SLOT1 架构。再插句嘴,这期间诞生的 Pentium Ⅱ Xeon 处理器就是我们后来所熟知的至强系列。Intel 公司为自己的成就沾沾自喜,以为 AMD 已经被甩到八条街以外了,但是 AMD 已经进入了一个全新的时代––AMD K6 处理器。它的性能可堪比 Intel 家的 Pentium MMX,随后又衍生出了 AMD K6-2,AMD K6-3 这让 Intel 感受到了很大的压力。
2000 年,跨世纪的一年,同样也是 CPU 界意义非凡的一年,Pentium4 横空出世,这一次 Intel 公司一改之前很快改变自己的产品名称,将奔腾四代研发了四五年,期间有很多的产品,在这里就不一一介绍了,这时的 CPU 频率已经达到了 GHz 级,在 2004 年 Intel 已经造出了 P4 3.4GHz 处理器。与此同时,AMD 也同样不甘示弱,他们已经进入了 K8 时代,这一时代最出名的产品就是速龙系列,在性能上一点也不输于 AMD。两家公司的竞争越来越激烈,研发过程也明显加快了不少。
时间到了 2007 年,Intel 公司的主流 CPU 可分为四种,奔腾、至强、赛扬、酷睿。其中最为人知的就是酷睿系列,很多人都以为,酷睿的发展顺序应该是从小数到大数,但实际上并非如此,最先诞生的是 i7 系列,2008 年,Intel 推出了 i7 920 它取代了酷睿二代的地位,成为一个十分强大的存在。但是后来人们还是认为它的价格过高,2009 年酷睿 i5 系列也随之诞生,为更多的人提供了便宜又高性能的 CPU。随后,Intel 又推出了 i3 系列,它是 i5 系列的精简版,性能也只是稍逊一点,现在一直发展到现在,在与 AMD 做斗争。AMD 方面也不甘落后,AMD 新推出的锐龙处理器相当强悍。有 Ryzen 3、Ryzen 5、Ryzen 7 三个系列,例如 Ryzen 5 2600X 其性能远超于 i5-9400f,而 Ryzen 7 2700X 也一度挑战 i9 系列的存在。
从 1947 年被发明的第一个晶体管,到现在接近逆天的 Ryzen7 和 corei9,怎么看都是一个不可思议的过程,其中的发展要非常感谢 Intel 和 AMD 两家公司的相爱相杀。根据摩尔定律,每十八个月晶体管的密度会翻一倍,未来 CPU 会怎么样我们仍然难以想象。
展望完 CPU 的发展历史,还要回归到 CPU 的本质。CPU 发展至今已经集成了大规模复杂的电路,可以把它看作是一个由很多小块组成的复杂机器,然而无论 CPU 的具体实现怎么变、晶体管数量翻多少番,这些小块从功能的角度大致可以划分成三大部分:算术逻辑单元、存储单元和控制单元。
当然这里面其实只是一个简图,实际上中央处理单元,它的整个连线,整个 IO,整个具体的控制流程是非常的复杂的,接下来简单介绍这些组成单元以及单元之间是怎么互相配合的。
CPU 的主要功能就是运算,这正是通过算术逻辑单元(ALU,Arithmetic Logic Unit)实现的。ALU 电路内部由算术单元(AU)和逻辑单元(LU)组合而成,可对两个输入值(操作数)执行算术或逻辑运算并产生一个输出值。
算术单元负责对二进制数执行加减等数学运算,而逻辑单元执行与、或、非等逻辑运算,以及对两个操作数进行比较等。另外 ALU 还具备位移功能,将输入的操作数向左或向右移动从而得到新的操作数.不只是 CPU,其他如图形处理器 GPU 等几乎所有的微处理器中,ALU 都是最基本的组件。
除了执行与加法和减法相关的计算外,ALU 还可以处理两个整数的乘法,因为它们旨在执行整数计算;因此,它的结果也是一个整数。但是,除法运算通常不能由 ALU 执行,因为除法运算可能会产生浮点数的结果。相反,浮点单元 (FPU,floating-point unit)通常处理除法运算;FPU 也可以执行其他非整数计算。
浮点数的由来:用科学计数法的方式表示小数时,小数点的位置就变得「漂浮不定」了,这就是相对于定点数,浮点数名字的由来。
虽然 ALU 是处理器中的主要组件,但 ALU 的设计和功能在不同的处理器中可能会有所不同。例如,有些 ALU 设计为仅执行整数计算,而有些则用于浮点运算。一些处理器包含单个算术逻辑单元来执行操作,而其他处理器可能包含许多 ALU 来完成计算。ALU 执行的操作是:
如图所示,ALU 包含各种输入和输出连接,这使得外部电子设备和 ALU 之间可以投射数字信号。ALU 输入从外部电路获取信号,作为响应,外部电子设备从 ALU 获取输出信号。
ALU 是一种组合逻辑电路,这意味着它的输出将随着输入变化而异步变化。在正常操作中,稳定信号被施加到所有 ALU 输入,当信号通过 ALU 电路传播足够的时间(称为“传播延迟”)时,ALU 操作的结果出现在 ALU 输出。连接到 ALU 的外部电路负责确保 ALU 输入信号在整个操作过程中的稳定性,并在对 ALU 结果进行采样之前留出足够的时间让信号通过 ALU 传播。
通常,外部电路通过向 ALU 的输入施加信号来控制 ALU。通常,外部电路采用时序逻辑来控制 ALU 操作,该操作由频率足够低的时钟信号来控制,以确保 ALU 输出有足够的时间在最坏情况下稳定下来。
存储单元(MU,Memory Unit)也可以称为寄存器,为什么会出现寄存器?因为我们知道,程序在内存中装载,由 CPU 来运行,CPU 的主要职责就是用来处理数据。那么这个过程势必涉及到从存储器中读取和写入数据,因为它涉及通过控制总线发送数据请求并进入存储器存储单元,通过同一通道获取数据,这个过程非常的繁琐并且会涉及到大量的内存占用,而且有一些常用的内存页存在,其实是没有必要的,因此出现了寄存器,存储在 CPU 内部。
没有寄存器的话,CPU 将需要不断地从内存中读取和写入数据,这将严重降低计算机的性能。因为寄存器比内存更快,所以使用寄存器可以加速计算机的操作和计算。此外,寄存器还可以用于存储中间结果和操作数,从而简化了 CPU 内部的计算过程。
寄存器主要分为两种指令寄存器和数据寄存器,负责暂存指令、ALU 所需操作数、ALU 算出结果等。算术逻辑单元 ALU 在执行计算的时候,需要读取存储在寄存器中的操作数,计算结果则保存到累加器中(也是一种寄存器),ALU 执行的命令则来自指令寄存器。
比如,当将两个数字相加时,一个数字放在 A 寄存器中,另一个放在 B 寄存器中,ALU 执行加法后将结果放入累加器中。如果是逻辑操作,则把要比较的数据放进输入寄存器中,比较的结果 1 或 0 放入累加器中。无论是逻辑运算还是算术运算,累加器内容都会被放入缓存中。
寄存器的存储容量是根据其位数来决定的,不同的寄存器有不同的位数,可以存储的数据数量也不同。例如,一个 8 位的寄存器(INPR)可以存储 256 个不同的值。
另外,寄存器的存储容量也可以根据其用途和设计来决定。例如,在 CPU 中,指令寄存器通常只能存储一条指令,而数据寄存器则可以存储多个数据。有了寄存器,才能让 CPU 快速地存储、访问和操作指令和数据,从而提高了计算机的整体性能和效率。
如上图所示寄存器的种类有很多,下面我们来看看几个常见寄存器的功能:
除此之外,寄存器的种类还有很多,感兴趣的读者可以自行查阅资料学习。
上述的寄存器(Register)即 CPU 内部的存储单元,用于存储供 CPU 访问的数据和指令,以及存储任何计算或任务的中间结果。处理的最终结果也会被保存到存储单元中,然后将这些结果发布到输出设备提供给用户。不过 CPU 内部存储单元的容量极为有限,大量数据只能保存在 CPU 之外的 RAM(随机存取存储器)芯片中,就是我们平常所说的内存,也被称之为主存。存储器单元负责从主存中检索并临时存储数据,负责管理 CPU 和主存之间的数据流。相信,提起内存,很多人对这个东西很熟悉。虽然他们都是可以存储数据,但是还是千差万别。下面我们简要概括寄存器和内存的区别:
那寄存器既然这么重要,速度这么快,为什么不把它搞大一点呢?其原因在于好的东西其价格都很贵,从成本角度不如内存合适。
控制单元(CU,Control Unit)的主要工作用一句话概括就是告知最有效的工作方法。控制单元从主存中检索和选取指令,对其进行解码,然后发出适当的控制信号,指导计算机的其他组件执行所需的操作。控制单元自身并不执行程序指令,它只是输出信号指示系统的其他部分如何做。
如果说 CPU 是计算机的大脑,那么控制单元就是 CPU 的大脑,也是 CPU 中最重要的部分。控制单元的任务可以分为解码指令、生成控制信号,并将这些信号发送给其他组件,例如 ALU、MU、存储器和输入/输出设备等。接下来的部分将详细介绍控制单元的任务,并举例说明。
学习了控制单元 CU 的工作任务就是接收指令,指挥执行。我们接下来看看 CU 的工作过程如下图所示,CU 所接收的输入有三个:节拍发生器(Step Counter)、操作译码器(Instruction)、标志信号(Condition Signal)
CU 接收这三个外部参数后,就能够发出控制信号——微命令(Control Signals),来指挥 CPU 做出微操作。
介绍完上述 CPU 的基本组件,我们由浅入深用一张现代 CPU 架构图作为本节内容的结尾。如下图所示的是一张英特尔酷睿 CPU 的架构图,从复杂的控制流程中,我们还是可以清晰的看到 ALU,MU 以及 CU 这些我们刚刚学习过的内容,当然读者朋友要是想设计这么一张架构图还是需要很多的知识储备的。
接下来我们来介绍一下这些主要单元是如何相互配合完成的也就是 CPU 的工作流,主要分为 4 步:
结合下图简单解释,第一步就是从内存里面去读取一些指令,给到控制单元 CU,而控制单元就会对刚才读取的一些指令来进行解码,变成正式的一些 command 命令,然后 ALU 就会去执行这些 command,这些命令执行完之后就会存储回来内存进行汇总也就是写回。
接下来我们就从编程的视角去理解 CPU 的工作流。平时我们变成使用 C++、Java、Python 等编程语言编译好的程序文件(机器码),保存在硬盘等存储介质上,当操作系统运行这些程序的时候,首先会将它们加载到系统内存中。
程序文件实际就是一系列的指令,CPU 从内存中检索并读取程序指令,然后通过控制单元对程序指令进行译码操作,使其转化为 CPU 能够“读懂”的指令格式。
接下来控制单元向算术逻辑单元 ALU 发送信号,ALU 即依据指令读取操作数并进行相应计算,其计算结果经由 CPU 内的存储单元返回内存中。
在以上过程中,CPU 执行了四个重要步骤:1)从内存提取指令;2)解码;3)执行;4)写回。这四个步骤是完整执行一条指令的过程,称之为指令周期(Instruction Cycle)。
这一过程循环往复地进行,直到程序结束。说起来简单,实际过程却很复杂。单以取指令这一步骤来说,它本身就又由多个微操作组成:
接下来的译码、执行等阶段,也都有着各自复杂的操作,感兴趣的伙伴可以详细学习计算机组成原理(计算机必修课)。
回到 CPU 的的架构,我们需要了解的是 CPU 三大组成的各自分工,控制器和寄存器负责的工作最多、要存的数据最多的两部分。
下图是 CPU 的一个简要架构图,从下往上是 DRAM(Dynamic Random Access Memory,动态随机存取存储器)以及 Cache 这些其实都可以当作是内存,然后有控制器,真正的执行单元就是 ALU,我们可以看到真正执行单元的 ALU 占的面积是非常的小的,图中假设有 4 个 ALU 或者计算盒,而在整体电路里面占了绝大部分面积的是内存还有控制器,而并非计算,所以说 CPU 是非常适合擅长处理逻辑控制,而并非计算。
真正想要芯片具有非常好的计算性能,那就需要 GPU、NPU 而不是 CPU。当然我们后面会给大家介绍的。那下面我们来看一下 CPU 的约束和限制。
实质上 ALU 模块(逻辑运算单元)是用来完成数据计算,其他各个模块的存在都是为了保证指令能够一条接一条的有序执行。这种通用性结构对于传统的编程计算模式非常适合,同时可以通过提升 CPU 主频(提升单位时间内执行指令的条数)来提升计算速度。
但是,依照冯·诺依曼架构针对指令的“顺序执行”的原则,CPU 只能执行完一条指令再来下一条,计算能力进一步受限。当然了,我们会存在多核的情况,一次或可以执行多条指令,因为大原则受限于顺序执行,所以计算能力的提升是受到限制的。于是我们引入了第二个内容,也就是本节的第二章,CPU 并行处理架构。
转载自:
作者:用户11307734
链接:https://cloud.tencent.com/developer/article/2471365
来源:腾讯云
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。