CPU

来自吾萌百科
(重定向自中央处理器
Intel 80486DX2 top.jpg

中央处理单元(Central Processing Unit)也称为中央处理器、主处理器或仅称为处理器,是执行包含计算机程序的指令的电子电路。CPU 执行程序中的指令指定的基本算术、逻辑、控制和输入/输出(I/O) 操作。这与诸如主存储器和 I/O 电路等外部组件以及诸如图形处理单元(GPU) 之类的专用处理器形成鲜明对比。

CPU的形式、设计和实现随着时间的推移发生了变化,但它们的基本操作几乎没有变化。CPU 的主要组件包括执行算术和逻辑运算的算术逻辑单元(ALU)、向 ALU提供操作数并存储 ALU 运算结果的处理器寄存器,以及协调提取(从内存)的控制单元,通过指导 ALU、寄存器和其他组件的协调操作来解码和执行指令。

大多数现代 CPU 是在集成电路(IC)微处理器上实现的,在单个金属氧化物半导体(MOS)IC芯片上有一个或多个 CPU。具有多个 CPU 的微处理器芯片是多核处理器。单个物理 CPU、处理器内核也可以是多线程的,以创建额外的虚拟或逻辑 CPU。

包含 CPU 的 IC 还可能包含内存、外围接口和计算机的其他组件;这种集成设备被称为微控制器片上系统(SoC)

阵列处理器或向量处理器具有多个并行运行的处理器,没有任何单元被视为中央处理器。虚拟 CPU是动态聚合计算资源的抽象。

历史

早期的计算机(例如ENIAC)必须进行物理重新布线以执行不同的任务,这导致这些计算机被称为固定程序计算机中央处理器一词早在 1955 年就开始使用。由于CPU一词通常被定义为执行软件(计算机程序)的设备,因此最早的设备是随着存储程序计算机的出现,可以正确地称为CPU

存储程序计算机的想法已经出现在J. Presper EckertJohn William MauchlyENIAC的设计中,但最初被省略以便可以更快地完成。 1945 年6月30日,在 ENIAC 制作之前,数学家约翰·冯·诺依曼分发了题为EDVAC 报告初稿的论文。它是最终将在 1949 年 8 月完成的存储程序计算机的概要。 EDVAC旨在执行一定数量的各种类型的指令(或操作)。重要的是,为 EDVAC 编写的程序将存储在高速计算机内存中而不是由计算机的物理接线指定。这克服了 ENIAC 的一个严重限制,即重新配置计算机以执行新任务所需的大量时间和精力。根据冯诺依曼的设计,EDVAC 运行的程序可以简单地通过改变内存的内容来改变。然而,EDVAC 并不是第一台存储程序的计算机。Manchester Baby是一种小型实验性存储程序计算机,于 1948 年 6 月 21 日运行了它的第一个程序,Manchester Mark 1在 1949 年 6 月 16 日至 17 日夜间运行了它的第一个程序。

早期的 CPU 是定制设计,用作更大且有时独特的计算机的一部分。然而,这种为特定应用设计定制 CPU 的方法在很大程度上让位于开发大量生产的多用途处理器。这种标准化始于分立晶体管 大型机和小型机时代,并随着集成电路(IC)的普及而迅速加速。该 IC 允许设计和制造越来越复杂的 CPU,以达到纳米级的公差。CPU 的小型化和标准化都增加了数字设备在现代生活中的存在,远远超出了专用计算机的有限应用。现代微处理器出现在电子设备中,从汽车到手机,有时甚至出现在玩具中。

虽然冯·诺依曼最常被认为是存储程序计算机的设计,因为他设计了EDVAC,并且该设计被称为冯·诺依曼架构,但在他之前的其他人,如Konrad Zuse,也提出并实施了类似的想法。在EDVAC之前完成的哈佛 Mark I的所谓哈佛架构也使用了使用穿孔纸带而不是电子存储器的存储程序设计。冯诺依曼架构和哈佛架构之间的主要区别在于后者将 CPU 指令和数据的存储和处理分开,而前者为两者使用相同的内存空间。大多数现代 CPU 在设计上主要是冯诺依曼,但也可以看到具有哈佛架构的 CPU,尤其是在嵌入式应用中;例如,Atmel AVR微控制器哈佛架构处理器

继电器和真空管(热电子管)通常用作开关元件;一台有用的计算机需要数千或数万个开关设备。系统的整体速度取决于交换机的速度。像 EDVAC 这样的真空管计算机的平均故障间隔往往为 8 小时,而像哈佛 Mark I这样的中继计算机(速度较慢,但更早)很少发生故障。最终,基于管的 CPU 成为主导,因为其显着的速度优势通常超过了可靠性问题。大多数这些早期同步 CPU 以低时钟速率运行与现代微电子设计相比。[math]\displaystyle{ 100 kHz \sim 4 MHz }[/math]的时钟信号频率在当时非常普遍,很大程度上受限于它们所用的开关设备的速度。

制造

现在的CPU多数基于高纯硅,而这些硅多采自硅矿石后进行提纯得到,将高纯硅高温融化,然后从高温融合中采用旋转拉伸的方式将硅原料取出,结果就是一个圆柱型的硅锭,硅锭的尺寸不一,常见的有200mm、300mm、450mm、在保留硅锭的各种特性不变的情况下增加横截面的面积是具有相当难度的。将其切割后,成品就是元晶圆。

给元晶圆涂满光刻胶,然后使用光刻机雕刻电路 (溶解光刻胶),然后进行蚀刻,使得没有光刻胶的地方底下的硅产生凹陷,然后离子注入、电镀、铜层生长后就得到了 成品晶圆 (Wafer)。  然后使用探针基于电气特性进行测试,测试结束后使用精准的切片机将一个个小格切开。然后得到了CPU的核心 Die。

接下来,对Die进行封装,得到的就是白牌的CPU了。之后会对其进行测试,测试通过测量电压、频率、散热、性能、cache等来为该CPU进行分类,因为良品率的关系,不一定每个核心都是可用的,接下来就会对坏核进行屏蔽,作为低端产品进行销售。对应不同的市场。至于每个产品具体细分,在测试的时候如果cache错误就关闭部分cache,温度上升出错就锁到低频,核心错误就关闭核心,超线程有问题就关闭超线程,就有了各各具体的分类,当然太坏的会直接丢掉。

对于通用CPU来说,如果核心的数目太多会导致两个令人烦恼不已的问题,任务的并行执行和存储器一致性。在多个核心共同完成一个任务或多个互相关联的任务的情况下,任务的划分、调度、子任务之间的通信、互锁等问题会非常复杂、非常难以优化。并且,复杂性随着核心数目增多而呈指数增长。同样的,如果他们共用一个存储空间,就需要确保同一地址读出的数据是相同的,同时还需要涉及公用存储器(低层次的Cache、内存)数据的更新,备份等问题,核心数目越多,同一时段就有越多的写入读出请求需要调度,复杂性就随核心数目增多呈指数增长。

改进型哈佛架构

现今的CPU都是改进型哈佛架构,改进的哈佛架构放松了指令和数据严格分离这一特征,仍然允许CPU同时访问多个内存总线。最常见的修改包括由公共地址空间支持的单独指令和数据告诉缓存,当它作为一个纯粹的哈佛机时,CPU通过高速缓存来执行指令。当访问外部储存器时,它的作用就像一个冯·诺依曼机 (代码可以像数据一样移动)。

控制器和运算器

中央处理器 (Central Processing Unit) 包含 运算器控制器

控制器

控制器 (Controller) 是全机的管理机构和指挥中心,它按照预先确定的操作步骤,协调控制计算机各部件有条不紊的工作。

控制器工作的实质就是解释程序,它每次从存储器读取一条指令,经过分析译码,产生一系列操纵计算机其他部分工作的控制信号 (操作命令),发向各个部件,控制各部件动作,使整个机器连续、有条不紊运行。高级计算机中的控制器可以改变某些指令的顺序,以改善性能。对于所以CPU而言,一个共同的关键部分就是程序计数器 (PC, Program Counter) ,它是一个特殊的寄存器 (Register),记录着将要读取的下一条指令在存储器中的位置。

控制器的基本工作流程

控制器的基本工作流程如下 (注意这是一种简化描述,其中的某些步骤可以根据CPU的类型而并发执行或以不同的顺序执行):

  1. 从程序计数器所指示的存储单元中,读取下一条指令代码。
  2. 把指令代码译码为一系列命令或信号,发向各个不同的功能部件。
  3. 递增程序计数器,以指向下一条指令。
  4. 根据指令需要,从存储器 (或输入设备) 读取数据,所需数据的存储器位置通常保存在指令代码中。
  5. 把读取的数据提供给 运算器寄存器
  6. 如果指令需要由 运算器 或 专门硬件 来完成,则命令该硬件执行所请求的操作。
  7. 把来自运算器的计算结果写回 存储器寄存器输出设备
  8. 转回第一步。

控制器的基本任务

控制器的基本任务,就是按照程序所排的指令序列,从存储器取出一条指令 (简称:取指) 放到控制器中,对该指令进行译码分析,然后根据指令性质,执行这条指令,进行相应的操作。接着,再 取指、译码、执行、...... ,依此类推。

通常把取指令的一段时间叫作 取指周期 ,而把执行指令的一段时间叫做 执行周期。因此,控制器反复交替地处在取指周期和执行周期之中。每取出一条指令,控制器中的程序计数器就加1,从而为取下一条指令做好准备。正因为如此,指令在存储器中必须顺序存放。

指令和数据

计算机中有两股信息在流动,一股是控制信息 ,即操作命令,其发源地是控制器,它分散流向各个部件;另一股是数据信息,它受控制信息的控制,从一个部件流向另一个部件,边流动边加工处理。

在读存储器时,由于冯·诺伊曼计算机的指令和数据都以二进制存放在存储器中,似乎难以分清哪些是指令,哪些是数据,然而控制器却完全可以进行区分。

一般来讲,取指周期中从存储器读出的是指令流,它由存储器流向控制器;而执行周期从存储器读出的信息流是数据流,它由存储器流向运算器。

显然,某些指令执行过程中需要两次访问存储器,一次是取指令,另一次是取数据。

运算器

运算器是一个用于信息加工的部件,用于对数据进行 算术运算逻辑运算。 运算器通常由算数逻辑单元 (ALU, Arithmeric Logic Unit) 和一系列寄存器组成。其中,ALU是具体完成算术与逻辑运算的单元,是运算器的核心,由加法器及其他逻辑运算单元组成。寄存器用于存放参与运算的操作数。累加器是一个特殊的寄存器,除了可以存放操作数外,还用于存放中间结果和最后结果。

特定的ALU所支持的算数运算可能仅局限于加法和减法,也可能包括乘法、除法,甚至三角函数和平方根。有些ALU只支持整数,而其他ALU则可以使用浮点来表示有限精度的实数。但是任何能够执行最简单运算的计算机,都可以通过变成来执行任何算数运算,如果其ALU不能从硬件上直接支持,则该运算将要话费较多的时间用软件方式完成。

逻辑运算包括 与 (AND)、或 (OR)、异或 (XOR)、非 (NOT) 等布尔运算,对于创建复杂的条件语句和处理布尔逻辑都是有用的 。 ALU还可以比较数值,并根据是否相等、大于或小于来返回布尔值,真 (TRUE)假 (FLASE)

超标量 (Superscalar) 计算机包含多个ALU,可以同时处理多条指令。图形处理器和具有单指令流多数据流 (SIMD)多指令流多数据流 (MIMD) 特性的计算机通常提供可以执行矢量和矩阵算术运算的ALU。

CPU的功能和组成

CPU的基本功能

CPU控制整个程序的执行,它具有以下基本功能:

  1. 程序控制
    程序控制就是控制指令的执行顺序,程序是指令的有序集合,这些指令的相互顺序不能任意颠倒,必须严格按照规定的顺序执行。保证计算机按一定顺序执行程序是CPU的首要任务。
  2. 操作控制
    操作控制就是控制指令进行操作。一条指令的功能往往由若干个操作信号的组合来实现。因此,CPU管理并产生每条指令的操作信号,把各种操作信号送往相应的部件,从而控制这些部件按指令的要求进行操作。
  3. 时间控制
    时间控制就是对各种操作实行定时控制。在计算机中,各种指令的操作信号和一条指令的整个执行过程都受到严格定时。只有这样,计算机才能有条不紊地工作。
  4. 数据加工
    数据加工就是对数据进行算术、逻辑运算。完成数据的加工处理,是CPU的根本任务。

CPU的基本组成

传统上,CPU由控制器和运算器这两个主要部件组成。随着集成电路技术的不断发展和进步,新型CPU纷纷集成了一些原本置于CPU之外的分立功能部件,如浮点处理器高速缓存 (Cache)等,在大大提升CPU性能指标的同时,也使得CPU的内部组成日益复杂化。

CPU中的主要寄存器

在CPU中至少要有六类寄存器,分别是指令寄存器 (IR)、程序计数器 (PC)、地址寄存器 (AR)、数据寄存器 (DR)、累加寄存器 (AC)、程序状态字寄存器 (PSW)。这些寄存器用于暂存一个计算机字,其数目可以根据需要进行扩充。下面详细介绍这些寄存器的功能与结构。

数据寄存器 (DR)

数据寄存器 (Data Register) 主要作为CPU和主存、外设之间信息传输的中转站,用于弥补CPU和主存、外设之间操作速度上的差异。数据寄存器用来暂时存放由主存储器读出的一条指令或一个数据字;反之,当向主存存入一个数据字时,也将他们存放在数据寄存器中。

数据寄存器的作用是:

  1. 作为CPU和主存、外围设备之间信息传送的中转站。
  2. 弥补CPU和主存、外围设备之间在操作速度上的差异。
  3. 在单累加器结构的运算器中,数据寄存器还可兼作操作数寄存器。

指令寄存器 (IR)

指令寄存器 (Instruction Register)用来保存当前正在执行的一条指令。当执行一条指令时,先把该指令从主存读取到数据寄存器中,然后再传送至指令寄存器。

一条指令被划分为操作码和地址码2个字段。为了执行任何给定的指令,必须对操作码进行测试,以便识别所要求的操作。指令译码器 (Instruction Decoder)就是完成这项工作的。

指令译码器对来自指令寄存器的操作码部分进行译码,以产生操作性质的控制电位,并将其送到微操作控制线路上,在时序部件定时信号作用下,在时序部件定时信号作用下,产生具体的操作控制信号。指令寄存器中操作码字段的输出就是指令译码器的输入。操作码一经译码后,即可向操作控制器发出具体操作的特定信号。

程序计数器 (PC)

程序计数器 (Program Counter) 用来指出下一条指令在主存储器中的单元地址。 在程序执行前,首先必须将程序的首地址,即程序的第一条指令所在的主存单元地址送入PC。因此PC的内容即是从主存提取的第一条指令的地址。

当执行指令时,CPU能自动递增PC的内容,使其始终保持将要执行的下一条指令的主存地址,为取下一条指令做好准备。若为单字长指令,则[math]\displaystyle{ (PC) + 1 \rightarrow PC }[/math],若为双字长指令,则 [math]\displaystyle{ (PC) + 2 \rightarrow PC }[/math],以此类推。

但是,当遇到转移指令时,下一条指令的地址将由转移指令的地址码字段指定,而不是像通常那样通过顺序递增PC的内容来取得。因此程序计数器的结构应当是具有寄存信息和计数两种功能的结构。

地址寄存器 (AR)

地址寄存器 (Address Rigister)用来保存CPU当前所访问的主存单元的地址。由于在主存和CPU之间存在操作速度上的差异,所以必须使用地址寄存器来暂时保存主存的地址信息,直到主存的存取操作完成为止。当CPU和主存进行信息交换,即CPU向主存存入/取出数据时,或者CPU从主存读出指令时,都要使用地址寄存器和数据寄存器。

同样,如果我们把外围的设备地址当作主存的地址单元那样来看待,那么,当CPU和外围设备交换信息时,我们同样要使用地址寄存器数据寄存器

累加寄存器 (AC)

累加寄存器通常简称 累加器 (Accumulator) ,是一个通用寄存器。

累加器的功能是:当运算器的算术逻辑单元 (ALU)执行算术或逻辑运算时,为ALU提供一个工作区,可以为ALU暂时保存一个操作数或运算结果。显然,运算器中至少要有一个累加寄存器。

程序状态字寄存器 (PSW)

程序状态字 (Program Status Word)用来表征当前运算的状态及程序的工作方式。

程序状态字寄存器保存由算术指令和逻辑指令运行或测试的结果所建立起来的各种条件码内容,如 运算结果进/借位标志 (C)、运算结果溢出标志 (O)、运算结果为零标志 (Z)、运算结果为负标志 (N)、运算结果符号标志 (S)等,这些标志位通常用1位触发器来保存。

除此之外,程序状态字寄存器还保存中断和系统工作状态等信息,以便CPU和系统及时了解机器运行状态和程序运行状态。因此,程序状态字寄存器是一个保存各种状态条件标志的寄存器。