CPU 是如何工作的

CPU(Central Processing Unit) 中央处理器核心功能就是读取和执行指令。

CPU 的组成

CPU 内部主要由以下几个部分组成:

  • 算术逻辑运算单元(LRU)
  • 控制单元
  • 寄存器
  • 总线

这是一个 CPU 内部结构的简图

算术逻辑运算单元

它本质上是一个数字电路,主要功能就是对输入的数据进行算术运算操作(例如加add,减sub)和逻辑运算操作(例如与&,异或^)。他也是 CPU 中最基础的功能部件。

控制单元

控制单元控制着 CPU 内部的指令流和数据流的流向。
它本质上也是由多个数字电路模块组成,比如多路选择器,指令译码器等。

寄存器

寄存器是 CPU 特殊的存储区域,CPU 能够快速的访问到其中数据,它是计算机中最快的存储器,但数量也非常有限。

  • 指令寄存器(Instruction Register, IR)
    用来保存当前正在执行的一条指令。
  • 程序计数器(Program Counter, PC)
    用来指出下一条指令在主存中的地址。
  • 通用寄存器
    用于传送和暂存数据,也可参与算术逻辑运算,并保存计算结果。
  • 累加寄存器(Accumulator, AC)
    它是一个通用寄存器。主要功能是当运算器的 ALU 执行算术或逻辑运算时,可以为 ALU暂时保存一个操作数或者运算结果。
  • 程序状态寄存器(Program Status Word, PSW)
    用来表示当前运算的状态以及程序的工作方式。

总线

总线是 CPU 中连接上述各个部件的高速传输通道。主要分为以下三种:

  • 数据总线
  • 控制总线
  • 地址总线

在 CPU 中寄存器可以简单的分为以下几类:
寄存器和内存一样都是用来存储数据的,但是它速度更快,更方便 CPU 读取。

CPU 里负责从内存取数据的主要有三个模块:程序计数器(主要用来告诉 CPU 需要用到的数据在内存的位置),地址寄存器(负责记录 CPU 正在读取的数据的在内存的位置),数据寄存器(负责整个内存的数据的分发,即中转从外面进来的原数据和要传出去的已经处理完的数据)。

内存

内存就相当于一个临时仓库,当我们从电脑上打开一个程序时,和这个程序相关的数据就会从硬盘被传输到内存。这些数据就在内存里等着被 CPU 读取。内存里的数据主要是这个程序的数据和指令。数据就相当于要加工的原材料,指令相当于加工说明书,记录着对产品的要求和如何加工。

CPU 工作流程

基于冯诺依曼体系结构的 CPU,是采用存储程序的模型来实现的。简单的说就是先将程序存储在主存中,然后 CPU 不断的进行“fetch-decode-execute”这样一个指令处理流程。

CPU 的一个指令周期中执行的操作可以分为以下五个阶段:

  • IF(Instruction Fetch):获取指令
  • ID(Instruction Decode):指令译码
  • EX(Execute):执行指令
  • MEM(Memory):访存取数
  • WB(Writeback):结果写回

获取指令

将一条指令从主存中取到指令寄存器的过程。

指令的地址从程序寄存器(PC)中得知。

由于 CPU 的执行速度远远快于内存的读取速度,现代的 CPU 处理器中还引入了 Cache 缓存和流水线技术。

译码

按照预定的格式,对取回的指令进行拆分和解释。

CPU 中的每条指令所代表的具体含义由处理器对应的指令集(ISA)进行解析。

在这个阶段,每条指令会被分割成操作数和操作码两部分。

执行指令

CPU 中的各个部件协同工作来完成指令中操作码指定的操作。

算术逻辑单元里有累加寄存器(用于存储计算过程中的临时数据和结果)和程序状态寄存器(负责记录运算有没有进位,溢出等信息)。

访存取数

根据指令需要,有可能需要访问主存读取操作数,这样就进入了访存取数阶段。

这个阶段的主要任务是:根据指令地址码,得到操作数在主存中的地址,并从主存中读取该操作数用于计算。

结果写回

把执行阶段的运算结果数据写回到某种存储形式。
基于时间局部性原理,一般会将结果写回到 CPU 的寄存器数组中。
有的也会写回到内存中。

像 jump 类的指令则不会产生数据结果,只是修改了 PC 寄存器的值。

在结果写回之后,如果没有意外发生(比如结果溢出),计算机就会接着从 PC 寄存器取的下一条指令地址,开始一轮新的循环。

参考
CPU到底是怎么工作的?
CPU 是如何工作的?
一条指令在cpu中的执行流程