1. 简介

本文将介绍中央处理器(CPU)如何与算术逻辑单元(ALU)、寄存器和内存(RAM)等关键部件协同工作,完成程序的执行。

2. CPU 概览

CPU 是计算机的核心,负责执行程序中的每一条指令。程序如 Firefox、Sublime Text 或 GTA V,本质上都是一系列指令的集合。这些指令可能是数学运算(如加减),也可能涉及内存操作(如读写)。遇到数学指令时,CPU 会调用 ALU 进行计算;遇到内存指令时,CPU 会与内存交互。

为了完成这些复杂操作,CPU 内部结构相当复杂,如下图所示:

CPU2

我们简化一下模型:使用一个拥有 16 个地址、每个地址 8 位的内存;同时 CPU 拥有四个 8 位的寄存器 A、B、C、D,用于临时存储和操作数据。

2.1. 指令表

程序和数据都可以以二进制形式存储在内存中。CPU 通过指令表来定义其所支持的指令,并为每条指令分配一个唯一的 ID(即操作码 opcode)。在我们这个示例中,前 4 位是 opcode,后 4 位是操作所需的数据(比如寄存器编号或内存地址)。

我们还需要两个额外的寄存器:

  • 指令地址寄存器(Instruction Address Register):记录当前正在执行的指令在内存中的地址。
  • 指令寄存器(Instruction Register):保存当前指令的内容。

以下是我们示例中使用的指令表:

指令 描述 4 位 Opcode 参数(地址或寄存器)
LOAD_A 从内存地址读取到寄存器 A 0010 4 位内存地址
LOAD_B 从内存地址读取到寄存器 B 0001 4 位内存地址
STORE_A 将寄存器 A 的值写入内存 0100 4 位内存地址
ADD 将两个寄存器相加,结果存入第二个寄存器 1000 两个 2 位寄存器 ID

2.2. 指令周期

CPU 执行指令的过程分为三个阶段:取指(Fetch)、译码(Decode)、执行(Execute),循环往复直到计算机关闭。

以初始状态为例,指令地址寄存器为 0,因此从内存地址 0 中取出指令 00101110,并写入指令寄存器。此时进入译码阶段。

译码阶段中,前四位 0010 表示 LOAD_A 指令,后四位 1110(即十进制 14)表示内存地址。于是 CPU 从内存地址 14 读取数据并写入寄存器 A。

接下来继续执行 LOAD_B 指令(opcode 为 0001,地址为 1111,即十进制 15),将内存地址 15 的值 14 写入寄存器 B。

2.3. ADD 指令

当指令地址寄存器递增到 2 时,我们从内存地址 2 读取到指令 10000100。opcode 为 1000,表示 ADD 指令。后四位 0100 分别表示寄存器 B 和 A。

于是 ALU 将寄存器 A 和 B 的值相加(3 + 14 = 17),并将结果写入寄存器 A。

2.4. STORE 指令

最后执行的指令是 01001100。opcode 0100 对应 STORE_A,地址 1100(即十进制 12)。此时 CPU 将寄存器 A 的值 17 写入内存地址 12。

✅总结:我们从内存中加载了两个值,进行了加法运算,并将结果存储回内存。

3. CPU 时钟

CPU 的运行节奏由时钟信号控制,它以固定频率发出电信号,驱动 CPU 的取指、译码和执行流程。

这个频率称为时钟频率(Clock Speed),单位是赫兹(Hz)。例如,1Hz 表示每秒一个周期。

早期的 CPU,比如 1971 年发布的 Intel 4004,主频为 740 千赫兹(740,000 次/秒),而现代处理器主频可达几吉赫兹(Gigahertz),也就是每秒数十亿次运算。

⚠️注意:主频越高并不代表性能一定越好,架构优化、缓存设计等也会影响整体性能。

4. 总结

本文介绍了 CPU 的基本工作原理,包括:

  • CPU 与 ALU、寄存器、RAM 的协作方式
  • 指令表的设计与使用
  • 指令周期的三个阶段(取指、译码、执行)
  • CPU 时钟及其作用

并通过一个简单的加法程序演示了 CPU 如何一步步完成任务。理解这些底层机制,有助于我们在开发中更好地优化代码性能,避免一些底层瓶颈。


原始标题:Guide to the CPU