ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

JAVA进阶—计算机原理篇

JAVA进阶—计算机原理篇

CPU

CPU核心结构

ALU

Arithmetic Logic Unit(算术逻辑单元)‌的缩写,也叫‌运算器‌,专门负责执行算术运算和逻辑运算。

Registers

寄存器,临时存储单元‌,用来暂存指令、数据和地址。

寄存器根据用途可以分为:

通用寄存器:如 AX、BX、R0、R1 等,主要放操作数、中间结果

专用寄存器:如 PC、IR、SP、PSW 等。

其中比较重要的有:

程序计数器 PC:存放下一条要执行指令的地址。

指令寄存器 IR:存放当前正在执行的指令。

栈指针 SP、链接寄存器 LR:帮助管理函数调用、返回、参数传递和现场保存。

CU

Control Unit(控制单元)的缩写,也叫控制器,它是逻辑功能上独立,但不是像内存条那样可单独插拔的独立芯片。现代 CPU 中,控制单元往往和流水线控制、微码 ROM、分支预测等电路融合在一起,物理上不一定是一个清晰的“单独盒子”。

CPU执行指令细节

CPU 执行一条指令,通常经过以下几个阶段:

1. 取指

  • PC(程序计数器)存放“下一条指令的地址”。

  • CPU 把 PC 的内容送到MAR(地址寄存器),再通过地址总线去内存取指令。

  • 内存把指令送回MDR(数据寄存器),再送入IR(指令寄存器)。

  • PC 自动增加,指向下一条指令;如果遇到跳转,PC 被修改为目标地址。

2. 译码

  • 控制单元读取 IR 中的指令,分析要做什么,比如加法、加载、存储、跳转。

  • 控制单元产生控制信号,指挥 ALU、寄存器文件和内存接口工作。

3. 执行

  • 如果是算术/逻辑指令,比如ADD R1, R2, R3:

    • 从寄存器文件读出 R2、R3 的值;

    • 送入 ALU 运算;

    • 结果写回 R1;

    • 同时更新标志寄存器,如零标志、进位标志、溢出标志。

  • 如果是访存指令,就进入“访存”阶段。

4. 访存

  • LOAD:从内存读数据到寄存器。

  • STORE:把寄存器里的数据写入内存。

5. 写回

  • 把运算结果或读出的数据写回寄存器。

  • 如果是存储指令,则写回内存。

所以,寄存器是 CPU 执行指令时的“临时工作台”:
PC 管流程,IR 管当前指令,通用寄存器管操作数和结果,标志寄存器管状态,MAR/MDR 管与内存交换地址和数据。


CPU操作内存细节

CPU 不能直接“伸手”改内存,它通过三组总线与内存交互:

  1. 地址总线:CPU 告诉内存要访问哪个地址。

  2. 数据总线:在 CPU 和内存之间传数据。

  3. 控制总线:CPU 发出读/写信号,告诉内存是读还是写。

读内存过程

例如LOAD R1, [1000]:

  1. CPU 把地址1000放入 MAR;

  2. MAR 把地址送到地址总线;

  3. 控制单元发出“读”信号;

  4. 内存找到地址1000的内容,放到数据总线;

  5. 数据进入 MDR;

  6. 再写入寄存器 R1。

写内存过程

例如STORE [1000], R1:

  1. CPU 把地址1000放入 MAR;

  2. 把 R1 的值放入 MDR;

  3. 控制单元发出“写”信号;

  4. 内存把数据总线上来的值写入地址1000。

因此,CPU 操作内存的基本模式就是:
地址送 MAR → 控制总线发读写信号 → 数据经 MDR 进出内存。

现代 CPU 为了更快,还加入了:

  • 缓存 L1/L2/L3:CPU 先查缓存,未命中才访问内存。

  • MMU/TLB:把虚拟地址转换成物理地址。

  • 流水线:取指、译码、执行、访存、写回重叠进行。

  • 乱序执行、寄存器重命名:提高并行度。

  • 多核缓存一致性:保证多个核心看到一致的内存数据。

但无论多复杂,基本逻辑不变:
CPU 用寄存器做最快的工作台,用总线访问内存,把数据搬到寄存器里运算,再写回内存。

内存

计算机内存的结构

“内存”通常有两种含义:

  1. 广义内存层次:寄存器 → L1/L2/L3 缓存 → 主存 → SSD/硬盘。

  2. 狭义内存:主存,也就是内存条,通常是 DRAM。

这里重点说主存。

1. 逻辑结构:线性地址空间

从程序员和 CPU 的角度看,内存像一个巨大的线性数组:

地址 0x0000: 1 字节 地址 0x0001: 1 字节 地址 0x0002: 1 字节 ... 地址 0xFFFF: 1 字节

每个存储单元有一个唯一地址。
现代计算机通常按字节编址:一个地址对应 1 个字节(8 位)。

CPU 访问内存时:

  • 地址总线送出地址;

  • 控制总线发出读/写信号;

  • 数据总线传输数据。

2. 物理结构:DRAM 存储阵列

内存条由多块 DRAM 芯片组成。每块 DRAM 内部有:

  • 存储阵列:行和列交叉排列的存储单元;

  • 行解码器、列解码器:根据地址选中某个单元;

  • 灵敏放大器:读出微弱电荷信号并放大;

  • 行缓冲器:暂存一整行数据;

  • 刷新电路:定期刷新电容电荷。

地址通常分两次送入:

  • 先送行地址,触发 RAS;

  • 再送列地址,触发 CAS。

然后选中某个存储单元进行读写。

3. SRAM 与 DRAM

类型存储原理特点用途
SRAM双稳态触发器快、贵、不需刷新CPU 缓存
DRAM电容电荷慢一些、便宜、需刷新主存

主存用 DRAM,因为容量大、成本低;缓存用 SRAM,因为速度极快。

内存如何存储数据

1. 一切以二进制位存储

内存中最基本的单位是bit(位),只能表示 0 或 1。

  • DRAM:用电容是否带电表示 0/1;

  • SRAM:用触发器电路的两个稳定状态表示 0/1。

多个 bit 组成一个字节:

1 Byte = 8 bit

例如字符'A'的 ASCII 码是 65,二进制是:

0100 0001

它在内存中占 1 个字节,地址假设为0x1000,那么该地址的内容就是0100 0001。

2. 多字节数据如何存放

一个整数、浮点数通常占多个字节。比如 32 位整数占 4 字节。
这 4 个字节在内存中有顺序问题,这就是大端序和小端序:

  • 大端:高位字节放在低地址;

  • 小端:低位字节放在低地址。

x86 和 ARM 通常用小端序。

例如0x12345678存放在地址0x1000:

  • 小端:78 56 34 12

  • 大端:12 34 56 78

3. DRAM 需要刷新

DRAM 用电容存电荷,电荷会漏掉。
所以内存控制器必须定期把数据读出再写回,这叫刷新。
这也是 DRAM 叫“动态”的原因。

4. 读写过程

读:

  1. CPU 把地址送上地址总线;

  2. 内存选中对应行和列;

  3. 灵敏放大器读出电荷;

  4. 数据经数据总线送回 CPU。

写:

  1. CPU 送地址;

  2. CPU 送数据;

  3. 控制总线发出写信号;

  4. 内存把电荷写入对应电容。

三、数据大小如何计算

1. 基本单位

单位含义
bit位,0 或 1
Byte字节,1 Byte = 8 bit
Word字,通常等于 CPU 字长,如 32 位、64 位
KiB1 KiB = 1024 Byte
MiB1 MiB = 1024 KiB
GiB1 GiB = 1024 MiB
TiB1 TiB = 1024 GiB

注意:

  • 内存和操作系统常用二进制:1 KB 有时指 1024 B,严格叫 KiB。

  • 硬盘厂商标称常用十进制:1 GB = 1000 MB = 10^9 B。

  • 所以 8 GB 内存条在系统中显示约 7.45 GiB,这是换算差异。

2. 地址空间计算

如果地址总线有n 位,能表示的地址数量是:

2^n

如果按字节编址,则最大寻址空间为:

2^n 字节

例子:

  • 32 位地址总线:
    2^32 B = 4,294,967,296 B = 4 GiB

  • 64 位地址总线:
    2^64 B = 16 EiB,实际 CPU 不会全用。

3. 内存容量计算

内存容量 = 存储单元数 × 每个单元位数。

若按字节编址:

容量 = 2^地址线数 × 1 字节

若按字编址,每个地址对应一个字:

容量 = 2^地址线数 × 字长

例如:

  • 20 根地址线,按字节编址:
    2^20 B = 1 MiB

  • 20 根地址线,按 32 位字编址:
    2^20 × 4 B = 4 MiB

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进