在本文将着重介绍CPU基础内容,从CPU的发展历史入手,看看世界上第一块CPU是怎么诞生的,再到当代CPU的组成,为什么CPU能为电脑处理那么多的事情?
ENIAC的发明,奠定了电子计算机的发展基础,开辟了信息时代的新纪元,是人类第三次产业革命开始的标志,具有重要的历史意义。
与ENIAC不同且更为人知的是EDVAC:(ElectronicDiscreteVariableAutomaticComputer,电子离散变量自动计算机)。
1945年3月由冯·诺伊曼本人与莫奇利、埃克特等提出,1951年最终完成。EDVAC是二进制串行计算机,具有加减乘和软件除的功能。一条加法指令约864微秒,乘法指令2900微秒(或2.9毫秒)。使用延迟线存储器,具有1000个44位(bit)的字。这是世界上首次提出的第一台采用二进制的冯·诺依曼计算机,由运算器、控制器、存储器、输入和输出设备5部分组成,也就是我们熟知的冯·诺依曼架构。
这种体系结构一直延续至今,现在使用的计算机,其基本工作原理仍然是存储程序和程序控制,所以现在一般计算机被称为冯诺依曼结构计算机。鉴于冯诺依曼在发明电子计算机中所起到关键性作用,他被西方人誉为"计算机之父"。(他在数学和经济学领域的贡献也很卓著,被称为“博弈论之父”)
1991年,AMD也宣布自己的新产品,AMD386,核心代号p9,跟Intel386一样有DX和SX之分,且两家公司的CPU在性能上没有太大的差别。同样,仅过了两年,AMD也研制出了AMD486DX,随后AMD又衍生出一系列486的衍生产品,AMD486DX–2,AMD486DX–4等,值得一提的是,AMD486DX4–120,在频率上第一次超过了自己的竞争对手Intel公司。
1997年1月PentiumMMX的出现更是将Pentium系列的强度提升了一个档次,最后在1997年5月7日,PentiumⅡ系列诞生了,这一时期衍生出了PentiumⅡ233,PentiumⅡ266,PentiumⅡ300,这三款CPU均采用SLOT1架构。再插句嘴,这期间诞生的PentiumⅡXeon处理器就是我们后来所熟知的至强系列。Intel公司为自己的成就沾沾自喜,以为AMD已经被甩到八条街以外了,但是AMD已经进入了一个全新的时代––AMDK6处理器。它的性能可堪比Intel家的PentiumMMX,随后又衍生出了AMDK6-2,AMDK6-3这让Intel感受到了很大的压力。
2000年,跨世纪的一年,同样也是CPU界意义非凡的一年,Pentium4横空出世,这一次Intel公司一改之前很快改变自己的产品名称,将奔腾四代研发了四五年,期间有很多的产品,在这里就不一一介绍了,这时的CPU频率已经达到了GHz级,在2004年Intel已经造出了P43.4GHz处理器。与此同时,AMD也同样不甘示弱,他们已经进入了K8时代,这一时代最出名的产品就是速龙系列,在性能上一点也不输于AMD。两家公司的竞争越来越激烈,研发过程也明显加快了不少。
从1947年被发明的第一个晶体管,到现在接近逆天的Ryzen7和corei9,怎么看都是一个不可思议的过程,其中的发展要非常感谢Intel和AMD两家公司的相爱相杀。根据摩尔定律,每十八个月晶体管的密度会翻一倍,未来CPU会怎么样我们仍然难以想象。
展望完CPU的发展历史,还要回归到CPU的本质。CPU发展至今已经集成了大规模复杂的电路,可以把它看作是一个由很多小块组成的复杂机器,然而无论CPU的具体实现怎么变、晶体管数量翻多少番,这些小块从功能的角度大致可以划分成三大部分:算术逻辑单元、存储单元和控制单元。
当然这里面其实只是一个简图,实际上中央处理单元,它的整个连线,整个IO,整个具体的控制流程是非常的复杂的,接下来简单介绍这些组成单元以及单元之间是怎么互相配合的。
CPU的主要功能就是运算,这正是通过算术逻辑单元(ALU,ArithmeticLogicUnit)实现的。ALU电路内部由算术单元(AU)和逻辑单元(LU)组合而成,可对两个输入值(操作数)执行算术或逻辑运算并产生一个输出值。
浮点数的由来:用科学计数法的方式表示小数时,小数点的位置就变得「漂浮不定」了,这就是相对于定点数,浮点数名字的由来。
虽然ALU是处理器中的主要组件,但ALU的设计和功能在不同的处理器中可能会有所不同。例如,有些ALU设计为仅执行整数计算,而有些则用于浮点运算。一些处理器包含单个算术逻辑单元来执行操作,而其他处理器可能包含许多ALU来完成计算。ALU执行的操作是:
如图所示,ALU包含各种输入和输出连接,这使得外部电子设备和ALU之间可以投射数字信号。ALU输入从外部电路获取信号,作为响应,外部电子设备从ALU获取输出信号。
存储单元(MU,MemoryUnit)也可以称为寄存器,为什么会出现寄存器?因为我们知道,程序在内存中装载,由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,ControlUnit)的主要工作用一句话概括就是告知最有效的工作方法。控制单元从主存中检索和选取指令,对其进行解码,然后发出适当的控制信号,指导计算机的其他组件执行所需的操作。控制单元自身并不执行程序指令,它只是输出信号指示系统的其他部分如何做。
如果说CPU是计算机的大脑,那么控制单元就是CPU的大脑,也是CPU中最重要的部分。控制单元的任务可以分为解码指令、生成控制信号,并将这些信号发送给其他组件,例如ALU、MU、存储器和输入/输出设备等。接下来的部分将详细介绍控制单元的任务,并举例说明。
学习了控制单元CU的工作任务就是接收指令,指挥执行。我们接下来看看CU的工作过程如下图所示,CU所接收的输入有三个:节拍发生器(StepCounter)、操作译码器(Instruction)、标志信号(ConditionSignal)
CU接收这三个外部参数后,就能够发出控制信号——微命令(ControlSignals),来指挥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)写回。这四个步骤是完整执行一条指令的过程,称之为指令周期(InstructionCycle)。
这一过程循环往复地进行,直到程序结束。说起来简单,实际过程却很复杂。单以取指令这一步骤来说,它本身就又由多个微操作组成:
接下来的译码、执行等阶段,也都有着各自复杂的操作,感兴趣的伙伴可以详细学习计算机组成原理(计算机必修课)。
回到CPU的的架构,我们需要了解的是CPU三大组成的各自分工,控制器和寄存器负责的工作最多、要存的数据最多的两部分。
下图是CPU的一个简要架构图,从下往上是DRAM(DynamicRandomAccessMemory,动态随机存取存储器)以及Cache这些其实都可以当作是内存,然后有控制器,真正的执行单元就是ALU,我们可以看到真正执行单元的ALU占的面积是非常的小的,图中假设有4个ALU或者计算盒,而在整体电路里面占了绝大部分面积的是内存还有控制器,而并非计算,所以说CPU是非常适合擅长处理逻辑控制,而并非计算。
真正想要芯片具有非常好的计算性能,那就需要GPU、NPU而不是CPU。当然我们后面会给大家介绍的。那下面我们来看一下CPU的约束和限制。
但是,依照冯·诺依曼架构针对指令的“顺序执行”的原则,CPU只能执行完一条指令再来下一条,计算能力进一步受限。当然了,我们会存在多核的情况,一次或可以执行多条指令,因为大原则受限于顺序执行,所以计算能力的提升是受到限制的。于是我们引入了第二个内容,也就是本节的第二章,CPU并行处理架构。