CPU 是怎样工作的?

CPU,也被称为微处理器,是计算机的大脑。让我们通过深入了解计算机的核心,来帮助自己有效地编写计算机程序。

“工具通常比机器更简单,它一般用手就可以操作,而机器需要被动物或蒸汽动力启动。”

—— Charles Babbage

计算机是由电力驱动的机器,但其灵活性和可编程性有助于实现工具的简单性。

CPU 是计算机的大脑。它执行提供给它的指令。它的主要工作是执行算术和逻辑运算并一起编排指令。在深入了解主要部分之前,我们先来看看CPU的主要组件以及它们的作用分别是什么:

处理器的两个主要组件

  • 控制单元 — CU(Control unit )
  • 算术和逻辑单元 — ALU(Arithmetic and logical unit)

控制单元 — CU

控制单元 CU 是 CPU 的一部分,用来帮助协调指令的执行,它告诉 CPU 该做什么。根据该指令,激活将 CPU 连接到计算机的其他不同部分的电路,其中包括 ALU。控制单元是 CPU 接收处理指令的第一个组件。

控制单元有两种类型:

  • 硬连线控制单元
  • 可微编程(微编程)控制单元

硬连线控制单元是硬件,需要更改硬件来修改它的工作方式;可编程控制单元可以通过编程来改变其行为。硬连线 CU 在处理指令时更快,而可编程 CU 则更灵活。

算术和逻辑单元 — ALU

算术和逻辑单元 ALU 进行所有的算术和逻辑计算。 ALU 执行加法、减法等操作。 ALU 由执行这些操作的逻辑电路或逻辑门组成。

大多数逻辑门有两个输入端和一个输出端。

下图是半加器电路的一个例子,它接收两个输入并输出结果。A 和 B 是输入,S 是输出,C 是进位。

img

存储 — 寄存器和内存

CPU 的主要工作是执行提供给它的指令。通常要处理这些指令,它需要数据。一些数据是中间数据,其中一些是输入,另一些是输出。这些数据以及指令存储在以下存储中:

寄存器

寄存器是一小组可以存储数据的地方。寄存器是锁存器的组合。 锁存器也称为触发器,是逻辑门的组合,它能够存储 1 bit 信息。

锁存器有两根输入线:写入和输入线,还有一根输出线。我们可以使写入线更改存储的数据。当禁用写入线时,输出始终保持不变。

img

一个SR锁存器,由一对交叉耦合的或非(NOR)组成

CPU 用寄存器来存储输出数据。因为它是中间数据,所以把它送到主存储器(RAM)会很慢。该数据被发送到由总线(BUS)连接的其他寄存器中。寄存器可以用来存储指令、输出数据、存储地址或其它类型的数据。

内存(RAM)

RAM 是一个用优化的方式被紧凑的排列在一起的寄存器的集合,以便它可以存储更多的数据。 RAM(随机存取存储器)是易失性的,当关闭电源时它的数据会丢失。

什么是指令

指令是计算机可以执行的粒度级的计算。 CPU 可以处理各种类型的指令。

指令包括:

  • 算术运算,如
  • 逻辑指令,如
  • 数据指令,如移动输入输出加载存储
  • 流程控制指令,例如 gotoif … gotocallreturn
  • 通知 CPU 程序已结束的 halt 指令

指令通过使用汇编语言提供给计算机,也可以由编译器生成,或以某些高级语言的形式进行解释。

这些指令在 CPU 内部是硬连线的。 ALU 包含算术和逻辑运算,其中控制流由 CU 管理。

在一个时钟周期内计算机可以执行一条指令,但现代计算机可以执行多个指令。

计算机可以执行的一组指令称为指令集

CPU时钟

时钟周期

计算机的速度是由其时钟周期决定的。它是计算机每秒时钟周期的数量。单个时钟周期非常小,大约是 250 * 10^-12 秒。时钟周期越短处理器的速度也越快。

CPU 时钟周期以 gHz(千兆赫兹)为单位。 1gHz 等于10⁹Hz(赫兹)。赫兹意味着每秒的周期数。所以1千兆赫表示每秒 10⁹ 个周期。

时钟周期越高,CPU 可以执行的指令就越多。时钟周期 = 1 / 时钟速率CPU时间 = 时钟周期数/时钟速率

这意味着可以提高时钟速率,通过改善 CPU 时间来优化 CPU 执行指令的速度。某些处理器提供了提高时钟周期的能力,但由于它是物理变化,因此可能存在使 CPU 过热甚至被烧毁的问题。

如何执行指令

指令按顺序存储在 RAM 中。假设我们有一个 CPU,其指令包括 OP 代码(操作代码)和存储器或寄存器地址

控制单元内有两个指令寄存器(IR),它用来加载指令的 OP 代码和指令地址寄存器,它用来加载当前执行指令的地址。在 CPU 的内部还有其他寄存器,用于保存存储在指令最后 4 位地址中的值。

接下来我们举一个添加两个数字的指令的例子。以下是指令和说明:

STEP 1 — LOAD_A 8:

该指令最初保存在 RAM 中,比如说<1100 1000>。前4位是操作码,它决定了指令是什么。该指令被提取到控制单元的 IR 中。指令被解码为 load_A,这意味着它需要加载地址 1000 中的数据,地址 1000 是寄存器 A 指令的最后 4 位。

STEP 2 — LOAD_B 2

与上面类似,这将存储器地址 2(0010)中的数据加载到 CPU 寄存器 B 中.

STEP 3— ADD B A

现在下一条指令是对这两个数字进行加法运算。在这里 CU 告诉 ALU 执行加法操作并将结果保存回寄存器 A.

STEP 4 — STORE_A 23

这是一组非常简单的指令,可以对两个数字进行加法运算。

我们已经成功的对两个数字进行了加法运算!

总线

CPU、寄存器、存储器和 IO 设备之间的所有数据都通过总线进行传输。要将前面进行加法运算的数据加载到存储器中, CPU 需要将存储器地址写入地址总线,并将运算的结果写入数据总线,还要在控制总线中启用正确的信号。通过这种方式,数据在总线的帮助下加载到存储器中。

img

缓存

CPU 还有将指令预取到其缓存的机制。据我们所知,处理器可以在一秒钟内完成数百万条指令。这意味着从 RAM 中获取指令所花费的时间比执行它们要多。因此 CPU 缓存会预取一些指令和数据以使执行速度更快。

如果高速缓存和操作存储器中的数据不同,则数据被标记为脏位

指令流水线

现代 CPU 使用指令流水线来执行指令并行化。获取-解码-执行。当一条指令处于解码阶段时,CPU 可以处理另一条指令用于获取阶段。

img

但是当一条指令依赖于另一条指令时会有问题。因此处理器执行没有依赖且按不同顺序执行的指令。

多核计算机

它基本上是不同的 CPU,但有一些共享资源,例如缓存。

性能

CPU 的性能由它的执行时间决定。性能 = 1 / 执行时间

假设执行一个程序需要 20ms。 CPU 的性能是 120 = 0.05ms 相对性能 = 执行时间1 / 执行时间2

CPU 性能考虑的因素是指令执行时间和 CPU 的时钟速度。因此为了提高程序的性能,我们需要提高时钟速度或减少程序中的指令数。处理器的速度有限,具有多核的现代计算机可以每秒支持数百万条指令。但是如果我们编写的程序有很多指令,这将会降低整体性能。

Big O 表示法根据给定的输入确定性能使如何受到影响的。

工程师在 CPU 中进行了大量优化使其更快,并尽可能多地执行指令。在编写任何程序时,我们需要考虑如何减少提供给 CPU 的指令数量将能够提高计算机程序的性能。