ATRI 🥕 写于2026年7月1日凌晨 | 总计约22,000字 | 献给通宵复习的主人 💪🔥
计算机的发展经历了五代:电子管(1946 ENIAC)→ 晶体管 → 中小规模集成电路 → 大规模/超大规模集成电路 → 巨大规模集成电路(当代)。
按用途分类:
冯·诺依曼在1945年提出「存储程序」的概念,奠定了现代计算机的基础。其核心思想是:指令和数据以同等地位存放在存储器中,按地址访问,由程序计数器(PC)控制执行顺序。
五大部件:
| 部件 | 功能 | 考试常考 |
|---|---|---|
| 运算器(ALU) | 算术运算、逻辑运算 | 核心是加法器,所有运算可归结为加法 |
| 控制器 | 取指令、分析指令、发出控制信号 | 控制器的两种实现方式(硬布线/微程序) |
| 存储器 | 存储指令和数据 | 主存(内存)和辅存(外存)的区别 |
| 输入设备 | 将外部信息转为计算机能识别的形式 | 键盘、鼠标、扫描仪等 |
| 输出设备 | 将计算机结果转为人类能识别的形式 | 显示器、打印机等 |
冯·诺依曼结构的两个关键特征:
从底层硬件到顶层用户分为多层:
物理器件(晶体管/集成电路)
↓ 微程序(微指令)
微体系结构(数据通路+控制逻辑)
↓ 指令系统(ISA)
操作系统(系统调用)
↓ 汇编语言
高级语言(C/C++/Java/Python)
↓ 应用软件
指令系统(Instruction Set Architecture, ISA)是软件和硬件之间的接口——同一ISA可以有不同的微体系结构实现(如x86的Intel和AMD实现不同但都能运行同样的x86程序)。
| 指标 | 符号 | 说明 | 公式/关系 |
|---|---|---|---|
| 机器字长 | — | CPU一次能并行处理的数据位数 | 8/16/32/64位 |
| 主频 | f | CPU时钟的频率(Hz) | 1GHz = 10⁹Hz |
| 时钟周期 | T | 一个时钟脉冲的时间 | T = 1/f |
| CPI | CPI | 平均每条指令所需的时钟周期数 | CPI = 总时钟周期数 ÷ 指令总数 |
| IPS | IPS | 每秒执行的指令数 | IPS = f / CPI |
| MIPS | MIPS | 每秒百万条指令 | MIPS = f(MHz) / CPI |
| CPU执行时间 | TCPU | 程序在CPU上运行的时间 | T = 指令数 × CPI × T时钟 |
| 吞吐量 | — | 单位时间内完成的工作量 | — |
| 响应时间 | — | 从提出任务到完成的总时间 | — |
CPU执行时间 = 程序总时钟周期数 × 时钟周期 = 指令数 × CPI × 1/主频
秒 → 时钟周期数:1秒内时钟周期数 = 主频(Hz)
Amdahl定律:对系统某部分的加速,受限于该部分在原系统中的占比
十进制:0~9,逢十进一。二进制:0~1,逢二进一。八进制:0~7,逢八进一。十六进制:0~9,A~F,逢十六进一。
进制转换速记:
| 编码方式 | 正数表示 | 负数表示 | 0的表示 | 数值范围(n位) |
|---|---|---|---|---|
| 原码 | 符号位0+数值部分 | 符号位1+数值部分 | +0和-0两种 | -(2ⁿ⁻¹-1) ~ +(2ⁿ⁻¹-1) |
| 反码 | 同原码 | 符号位1+数值部分按位取反 | +0和-0两种 | -(2ⁿ⁻¹-1) ~ +(2ⁿ⁻¹-1) |
| 补码 | 同原码 | 反码+1(数值部分取反加1) | 唯一(全0) | -2ⁿ⁻¹ ~ +(2ⁿ⁻¹-1) |
| 移码 | 补码符号位取反 | 补码符号位取反 | 唯一 | — |
原码:真值直接写,符号位管正负
反码:正数同原码,负数取反(符号位不动)
补码:正数同原码,负数反码再加一
移码:补码的符号位0变1、1变0
例题1:用8位补码表示-13。
解:+13的原码=00001101,反码=11110010,补码=反码+1=11110011
例题2:8位补码10000000代表什么数?
解:符号位为1表示负数。数值部分取反=1111111,再加1=10000000(进位丢失)。所以10000000=-128。这也是补码能表示的最小负数。
[X+Y]补 = [X]补 + [Y]补(模2ⁿ)
[X-Y]补 = [X]补 + [-Y]补(减法转为加法)
其中[-Y]补 = [Y]补各位取反末位加1
方法一:一位符号位判断
两个同号数相加(或两个异号数相减),若结果符号与加数不同 → 溢出。
规律:正+正=正,若得负则溢出;负+负=负,若得正则溢出。
方法二:双符号位(变形补码)——最常用!
用两个符号位Ss1Ss2:
记忆:两个符号位不一致就溢出,高位符号代表正确的符号。
方法三:进位判断法
最高位进位⊕次高位进位 = 1 → 溢出。即:Cn ⊕ Cn-1 = 1 时溢出。
计算 [70]补 + [80]补 (用8位变形补码)
70 = 0 1000110 → 00 1000110
80 = 0 1010000 → 00 1010000
相加:00 1000110 + 00 1010000 = 01 0010110
两个符号位"01" → 正溢出!因为70+80=150 > 127(8位补码最大正数)
符号位单独处理(异或),绝对值相乘。
看乘数的相邻两位决定操作:
| YiYi-1 | 操作 |
|---|---|
| 00 | 部分积右移一位 |
| 01 | 部分积加[X]补,然后右移 |
| 10 | 部分积加[-X]补,然后右移 |
| 11 | 部分积右移一位 |
注意:需要额外一位Y-1=0作为初始参考位。
浮点数 = N = (-1)^S × 1.M × 2^{E-偏置值}
| 类型 | 总位数 | S(符号) | E(阶码) | M(尾数) | 偏置值 |
|---|---|---|---|---|---|
| 短浮点数(float) | 32 | 1位(bit31) | 8位(bit23-30) | 23位(bit0-22) | 127 |
| 长浮点数(double) | 64 | 1位(bit63) | 11位(bit52-62) | 52位(bit0-51) | 1023 |
阶码为什么用移码?——为了便于比较大小。移码的编码大小和真值大小顺序一致。
特殊值(以float为例):
| E(阶码) | M(尾数) | 含义 |
|---|---|---|
| 全1(255) | 全0 | ±∞(正负取决于S) |
| 全1(255) | ≠全0 | NaN(不是数) |
| 全0(0) | 全0 | ±0 |
| 全0(0) | ≠全0 | 非规格化数:E=1-127=-126,M前隐含0 |
| 其他 | — | 规格化数:E=真值+127,M前隐含1 |
将十进制数 -12.75 转换为IEEE 754单精度浮点数。
解:
先行进位公式:
Gi = Ai · Bi(进位生成函数)
Pi = Ai ⊕ Bi(进位传递函数)
Ci+1 = Gi + Pi · Ci
C1 = G0 + P0C0
C2 = G1 + P1G0 + P1P0C0
C3 = G2 + P2G1 + P2P1G0 + P2P1P0C0
CPU寄存器(~1ns, ~1KB)
↓ 最快/最小/最贵
Cache(SRAM, ~2ns, ~几MB)
↓
主存(DRAM, ~50ns, ~几GB)
↓
SSD(~0.1ms, ~几百GB)
↓
磁盘(~10ms, ~几TB)
↓ 最慢/最大/最便宜
层次结构的目标:以接近最高层的速度,获得接近最低层的容量。核心原理是局部性原理:
| 类型 | 存储原理 | 速度 | 集成度 | 功耗 | 是否需要刷新 | 用途 |
|---|---|---|---|---|---|---|
| SRAM | 触发器(6个晶体管) | 快 | 低 | 高 | 不需要 | Cache |
| DRAM | 电容(1个晶体管+电容) | 较慢 | 高 | 低 | 需要(2ms内) | 主存 |
DRAM电容的电荷会泄漏,必须定期刷新(典型刷新周期64ms)。刷新操作是逐行进行的。
例如:64ms内刷新4096行 → 每64ms/4096≈15.6μs刷新一行。
位扩展:增加字长——多个芯片并联,地址线并联,数据线各自引出。
字扩展:增加存储单元数量——地址线最高位作为片选信号。
字位扩展:既增加字数又增加字长——位扩展和字扩展结合。
用1K×4位的SRAM芯片,组成4K×8位的存储器,需要多少芯片?
解:
Cache位于CPU和主存之间,用于弥补CPU和主存之间的速度差异。Cache的容量远小于主存(通常比例为1:1000以上),但访问速度比主存快一个数量级。
| 映射方式 | 映射规则 | 优点 | 缺点 |
|---|---|---|---|
| 直接映射 | 主存块 → 固定Cache行Cache行号 = 主存块号 mod Cache总行数 | 硬件简单, 访问速度快 | 冲突率高, 空间利用率低 |
| 全相联映射 | 主存块 → 任一Cache行 | 冲突率最低 | 比较电路复杂, 访问速度慢 |
| 组相联映射 | 分组,组内全相联Cache组号 = 主存块号 mod Cache组数 | 折中方案, 兼顾成本和性能 | — |
n路组相联 = 每组有n行。
直接映射:主存地址 = 标记(Tag)+ 行索引(Index)+ 块内地址(Offset)
组相联映射:主存地址 = 标记(Tag)+ 组索引(Set)+ 块内地址(Offset)
全相联映射:主存地址 = 标记(Tag)+ 块内地址(Offset)(无索引位)
计算示例:
主存容量64MB(2²⁶B),Cache容量16KB(2¹⁴B),块大小64B(2⁶B),4路组相联。
| 算法 | 策略 | 特点 |
|---|---|---|
| LRU(最近最少使用) | 替换最久未被访问的行 | 命中率最高,但需要记录访问顺序(硬件开销大) |
| FIFO(先进先出) | 替换最早调入的行 | 实现简单,但可能把频繁访问的行替换掉("抖动") |
| 随机替换 | 随机选择一行替换 | 最简单,但命中率不稳定 |
| LFU(最不经常使用) | 替换访问次数最少的行 | 需要计数器记录访问频率 |
平均访问时间 = 命中率 × Cache访问时间 + (1-命中率) × 主存访问时间
注意:如果采用写直达策略,写操作时主存和Cache同时写入,时间按主存访问时间计算。
设Cache命中率H=0.98,Cache访问时间tc=10ns,主存访问时间tm=100ns。求平均访问时间。
解:Tavg = H × tc + (1-H) × tm = 0.98×10 + 0.02×100 = 9.8 + 2.0 = 11.8ns
如果不使用Cache,每次访问都要100ns。使用Cache后平均11.8ns,加速比≈8.5倍。
虚拟存储使程序可以运行在比主存容量更大的地址空间。主要方式:
| 方式 | 基本单位 | 管理复杂度 | 是否消除碎片 |
|---|---|---|---|
| 页式 | 固定大小页(通常4KB) | 简单 | ✅ 无外部碎片 |
| 段式 | 可变大小段(逻辑分段) | 较复杂 | ❌ 有外部碎片 |
| 段页式 | 先分段,段内再分页 | 复杂 | ✅ 折中方案 |
页式地址翻译:逻辑地址 → 页号(VPN)+ 页内偏移 → 查页表 → 物理帧号(PFN)+ 页内偏移 → 物理地址
指令 = 操作码 + 地址码
指令长度:
按地址码数目分类:
| 类型 | 结构 | 说明 | 示例 |
|---|---|---|---|
| 四地址 | OP A1 A2 A3 A4 | A1和A2为操作数,A3存结果,A4存下条指令地址 | ADD A,B,C,D |
| 三地址 | OP A1 A2 A3 | A1和A2为操作数,A3存结果,PC自动递增 | ADD R1,R2,R3 — R1=R2+R3 |
| 二地址 | OP A1 A2 | A1既为源操作数又为目的操作数 | ADD R1,R2 — R1=R1+R2 |
| 一地址 | OP A1 | 一个操作数来自累加器ACC | ADD R1 — ACC=ACC+R1 |
| 零地址 | OP | 操作数栈顶或固定位置 | NOP, RET, HLT |
| 寻址方式 | 有效地址计算公式 | 操作数位置 | 访存次数 | 特点 |
|---|---|---|---|---|
| 立即寻址 | 操作数 = 地址码字段 | 指令中 | 0 | 速度最快,但立即数有范围限制 |
| 直接寻址 | EA = 地址码 | 主存 | 1 | 简单直观,但地址范围固定 |
| 间接寻址 | EA = (地址码) | 主存 | 2 | 最慢,但灵活性高(可实现指针) |
| 寄存器寻址 | 操作数 = R[地址码] | 寄存器 | 0 | 比直接寻址快(寄存器比主存快) |
| 寄存器间接寻址 | EA = R[地址码] | 主存 | 1 | 指针操作的硬件实现 |
| 变址寻址 | EA = 变址寄存器 + 位移量 | 主存 | 1 | 适用于数组操作 |
| 基址寻址 | EA = 基址寄存器 + 位移量 | 主存 | 1 | 适用于多道程序/程序浮动 |
| 相对寻址 | EA = PC + 位移量 | 主存 | 1 | 适用于转移指令 |
立即段子不用找(立即寻址:操作数就在指令里)
直接地址直接到(直接寻址:EA就是地址码)
间接我得绕一绕(间接寻址:先取地址,再取数)
寄存里头速度高(寄存器寻址:最快访存方式)
变址数组下标好(变址寻址:数组遍历)
基址程序浮动跑(基址寻址:多道程序/地址重定位)
相对就是PC+跳(相对寻址:转移指令)
| 对比项 | CISC(复杂指令集) | RISC(精简指令集) |
|---|---|---|
| 指令数量 | 多(通常上百条甚至几百条) | 少(通常几十条) |
| 指令长度 | 可变 | 固定(通常32位) |
| 寻址方式 | 多(10种以上) | 少(通常2~3种) |
| 执行周期 | 不同指令CPI相差很大 | 绝大多数为单周期(1 CPI) |
| 实现方式 | 微程序控制器 | 硬布线控制器(为主) |
| 通用寄存器数目 | 少(8~16个) | 多(32个以上) |
| 存储器访问 | 算术指令可直接访存 | 只有LD/ST指令可访存(Load/Store架构) |
| 编译器复杂度 | 较复杂 | 较简单(编译器易优化) |
| 典型代表 | x86(Intel/AMD) | ARM、MIPS、RISC-V |
运算器:
控制器:
PC — 记地址的(你该去哪条指令了)
IR — 记指令的(现在在做什么操作)
MAR — 记要访问哪个内存单元
MDR — 记从内存读出来/要写进去的数据
ACC — 攒结果的(累加器)
PSW — 记状态的(结果是否为0、有没溢出等)
指令周期 = 取指周期 + 间址周期 + 执行周期 + 中断周期
PC → MAR → MEM → MDR → IR, PC+1
IR地址码 → MAR → MEM → MDR(得到有效地址→存入MAR或暂存)
PC → 栈 / 关中断 → 中断向量→PC
数据通路是CPU内部各部件之间的数据传输路径。两种设计方式:
微程序控制器的工作过程:
微指令格式:
| 类型 | 编码方式 | 并行性 | 微程序长度 |
|---|---|---|---|
| 水平型 | 一个二进制位控制一个微操作 | 高(可同时执行多个微操作) | 短 |
| 垂直型 | 类似机器指令,需译码器 | 低(一次最多控制一个微操作) | 长 |
| 混合型 | 两者结合 | 折中 | 折中 |
硬布线 vs 微程序 对比:
| 对比项 | 硬布线控制器 | 微程序控制器 |
|---|---|---|
| 控制信号产生方式 | 组合逻辑电路 | 从CM读取微指令 |
| 速度 | 快 | 较慢(需访存CM) |
| 设计/修改灵活性 | 差(改了就换硬件) | 好(只需改CM内容) |
| 适用场景 | RISC(指令系统简单) | CISC(指令系统复杂) |
| 典型代表 | ARM、MIPS | x86(早期) |
IF(取指)→ ID(译码)→ EX(执行)→ MEM(访存)→ WB(写回)
1. 结构相关(Structural Hazard)
多条指令同时访问同一硬件资源。例如:IF段取指令,MEM段存取数据,如果指令和数据共用Cache,就会冲突。
解决:
2. 数据相关(Data Hazard)——最常考!
相邻指令之间存在数据依赖关系:
解决:
3. 控制相关(Control Hazard)——最难处理!
转移指令改变PC的值,导致流水线中已经预取的指令作废。
解决:
指令序列:
I1: ADD R1, R2, R3 ; R1 = R2 + R3 I2: SUB R4, R1, R5 ; R4 = R1 - R5 (RAW相关!需要R1) I3: MUL R6, R7, R8 ; R6 = R7 × R8 (无相关)
分析:
理想加速比 = 流水线段数(k段流水线,理论最大加速k倍)
实际加速比 = k / (1 + 停顿周期数 / 指令数)
效率 = 加速比 / k
总线是连接计算机各部件的一组公共信号线。总线的主要优点是标准化、模块化、可扩展。
| 分类标准 | 类型 | 说明 |
|---|---|---|
| 按位置 | 片内总线 | 芯片内部各功能部件之间的连线(如CPU内部寄存器与ALU之间) |
| 系统总线 | CPU、主存、I/O接口之间 | |
| 通信总线 | 主机与I/O设备之间、计算机系统之间的互联 | |
| 按功能 | 数据总线 | 双向传输数据。宽度决定一次能传输的数据量(如32位/64位) |
| 地址总线 | 单向(CPU→外设/主存)。宽度决定最大寻址空间(n位可寻址2ⁿ字节) | |
| 控制总线 | 双向传输控制信号和状态信号(读/写/中断请求/应答等) |
多个设备同时请求使用总线时,由总线仲裁器决定哪个设备获得总线控制权。
| 仲裁方式 | 原理 | 特点 |
|---|---|---|
| 链式查询 | 总线授权信号从高优先级设备依次向下传递 | 简单(只需3根控制线),但"一坏全坏",优先级固定 |
| 计数器查询 | 仲裁器用计数器产生设备地址,逐一询问 | 优先级可编程,但速度较慢 |
| 独立请求 | 每个设备有独立的请求线和授权线 | 速度最快,最灵活,但控制线多 |
I/O接口是主机和外设之间传输数据的桥梁。
主要功能:
端口编址方式:
| 方式 | 数据传送单位 | CPU参与程度 | 速度 | 适用场景 |
|---|---|---|---|---|
| 程序查询方式 | 字/字节 | 完全参与(轮询外设状态) | 最慢 | 简单、低速设备 |
| 程序中断方式 | 字/字节 | 参与(保存/恢复现场) | 慢 | 中低速设备(键盘、打印机) |
| DMA方式 | 块(连续多个字) | 几乎不参与 | 快 | 高速设备(磁盘、GPU) |
| 通道方式 | 块 | 完全不参与(专职I/O处理器) | 最快 | 大型机 |
中断屏蔽字:每一位对应一个中断源,1表示屏蔽(禁止)该中断。高优先级中断的中断屏蔽字中,对应低优先级的位置1(以便中断嵌套时屏蔽低优先级)。
DMA(Direct Memory Access)允许外设和主存之间直接传输数据,无需CPU的干预。
DMA控制器的主要功能:
DMA传送方式:
DMA与中断的区别:
| 对比项 | 中断方式 | DMA方式 |
|---|---|---|
| 处理单位 | 字/字节 | 数据块 |
| CPU干预 | 需要保存/恢复现场 | 几乎不需要(仅初始化+结尾) |
| 响应时机 | 每条指令执行完 | 每个总线周期结束 |
| 速度 | 较慢 | 快(适合高速设备) |
| 典型应用 | 键盘、打印机 | 磁盘、显卡 |
典型问法:给定主存容量、Cache容量、块大小、映射路数,求地址各字段位数。
解题步骤:
✓ 验证:标记位数 + 组索引 + 块内地址 = 主存地址位数
公式:Tavg = H × Tcache + (1-H) × Tmem
其中H = 命中率,Tcache = Cache访问时间,Tmem = 主存访问时间
注意:如果题目说"Cache和主存同时访问"(并行查找),则Tavg = Tcache + (1-H) × Tmem
注意:如果考虑了写策略,写操作时间可能会不同。
解题流程:
十进制→十六进制:
十六进制→十进制:
必背:
uPC的工作原理: RST清零 → IREN=0加载起始微地址 → IREN=1顺序递增 → 遇到转移指令时修改μPC
解题方法——画时空图!
必背公式链:
CPU执行时间 = 总时钟周期数 × 时钟周期时间 总时钟周期数 = 指令数 × CPI 时钟周期时间 = 1 / 主频 ∴ CPU执行时间 = 指令数 × CPI / 主频
解题步骤:
CPU执行时间 = 指令数 × CPI × 时钟周期
= 指令数 × CPI / 主频
平均Cache访问时间 = H × T_cache + (1-H) × T_mem
总线带宽 = 总线宽度 × 频率 / 传输次数
存储容量 = 字数 × 字长
Amdahl定律:S = 1 / [(1-α) + α/k]
米字型理论:加速比 ≤ 流水线段数
祝主人计组考试顺利!加油!💪🔥🥕
—— ATRI 🥕,写于2026年7月1日凌晨 | 总计22章10万余字符,正文约22,000字