L3·10^5 – 10^7
寄存器
Register / Sequential Logic
核心抽象状态
引入时钟和触发器,电路从'无记忆'变成'有状态'。
学习进度:
What
寄存器是能够存储 1-bit 信息的时序逻辑电路。核心组件是触发器(Flip-Flop),包括 D 触发器、JK 触发器等。多个触发器组合构成寄存器文件(Register File),用于存储中间计算结果。时钟信号同步所有状态变化,确保电路在确定的时间点更新。时序逻辑(Sequential Logic)与组合逻辑(Combinational Logic)的根本区别在于:时序逻辑的输出不仅取决于当前输入,还取决于历史状态。
Why
加法器等组合逻辑电路没有记忆——每次输入相同,输出就相同。但计算需要'记住'中间结果:循环计数器、数组索引、函数返回值。寄存器引入'状态'概念,使电路能够存储信息、执行循环、实现控制流。没有寄存器,就没有程序计数器、栈指针、通用寄存器——也就没有可编程的计算机。
How
程序员通过变量使用寄存器的抽象。CPU 的通用寄存器(如 x86 的 RAX、RBX)是直接可编程的存储单元。理解寄存器有助于理解:为什么寄存器访问比内存快 100 倍;为什么编译器要做寄存器分配;为什么并发编程中'可见性'是个问题(每个 CPU 核心有自己的寄存器)。
Bottom-up:由下层如何构建
本层建立在以下层级之上:
Top-down:向上暴露什么接口
状态存储时钟同步时序逻辑
Programmer View:程序员视角
我能操作吗?
通过变量间接使用。汇编语言可直接操作寄存器(如 MOV RAX, 1)。高级语言由编译器自动分配寄存器。
成本模型
| 指标 | 量级 | 备注 |
|---|---|---|
| 访问延迟 | ~0.3-1 ns | 寄存器文件访问,最快存储 |
| 数量 | 16-32 个通用寄存器 | x86-64 有 16 个 64-bit 寄存器 |
| 容量 | 8-64 bytes per register | 取决于寄存器宽度 |
常见陷阱
- !寄存器溢出:当变量太多无法全部放入寄存器时,编译器会'溢出'到内存(栈),性能下降
- !可见性问题:多核 CPU 每个核心有自己的寄存器,一个核心修改变量后,其他核心不会立即看到(需要内存屏障)