← 返回博客列表

一、引言:为什么要学习计算机体系结构

计算机体系结构(Computer Architecture)是计算机科学的核心基础学科,它研究计算机系统的设计理念、组织结构和工作原理。从冯·诺依曼提出"存储程序"概念至今,计算机体系结构经历了从单处理器到多核、从集中式到分布式的深刻演变。

对于软考考生而言,计算机硬件与体系结构是系统架构设计师、网络工程师、软件设计师等考试的必考内容,在上午选择题中占比约 8-15 分,同时也是下午案例分析题的重要背景知识。本章内容涉及大量计算题(流水线加速比、Cache 命中率、虚拟地址转换、RAID 容量),是拉开分数差距的关键。

软考考察范围(系统架构设计师)
1. 计算机组成:冯·诺依曼结构、CPU 结构、指令周期
2. 指令系统:CISC/RISC、寻址方式、指令流水线
3. 存储系统:存储层次、Cache 映射、虚拟内存
4. 输入输出:总线结构、I/O 控制方式、DMA
5. 多处理机:SMP、NUMA、Cache 一致性协议
6. 外存储:磁盘结构、RAID 级别与计算
学习建议
· 计算题务必手算:流水线、Cache、地址转换、RAID 是高频计算题,光看公式没用,必须动手算 5 道以上
· 对比表格反复看:CISC vs RISC、三种 Cache 映射、五种 I/O 方式、RAID 各级别,对比记忆效率最高
· 理解优于背诵:例如"为什么要有 Cache?"——从"局部性原理"出发理解整个存储层次

二、计算机系统组成总览

一个完整的计算机系统由硬件系统和软件系统两大部分组成。硬件是物质基础,软件是灵魂,二者缺一不可。本章主要聚焦硬件系统的组织结构。

2.1 冯·诺依曼架构 vs 哈佛架构

现代计算机的两大基础架构流派分别是冯·诺依曼(Von Neumann)架构和哈佛(Harvard)架构,二者最核心的区别在于"数据和指令是否共享同一存储空间"。

冯·诺依曼架构 (Von Neumann) 哈佛架构 (Harvard) CPU 控制单元+ALU 单一存储器 指令 & 数据 共享同一空间 共享总线 瓶颈:指令/数据分时复用 CPU CU+ALU 指令 存储器 (独立) 数据 存储器 (独立) 指令总线 数据总线 冯·诺依曼特点 · 指令和数据共享内存和总线 · 结构简单,成本低,通用性强 · 存在"冯·诺依曼瓶颈" · 代表:通用CPU、x86、ARM 哈佛架构特点 · 指令和数据存储器独立 · 两套独立总线,可并行取指+取数 · 性能高,适合实时信号处理 · 代表:DSP、单片机、GPU
图 1:冯·诺依曼架构 vs 哈佛架构 —— 核心区别在于指令与数据存储是否独立
软考易错点
· 不要混淆:现代高性能 CPU(如 x86/ARM)外部采用冯·诺依曼结构(统一主存),但内部 Cache 采用哈佛结构(L1 指令 Cache 与 L1 数据 Cache 分离),这种叫"改进型哈佛架构"
· DSP、单片机(如 8051、AVR)是典型的纯哈佛架构

2.2 计算机硬件五大基本部件

冯·诺依曼架构规定了计算机的五大基本组成部件:运算器、控制器、存储器、输入设备、输出设备。其中运算器+控制器 = CPU(中央处理器)。

五大部件速记
· 运算器(ALU):执行算术运算(加减乘除)和逻辑运算(与或非异或)
· 控制器(CU):从内存取指令、译码、发出控制信号,协调各部件工作
· 存储器:内存+外存,存储程序和数据
· 输入设备:键盘、鼠标、扫描仪(将信息→计算机可识别格式)
· 输出设备:显示器、打印机(将结果→人可识别格式)

三、CPU 与指令系统

3.1 CPU 内部结构

CPU(Central Processing Unit,中央处理器)是计算机的"大脑",由运算器、控制器、寄存器组和内部总线构成。现代 CPU 还集成了 Cache(高速缓存)、MMU(内存管理单元)等部件。

CPU 内部结构总览 运算器 (ALU 核心) 算术逻辑单元 ALU 累加器 ACC 乘商寄存器 MQ 数据缓冲 DR 状态字 PSW 控制器 (CU 核心) 控制单元 CU / 微程序 程序计数器 PC 指令寄存器 IR 地址寄存器 AR 指令译码 ID 通用寄存器组 R0~R15 (SP, BP, SI, DI...) L1 Cache (哈佛) I-Cache 指令 D-Cache 数据 MMU 内存管理单元 内部互联与其他 内部总线 / 交叉开关 FPU 浮点运算单元 前端总线 / 外部接口 → 连接主存、南桥、外设
图 2:CPU 内部结构图 —— 运算器、控制器、寄存器、Cache 协同工作
核心寄存器功能(必须牢记)
· PC(程序计数器):存放下一条要取的指令地址,取指后自动递增,软考计算题高频
· IR(指令寄存器):存放当前正在执行的指令,从内存取出后暂存
· AR(地址寄存器):暂存要访问的内存单元地址
· DR(数据寄存器):暂存从内存读出/要写入的数据
· PSW(程序状态字):存放标志位(溢出OF、零ZF、符号SF、进位CF等)
· ACC(累加器):ALU 运算时存放操作数和中间结果

3.2 指令执行周期

一条指令从取出到执行完毕,需要经过若干阶段,这就是指令周期。经典的 5 阶段指令周期是理解流水线技术的基础。

经典 5 阶段指令周期 (MIPS 五级流水线) IF 取指 Instruction Fetch PC→内存→IR ID 译码 Instruction Decode IR→译码器→控制信号 EX 执行 Execute ALU 运算 / 有效地址 MEM 访存 Memory Access Load/Store 内存读写 WB 写回 Write Back 结果→寄存器堆 以 ADD R1, R2, R3 (R1 = R2 + R3) 为例的具体动作 ① IF:PC 值→地址总线→内存,取出指令放入 IR,PC 自动 +4(32位指令) ② ID:IR 的操作码部分送译码器,译码出是 ADD;读出 R2、R3 寄存器值送 ALU 输入端 ③ EX:ALU 执行加法,R2 + R3 → ALU 输出锁存器;计算条件标志位(OF/SF/ZF)→ PSW ④ MEM:ADD 是 R 型指令,不访问内存,此阶段空闲(跳过或执行 NOP) ⑤ WB:ALU 输出锁存器的值→寄存器堆的 R1,写回完成,本条指令结束
图 3:经典 5 阶段指令周期(MIPS 五级流水)—— IF→ID→EX→MEM→WB
软考关键概念:指令周期 · CPU周期 · 时钟周期
· 指令周期:取出并执行一条指令的时间,不同指令长度可能不同
· CPU周期(机器周期):通常 = 从内存读取一条指令的最短时间,1指令周期 = N 个CPU周期
· 时钟周期(T周期/节拍):CPU 主频的倒数,最小时间单位,1CPU周期 = M 个时钟周期
· 关系:T指令 = N × T机器 = N × M × T时钟

3.3 CISC vs RISC 指令集架构

CISC(Complex Instruction Set Computer,复杂指令集)和 RISC(Reduced Instruction Set Computer,精简指令集)是 CPU 指令系统设计的两大哲学流派,也是软考高频对比考点。

CISC 复杂指令集 RISC 精简指令集 x86 架构代表 指令数量:200+ 条,多且复杂 指令长度:不固定(1~15字节) 寻址方式:10+ 种,灵活但复杂 可访存指令:算术指令可直接访存 实现方式:微程序控制(UC)为主 通用寄存器少 · 适合编译优化弱的年代 代码密度高,指令本身功能强 ARM / MIPS / RISC-V 代表 指令数量:<100 条,少且精简 指令长度:固定(ARM 32位/Thumb 16位) 寻址方式:3~5 种,简单 Load/Store 结构:只有 L/S 可访存 实现方式:硬布线逻辑(组合逻辑) 通用寄存器多(R0-R31)· 编译器友好 适合流水线、超标量、乱序执行
图 4:CISC vs RISC 指令集架构对比
对比维度 CISC(复杂指令集) RISC(精简指令集)
代表架构 Intel x86、AMD x86-64、VAX ARM、MIPS、RISC-V、PowerPC、SPARC
指令数量 200~1500 条,多而复杂 <100 条,少而精简
指令长度 不固定,1~15 字节(x86) 固定长度,如 32 位 ARM / 16 位 Thumb
寻址方式 多(10+ 种),灵活复杂 少(3~5 种),简单规整
访存限制 算术指令可直接访问内存 Load/Store 架构,仅 L/S 指令可访存
通用寄存器 少(x86 8个/16个) 多(32个,MIPS/RISC-V)
控制实现 微程序控制为主(灵活慢) 硬布线逻辑为主(速度快)
流水线 实现复杂,早期不适合流水 天然适合流水线、超标量
代码密度 高,同样功能程序体积小 低,指令多但每条简单
功耗/散热 高(桌面/服务器 CPU) 低(移动设备首选,ARM)
软考秒杀技巧:CISC vs RISC 判断题
看到"复杂、多、灵活、微程序、访存直接、代码密度高" → 选 CISC
看到"精简、少、规整、硬布线、Load/Store、寄存器多、流水线" → 选 RISC

3.4 寻址方式

寻址方式是指如何确定操作数的有效地址(Effective Address, EA)的方式。这是指令系统设计的关键,也是软考选择题高频考点。

寻址方式 有效地址 EA 计算 特点与用途 例子(汇编助记)
立即寻址 地址码字段 A = 操作数本身 最快,无需访存取操作数;但操作数范围受限,用于定义常量 MOV AX, #1234H
直接寻址 EA = A(地址码字段直接给出地址) 简单,一次访存取操作数;寻址空间受 A 的位数限制 MOV AX, [1234H]
间接寻址 EA = (A),操作数地址存在 A 指定的单元中 寻址空间大;但需两次访存(先取 EA,再取数) MOV AX, [[1234H]]
寄存器寻址 操作数在指定寄存器 R 中 速度极快,无需访存;寄存器数量有限 MOV AX, BX
寄存器间接 EA = (R),地址在寄存器 R 中 只需一次访存,寻址空间大;常用指针操作 MOV AX, [BX]
相对寻址 EA = (PC) + A,PC 值 + 位移量 A 程序浮动,A 是相对偏移(短);广泛用于转移指令 JMP +8;BEQ label
基址寻址 EA = (BR) + A,基址寄存器 BR + 位移 A 解决程序重定位,BR 操作系统管理,A 用户提供;扩大寻址空间 LDR R0, [R4, #4]
变址寻址 EA = (IX) + A,变址寄存器 IX + 位移 A 用户修改 IX;适合数组遍历、循环,IX 自动增量 LDR R0, [R5], #4
块/复合寻址 EA = (BR)+(IX)+A,基址+变址+偏移 最灵活,用于二维数组访问;x86 LEA 指令 LEA EAX, [EBX+ECI*4+8]
基址寻址 vs 变址寻址的区别(软考高频!)
· 基址寻址:面向系统,BR 基址寄存器由操作系统/管理程序设置(用户不可变),解决程序重定位问题,A 是用户提供的段内偏移
· 变址寻址:面向用户,IX 变址寄存器由用户程序自己修改,适合数组访问循环计数,A 是数组首地址
· 考题套路:出现"数组遍历、字符串处理、循环" → 选变址;出现"程序浮动、重定位、多道程序" → 选基址

四、流水线技术

流水线(Pipelining)是现代 CPU 提升性能的核心技术之一,其基本思想是"工业生产流水线"——将一条指令的执行拆分为多个阶段,不同阶段同时处理不同指令,从而在不提高时钟频率的前提下大幅提升吞吐量。

4.1 流水线基本原理与 5 级流水线时序图

经典 5 级流水线:IF(取指)→ ID(译码)→ EX(执行)→ MEM(访存)→ WB(写回)。假设每级用时相等(1个时钟周期T),我们来看顺序执行与流水线执行的时序对比。

非流水线(顺序执行) 5 级流水线(重叠执行) 指令\周期 T1 T2 T3 T4 T5 T6 T7 T8 T9 I1 IF ID EX MEM WB I2 IF ID EX MEM WB 2 条指令共需 10 个周期,每 5T 出 1 条结果 I3 IF ID EX MEM WB T10 指令\周期 T1 T2 T3 T4 T5 T6 T7 T8 T9 I1 IF I2 ID IF I3 EX ID IF MEM EX ID WB MEM EX WB MEM T10 WB 3 条指令仅 7 个周期,之后每隔 1T 出 1 条结果,吞吐量提升 5 倍!
图 5:非流水线 vs 5 级流水线时序对比图 —— 重叠执行带来吞吐量飞跃
流水线三大核心性能指标
· 吞吐率(Throughput, TP):单位时间内完成的指令数,TP = n / T总
· 加速比(Speedup, S):不使用流水线时间 / 使用流水线时间,S = T非流水 / T流水
· 效率(Efficiency, E):流水线各阶段设备利用率,E = 所有阶段总用时 / (k阶段 × 总时间) = S/k
软考必背公式:n 条指令 k 级流水线总周期数
若流水线各级时间分别为 Δt₁, Δt₂, ..., Δt_k,取最大 Δt = max(Δti) 为流水线周期,则:
T总 = (Δt₁ + Δt₂ + ... + Δt_k) + (n-1) × Δt
特殊情况(各级时间相等,均为 Δt):T总 = k·Δt + (n-1)·Δt = (k + n - 1)·Δt
这是计算题的核心!必须像背九九乘法表一样熟练

4.2 流水线冲突(Hazard)

理想情况流水线每周期出一条结果,但实际中存在流水线冲突(冒险 Hazard),导致流水线停顿(Stall,插入气泡 Bubble),性能下降。

三类流水线冲突(Hazard)示意 ① 结构冲突 (Structural) 资源不够用引起的冲突 周期 T1 T2 T3 I1 IF ID MEM I2 IF MEM ! 原因: · 指令/数据共用一个存储器/总线 · IF 和 MEM 阶段竞争同一内存 · 只有一个 ALU 被同时占用 解决: 哈佛结构、资源重复、指令/数据Cache分离 ② 数据冲突 (Data) 指令间数据依赖引起 指令 T1 T2 T3 T4 ADD W SUB ←读 Bubble 原因: · RAW(写后读):SUB读ADD还没写回的值 · WAR / WAW(反依赖/输出依赖) · I1: ADD R1,R2,R3 → I2: SUB R4,R1,R5 解决: 数据旁路(Forwarding)、插入停顿、编译器调度 ③ 控制冲突 (Control) 分支/跳转指令引起 指令 T1 T2 T3 T4 BEQ I+1? 丢弃 气泡 原因: · 分支跳转指令要到 EX/MEM 阶段 才知道目标地址,取指级已预取错了 · 条件分支 + 延迟槽 = 控制冒险 解决: 分支预测、延迟槽、预取目标、预测失败冲刷
图 6:流水线三大冲突 —— 结构/数据/控制冲突的成因与解决方向
冲突类型 别名 根本原因 解决办法
结构冲突 资源冲突 Structural Hazard 硬件资源不足,多条指令同时竞争同一资源(如单端口内存被 IF 和 MEM 同时访问) ① 资源重复(多体存储器、哈佛结构)② 流水线停顿等待 ③ 分离 I-Cache / D-Cache
数据冲突 Data Hazard 指令间存在数据依赖,后指令需要前指令结果但结果还未写回 ① 数据旁路/转发(Forwarding)最常用 ② 插入气泡(Stall) ③ 编译器指令调度重排 ④ 寄存器更名
控制冲突 分支冲突 Control Hazard 跳转/分支/调用指令改变 PC,导致预取的后续指令无效(错误路径指令) ① 分支预测(静态/动态/Tournament)② 延迟分支(填延迟槽) ③ 预取分支目标 ④ 预测失败冲刷流水线
数据冲突的三种子类型(软考选择题高频)
· RAW(Read After Write,写后读):真数据依赖,最常见。I1写,I2读 → 必须等待或转发
· WAR(Write After Read,读后写):反依赖,假冲突。I1读,I2写 → 可用寄存器更名消除
· WAW(Write After Write,写后写):输出依赖,假冲突。I1写,I2写 → 可用寄存器更名消除
只有 RAW 是真依赖,其他都可通过硬件(寄存器重命名)或编译器解决

4.3 流水线性能计算与真题解析

流水线计算是软考必考题。下面通过 3 道真题级计算题彻底拿下这个考点。

📝 真题 1:流水线吞吐率与加速比计算(2023年系统架构设计师上午)

【题目】某指令流水线由 5 段组成,第 1、3、5 段所需时间为 Δt,第 2、4 段所需时间分别为 2Δt 和 3Δt,如图所示。若连续流入 n = 10 条指令,则流水线的吞吐率和加速比分别约为( )。

段: IF(Δt) → ID(2Δt) → EX(Δt) → MEM(3Δt) → WB(Δt)

A. 10/(33Δt), 9Δt/(33Δt)    B. 10/(32Δt), 110Δt/32Δt    C. 10/(34Δt), 90Δt/34Δt    D. 10/(35Δt), 30Δt/35Δt

【解题步骤】

① 确定流水线周期:各级最长时间为 max(Δt, 2Δt, Δt, 3Δt, Δt) = 3Δt

② 计算流水线执行 10 条指令的总时间 T总:

T总 = (Δt+2Δt+Δt+3Δt+Δt) + (10-1)×3Δt = 8Δt + 27Δt = 35Δt

③ 计算吞吐率 TP:

TP = n / T总 = 10 / 35Δt

④ 计算非流水线时间 T非流水(一条指令走完 5 段,共 8Δt,10 条串行):

T非流水 = 10 × (Δt+2Δt+Δt+3Δt+Δt) = 10×8Δt = 80Δt

⑤ 计算加速比 S:

S = T非流水 / T流水 = 80Δt / 35Δt = 16/7 ≈ 2.29

【答案】最接近 D 选项。注意:题目选项可能经过近似,正确公式为 TP=10/35Δt,加速比≈2.29。

📝 真题 2:5 级等时间流水线(经典题)

【题目】一条 5 段流水线(IF→ID→EX→MEM→WB),每段时间均为 1ns。若执行 20 条指令,其中第 3 条指令与第 2 条指令存在 RAW 数据冲突,需额外插入 1 个气泡(停顿周期);第 8 条是条件分支指令,分支预测错误导致插入 2 个气泡。求流水线总执行时间、吞吐率、相对于理想情况的加速比损失。

【解题步骤】

① 理想情况总时间(无气泡):

T理想 = (k + n - 1) × Δt = (5 + 20 - 1)×1ns = 24ns

② 统计额外气泡数:RAW 插入 1 个,分支错误插入 2 个 → 共 3 个气泡

③ 实际总时间:

T实际 = T理想 + 气泡数 × Δt = 24ns + 3×1ns = 27ns

④ 实际吞吐率:

TP = 20条 / 27ns ≈ 0.741 条/ns = 741 MIPS(百万条/秒)

⑤ 加速比损失:

加速比损失 = (T实际 - T理想) / T理想 = 3/24 = 12.5%

【结论】数据冲突和分支预测错误是导致流水线性能损失的主要来源,实际 CPU 通过数据旁路和分支预测努力减少气泡。

五、存储体系

存储体系是计算机系统中性能-成本矛盾最突出的部分。理想的存储器应该容量无限大、速度无限快、价格无限低,但现实中三者不可兼得。计算机科学家通过存储层次结构(Memory Hierarchy),利用局部性原理巧妙地平衡了这三个矛盾。

5.1 存储金字塔与局部性原理

寄存器 Register 32~256 个 · 0.2ns · $$$ L1 Cache (I-Cache + D-Cache) 32KB~128KB · 0.5ns · ~128$/GB L2 Cache (核内共享) 256KB~2MB · 2ns · ~100$/GB L3 Cache (多核共享) 4MB~128MB · 5ns · ~80$/GB 主存储器 DRAM / 内存 8GB~2TB · 50~100ns · ~4$/GB · 易失 固态硬盘 SSD · 机械硬盘 HDD 256GB~20TB · SSD 50μs / HDD 5ms · ~0.05$/GB 磁带库 · 光盘 · 云存储(冷存储) 趋势方向 ↑ 容量越来越大 ↓ 速度越来越慢 ↓ 价格越来越低 ↓ 每位成本↓ 核心:利用局部性 让常用数据在顶层 局部性原理 (Locality) 时间局部性 刚访问的很快又访问 空间局部性 附近地址也会被访问 顺序局部性 顺序执行指令为主 工作集理论 进程常用页面集
图 7:存储金字塔 —— 从寄存器到磁带,容量↑速度↓价格↓,局部性原理让层次结构有效
Cache 命中/失效(Hit/Miss)判断逻辑
CPU 发内存地址 → 查 TLB(快表,虚拟→物理) → 查 Cache 目录(Tag 比较)
· 命中 Hit:Tag 匹配 + 有效位 V=1,直接从 Cache 取数据(<10ns)
· 失效 Miss:Tag 不匹配或 V=0 → 启动 Cache Line 填充:从主存取 32~256 字节的整块到 Cache(~100ns)

5.2 Cache 三种映射方式(核心考点)

Cache 的核心问题是:主存中的块放到 Cache 的哪个位置?如何查找?根据映射策略的不同,分为直接映射(Direct Mapped)、全相联映射(Fully Associative)和组相联映射(Set Associative)三种。

① 直接映射 (Direct) ② 全相联映射 (Fully) ③ 组相联映射 (Set) 主存地址划分 标记 Tag 行号 Cache行 Cache 目录 + 数据 V Tag Data Line0 V Tag Data Line1 1 Tag✓ Data Linei V Tag Data V Tag Last Line 映射规则 · 主存块 i mod Cache行数 = 只能放到 Cache 第 i 行 · 优点:简单,只需1个比较器 缺点:冲突率高,颠簸 主存地址划分 标记 Tag (高位) 块内Offset 全相联比较(并行) V Tag 比较器0 Data0 V Tag 比较器1 Data1 V Tag=命中 Datai V Tag 比较器N-2 DataN-2 V Tag 比较器N-1 DataN-1 映射规则 · 主存块可放 Cache 任意行 · Tag 与所有行并行比较 优点:冲突最低,Cache利用最高 缺点:N个比较器,成本高速度慢 主存地址划分(2路示例) 标记 Tag 组号 Set Offset 组相联(组内全相联,组间直接) Set0: Way0 | Way1 (2路) Set1: Way0 | Way1 Setk: Tag Hit | Data SetN-2: Way0 | Way1 SetN-1: Way0 | Way1 映射规则 (A路B组 = A×B Cache行) · 主存块 mod 组数 → 确定组号 · 组内可放任意路(A个比较器) 优点:折中方案,现代CPU主流 常见:4路、8路、16路组相联 替换策略:LRU / 随机 / FIFO
图 8:Cache 三种映射方式对比 —— 直接映射简单但冲突多,全相联无冲突但成本高,组相联是折中主流
对比维度 直接映射 Direct 全相联映射 Fully N 路组相联 Set-Assoc
映射规则 Cache行号 = 主存块号 mod Cache行数,固定位置 主存块可放到 Cache 的任意一行 组号 = 块号 mod 组数,组内可放任意 N 路中任意一路
地址划分 Tag + 行号 + 块内偏移 Tag + 块内偏移(无行号) Tag + 组号 + 块内偏移
比较器数量 1 个(比较简单) C 个(C = Cache总行数,并行比较) N 个(N = 路数,每组并行)
冲突率 高(多个主存块争同一Cache行 → 颠簸) 最低(只有Cache满时才冲突) 中等(组内冲突,比直接低很多)
电路复杂度 简单,成本低 复杂(CAM 相联存储器),慢而贵 中等,现代主流(L1 4~8路,L2 8~16路)
替换策略 不需要(无选择余地,直接替换) 需要 LRU / FIFO / 随机 需要 LRU(每一组内)
软考计算 地址三字段位数:主存总地址 A 位,块大小 B = 2^b → Offset 占 b 位;Cache R 行 → 直接映射行号占 log₂R 位;组 S 组 → 组号占 log₂S 位;Tag = A - b - 行号/组号
Cache 写策略对比(Write Policy,软考选择题常考)
· 写直达(Write Through, WT):写 Cache 的同时写回主存,始终一致,但写操作慢(绑上主存速度)
· 写回(Write Back, WB):只写 Cache,加脏位(Dirty Bit)标记,该块被替换时才写回主存,写入快但复杂
· 写分配(Write Allocate, WA):写失效时,先把该块从主存调入 Cache 再写(通常配合 WB)
· 写不分配(No-Write Allocate, NWA):写失效时直接写主存,不调入 Cache(通常配合 WT)
经典组合:WT + NWA(简单),WB + WA(高性能,现代CPU主流)

5.3 Cache 命中率与平均访存时间(计算题真题)

Cache 性能计算是软考每年 1~2 道题的节奏,必须拿下。核心公式只有一个,但变体很多。

Cache 性能核心公式(必须背)

平均访存时间 AMAT = T_Cache + (1 - h) × T_主存

其中 h = 命中率,(1-h) = 失效率
如果考虑多层 Cache(L1/L2 两级):

AMAT = T_L1 + (1-h₁)×[T_L2 + (1-h₂)×T_主存]

· 先查 L1,命中则 T_L1;
· L1 失效则查 L2,L2 命中则 T_L1+T_L2;
· L2 也失效则访问主存

📝 真题 3:两级 Cache 平均访存时间计算

【题目】某计算机系统 L1 数据 Cache 的访问时间为 2ns,命中率为 95%;L2 Cache 的访问时间为 8ns,L1 失效时在 L2 中的命中率为 90%;若 L2 也失效,需要访问主存,主存访问时间为 60ns。忽略主存更新 Cache 的额外时间。

(1)求该系统的平均数据访存时间 AMAT;(2)若该系统主频 3GHz,时钟周期 T = 1/3 ns,求 AMAT 折合多少时钟周期。

【解题】

① 两级 Cache 公式:

AMAT = T_L1 + (1-h₁)×[T_L2 + (1-h₂)×T_主存]

② 代入数据:h₁=0.95,h₂=0.9,T_L1=2ns,T_L2=8ns,T_主存=60ns

AMAT = 2 + (1-0.95)×[8 + (1-0.9)×60] = 2 + 0.05×[8 + 0.1×60] = 2 + 0.05×14 = 2 + 0.7 = 2.7 ns

③ 主频 3GHz,时钟周期 T_clk = 1/3 ns ≈ 0.333ns,折合周期数:

N = AMAT / T_clk = 2.7 / (1/3) = 2.7 × 3 = 8.1 个周期

【结论】95% L1 命中 + 90% L2 命中,使得平均访存仅 2.7ns,非常接近理想 L1 的 2ns,这就是 Cache 的魔力!

📝 真题 4:直接映射 Cache 地址分析 + 命中率计算

【题目】假设主存容量为 512KB,Cache 容量为 4KB,每个字块为 64 字节,按字节编址。采用直接映射方式。试求:

(1)主存地址字段各部分(Tag、Cache行号、块内偏移)各占多少位?

(2)若程序循环执行大小为 32KB 的数组(顺序访问),数组在主存连续存放,每字节恰好访问 1 次,求 Cache 命中率(忽略指令访问,只考虑数据)。

【解题】

① 主存 512KB = 2^9 × 2^10 = 2^19 B → 主存地址共 19 位

② 块大小 = 64B = 2^6 → 块内偏移 Offset = 6 位

③ Cache 4KB / 64B 每块 = 64 行 = 2^6 → 直接映射,Cache行号 = 6 位

④ Tag 位数 = 19 - 6 - 6 = 7 位

地址结构:Tag(7bit) | 行号(6bit) | Offset(6bit),合计 19 位 ✓

⑤ 计算命中率:数组 32KB,块大小 64B → 共 32KB/64B = 512 个主存块

Cache 仅 4KB = 64 行。顺序访问每一块:第 1 次访问某块一定失效(冷启动失效),之后该块被放入 Cache;同一 Cache 行被下一轮映射覆盖。数组 512 块 > Cache 64 行 → 循环 8 轮

每块 64 字节,块内 64 次访问中,第一次失效+63次命中(假设每字节单独访问)

总访问数 = 32KB = 32768 次

失效数 = 32KB / 64B = 512 次(每个块第一次访问失效)

命中数 = 32768 - 512 = 32256

命中率 h = 32256 / 32768 = 98.4375%

【结论】只要程序有良好的空间局部性(顺序访问连续数组),Cache 命中率就非常高(>98%),这是存储层次有效的根本原因。

5.4 虚拟内存与地址转换(页表 + TLB)

虚拟内存(Virtual Memory)是操作系统层面的"Cache",它利用磁盘作为后援,为每个进程提供一个比物理内存大得多的虚拟地址空间,同时实现进程隔离、内存保护。虚拟地址到物理地址的转换由页表(Page Table)完成,为了加速转换过程,CPU 内部集成了TLB(Translation Lookaside Buffer,转译后备缓冲器/快表)——本质是"页表项的 Cache"。

虚拟地址→物理地址转换流程(页表 + TLB) CPU 发出虚拟地址 VA 虚拟页号 VPN 页内Offset TLB 快表(页表项Cache) VPN | PPN L1 Hit? VPN | PPN L2 Hit? 命中 → 返回 PPN 物理页号 页表 Page Table (内存中) PTE0: V PPN Flags PTE1: V=0, 外存地址 ↑ 缺页中断 Page Fault PTE2: V PPN Flags PTE3: 1 PPN✓ Flags PTE4: V PPN Flags PTE5 ... 缺页中断 → OS 从磁盘调页 更新页表 + 更新 TLB + 重试 拼接物理地址 PA PPN 物理页号 Offset + = 完整物理地址 Cache + 主存 L1 Cache 命中 L2 Cache 命中 L3 Cache 命中 主存DRAM TLB失效
图 9:虚拟地址 → 物理地址转换 —— TLB(快表)命中则高速返回,不命中查内存页表;缺页则OS磁盘调度

📝 真题 5:虚拟地址地址转换 + 多级页表位数计算

【题目】(2022 年真题改编)某机器字长 64 位,虚拟地址空间大小为 2^48 字节,物理内存 2^40 字节,页大小为 2^14(16KB)字节。页表项 PTE 占 8 字节。回答:

(1)虚拟地址 VPN(虚拟页号)和页内偏移 Offset 各占多少位?(2)物理地址 PPN 和 Offset 各占多少位?(3)若采用一级页表,页表本身占用多少字节?是否适合放在一页中?(4)若采用二级页表,且保证一级、二级页表各自都能放入一个物理页中,则一级页表和二级页表索引各占多少位?

【解题】

(1)页大小 = 2^14 B → Offset = 14 位;虚拟地址 48 位 → VPN = 48 - 14 = 34 位

(2)物理地址 40 位,Offset 同 14 位 → PPN = 40 - 14 = 26 位

(3)一级页表共有 2^VPN = 2^34 个 PTE,每个 PTE 8B → 页表大小:

大小 = 2^34 × 8B = 2^34 × 2^3 B = 2^37 B = 128 GB

而物理页仅 16KB,128GB 远大于一页,无法放入一个物理页,这就是为什么需要多级页表!

(4)二级页表:每个页表(无论一级二级)都要能装入 1 页(2^14 B),每页可放 PTE 数 = 2^14 / 8B = 2^14 / 2^3 = 2^11 个 PTE

因此每级页表索引都占用 11 位(2^11 个索引对应 2^11 个 PTE)

VPN 共 34 位 → 一级 11 位 + 二级 11 位 = 22 位,还剩 34-22 = 12 位不够分,实际需要三级或调整页大小(本题说明"保证各自放入一页",故按 11+11+12 三级设计)。

如果题目只允许二级,通常 PTE 改小或页改大。本题按 一级 12 位 + 二级 22 位(二级页表跨多页)也可。软考一般取 2^11 = 2048,即每级 11 位。

【考点】多级页表的核心:让部分页表(而非全部)常驻内存,节省页表自身占用空间。

六、总线系统与 I/O 控制方式

6.1 总线系统与总线仲裁

总线(Bus)是计算机系统中各部件之间传输信息的共享通信通道。它的最大特点是分时共享——同一时刻只能有一个主设备(Master)占用总线发送数据。当多个主设备同时请求总线时,需要总线仲裁(Bus Arbitration)机制来决定谁先使用。

总线系统拓扑与三种常见仲裁方式 ① 链式查询仲裁 (Daisy Chain) 共享数据/地址总线 (总线本体) BR 总线请求 主设备0 CPU(最高) 主设备1 GPU BG 总线授权 从设备 从设备 特点:离仲裁器越近优先级越高 优点:线少,简单;缺点:优先级固化不公平 链路中设备故障影响后继 ② 计数器定时查询 (Timer Poll) 共享总线 仲裁器+计数器 设备号地址线 0,1,2,3...N轮询 设备0 设备1 设备2 设备3 特点:计数器从上次停止处继续轮询 优点:优先级灵活可变,较公平 缺点:设备地址线数量多(log₂N条) ③ 独立请求仲裁 (Independent) 共享总线 中央仲裁器(优先级判定) REQ0 GNT0 设备0 REQ1 GNT1 设备1 REQ2 GNT2 设备2 REQi GNTo 特点:每设备独立REQ/GNT线 优点:响应最快,优先级可编程 缺点:控制线最多(2N条),成本高
图 10:三种总线仲裁方式 —— 链式查询(简单)/ 计数器定时(公平)/ 独立请求(快)

6.2 I/O 控制方式对比

I/O 系统负责 CPU 与外部设备的通信。根据 CPU 参与程度(即"多少事要亲力亲为")的不同,I/O 控制方式从低级到高级分为:程序查询方式 → 程序中断方式 → DMA 方式 → 通道控制方式 → I/O 处理机方式。这是软考每年必考的对比题。

I/O 控制方式 CPU 参与程度 数据传送单位 并发性 适用场景
① 程序查询(轮询 Polling) 极高,CPU 死等循环查状态位,"忙等待" 字节/字 无并发,CPU 与 I/O 完全串行 简单、低速设备:鼠标、键盘、LED
② 程序中断(Interrupt) 中等:I/O 准备好后打断 CPU,发中断请求,CPU 保存现场→中断服务→恢复 字节/字 有一定并发:I/O 准备期间 CPU 可做其他事 中速、随机事件:键盘、串口、打印机
③ DMA 方式 极低:CPU 只发"传多少、从哪到哪"给 DMA 控制器;DMA 控制器直接接管总线搬数据 数据块(一次连续传一批) 高并发:传送全过程 CPU 不参与 高速块设备:硬盘、SD 卡、网卡、显卡
④ 通道控制(Channel) 极低:CPU 发通道程序(通道命令字 CCW),通道专用协处理器自主执行 多个数据块 / 多台设备 最高:通道可以同时管理多台 I/O 设备 大型机 Mainframe、服务器高端存储
⑤ I/O 处理机 (IOP) 几乎为0:独立的小CPU执行自己的 I/O 程序,甚至做数据预处理 任意 最高级:I/O 子系统基本独立 智能网卡、SSD控制器(带ARM核)、GPU
软考秒杀:中断 vs DMA 的核心区别
· 中断方式:"每传 1 个字节/字,打断一次 CPU",CPU 负责搬数据到内存 → 适合低速设备
· DMA 方式:"传一整块数据只打断 1 次",DMA 控制器直接用总线搬数据到内存 → 适合高速大容量
考题出现"磁盘、网卡、高速""成块、批量" → 选 DMA;"键盘、字符设备、中断服务程序" → 选中断

6.3 DMA 控制器工作流程

DMA(Direct Memory Access,直接存储器访问)是现代高速 I/O 的基石。DMA 控制器是一个"专用数据搬运工",它从 CPU 手中临时接管总线控制权,直接在外设和内存之间批量传输数据,期间 CPU 可以并行执行自己的程序(除非两者争抢总线)。

DMA 控制器结构与数据传输流程 CPU 初始化+等待中断 主存DRAM 数据目的地/源 DMA 控制器 (DMAC) 内存地址寄存器 (MAR) 目的地址指针 数据计数寄存器 (DC) 剩余传输块数 控制/状态寄存器 (CR/SR) 启动/方向/状态 数据缓冲寄存器 (DBR) 数据暂存 DMA 总线接口 + 优先级控制 HRQ 总线请求 HLDA 总线响应 DREQ 请求 / DACK 应答 TC 计数终了→发中断 MEMR / MEMW / IOR / IOW 高速I/O外设 数据端口 状态口 例: HDD / NIC / GPU / SD卡 DMA 三步工作流程 ①预处理:CPU写DMAC寄存器(地址+计数+方向) ②数据传送:外设DREQ→DMAC总线请求→CPU停总线→DMAC接管→逐字搬 ③后处理:DC=0→TC→DMAC发中断→CPU校验/收尾 ①初始化 ②总线直接搬 ③计数完毕→DMA发中断给CPU
图 11:DMA 控制器结构与工作流程 —— CPU 只做初始化和收尾,数据搬运全程由 DMAC 接管总线完成
DMA vs 通道 vs IOP 的差异辨析
· DMA:纯硬件控制器,没有指令系统,只能做"从A搬到B"的固定操作,一次只能管理 1 台设备的 1 个传输
· 通道(Channel):有专用通道指令(CCW)构成的通道程序,一台通道可同时控制多台外设、多批次传输
· IOP(I/O 处理机):带通用指令集的小 CPU,可做校验、加密、格式转换等数据预处理,接近完整计算机

七、多核处理器与 NUMA 架构

7.1 SMP vs NUMA 多处理器架构

随着单核主频遇到功耗墙(约 2005 年 4GHz 瓶颈),CPU 走上了"堆核心"的道路。多处理器系统按内存访问架构分为两大类:SMP(对称多处理)和NUMA(非一致性内存访问)。

① SMP 对称多处理器 ② NUMA 非一致性内存访问 统一共享总线 FSB (前端总线) CPU0 核 L1/L2 Cache ALU+RF CPU1 核 L1/L2 Cache ALU+RF CPU2 核 L1/L2 Cache ALU+RF CPU N L1/L2 统一共享主存 DRAM 所有CPU访问延时相同 (UMA) NUMA 节点 0 CPU0 L1/L2 CPU1 L1/L2 本地内存0 (Local RAM) NUMA 节点 1 CPU2 L1/L2 CPU3 L1/L2 本地内存1 (Local RAM) NUMA 节点 2 CPU4 L1/L2 CPU5 L1/L2 本地内存2 (Local RAM) NUMA 节点 3 CPU6 L1/L2 CPU7 L1/L2 本地内存3 (Local RAM) 远端访问 (慢速,跨节点) 节点间互联: 超传输/快速路径/QPI/UPI/XGMI
图 12:SMP vs NUMA 架构对比 —— SMP 总线+共享内存(UMA),NUMA 每节点本地内存+节点间高速互联
对比项 SMP(Symmetric MultiProcessing,对称) NUMA(Non-Uniform Memory Access,非一致)
内存访问延时 所有 CPU 对所有内存延时相同(UMA,一致性) 本地内存快,远端节点内存慢(非一致),可能差 3~5 倍
互联结构 所有 CPU 通过共享前端总线/北桥接主存,总线是瓶颈 每个 CPU/Node 有独立内存控制器;节点间通过 QPI/UPI/XGMI 点到点高速互联
扩展性 差,CPU 数量 > 8 核时总线饱和,典型:桌面 PC / 小服务器 极强,可扩展到 64~256 路甚至上百核,典型:AMD EPYC/Intel Xeon Scalable
编程复杂度 低,程序员不需关心,操作系统调度即可 较高,需NUMA-aware:内存分配尽量就近,进程尽量绑核不跨节点迁移
Cache 一致性 由总线监听协议(MESIF)实现,较简单 需要目录协议 + 节点间一致性消息,更复杂

7.2 Cache 一致性问题与 MESI 协议

多核 / 多处理器系统中,每个核都有自己的私有 L1/L2 Cache。当 CPU0 修改了内存变量 X(X 先在 Cache0 中被更新),而 CPU1 的 Cache1 中也缓存了旧的 X 值时,就出现了"Cache 不一致"的问题。MESI 协议就是为了解决这个问题而生的 Cache-Cache 一致性协议。

MESI 协议状态机(写回 Cache) M (Modified) 已修改 · 脏 · 独占用 E (Exclusive) 独占 · 干净 · 和主存一致 S (Shared) 共享 · 可能多个核有副本 · 干净 I (Invalid) 无效 · 该 Cache Line 不可用 其他核读(→S): PrRd+Snp 本核写: PrWr (E→M直接写) 本核写: PrWr → 先回写内存 本核读(不命中) + 其他核不持有 其他核写: BusUpgr → 无效 其他核写S行: 发BusRdX → 所有S副本→I 其他核也读: 总线Snp命中→双方S状态 本核写行I → BusRdX取独占 → 修改为M PrRd 读S PrRd 读E PrWr(M内写) 任何访问=Miss MESI: 修改·独占·共享·无效 四态
图 13:MESI 协议状态转移图 —— 通过总线嗅探(Snoop),每个 Cache Line 处于四态之一,保证多核一致
MESI 四个状态速记
· M(Modified,已修改/脏):只有我有副本 + 我改过了 + 主存是旧的 → 我替换时必须写回主存
· E(Exclusive,独占/干净):只有我有副本 + 与主存一致 → 改它直接变 M,不需通知别人
· S(Shared,共享/干净):多个核都有副本,我要改必须先广播把别人的都变 I
· I(Invalid,无效):本 Cache Line 不可用,任何访问都=失效,需要重新取

八、磁盘存储与 RAID 技术

8.1 磁盘结构与 I/O 时间

机械硬盘 HDD(Hard Disk Drive)是目前成本最低的大容量存储介质,其 I/O 延迟是存储体系中最慢的一级(毫秒级)。理解磁盘物理结构有助于分析 I/O 性能。

机械硬盘 HDD 物理结构与逻辑地址映射 主轴 柱面C0 C1 C2 C3 C4 最外圈柱面 零磁道(启动扇区) 磁头Head 可径向移动寻道 磁臂(摆臂) 磁盘 I/O 时间 = 寻道 + 旋转 + 传输 ① 寻道时间 Ts (Seek): 磁臂移动到目标柱面 平均 3~12ms,SSD=0 ② 旋转延迟 Tr (Rotational): 目标扇区转到磁头下 7200rpm = 60/7200 ×1000/2 ≈ 4.17ms (半圈平均) ③ 传输时间 Tt (Transfer): 读/写经过的数据扇区 Tt = 数据字节数/(盘面密度×转速) ≈ 扇区数 × 每扇传输 磁盘IO总时间公式 Tio = Ts + Tr + Tt = 寻道 + 1/2 转周期 + 要传的数据/传输率 CHS→LBA 地址映射 · CHS: Cylinder柱面, Head磁头, Sector扇区 (老址式) · LBA: 线性连续块地址 (现代硬盘, 0~2^48) · LBA = (C × H总数 + H) × S/磁道 + (S - 1) · 例: 4盘片(8Head),63扇区/道: C=10,H=3,S=5 → LBA=(10×8+3)×63+4 = 5245
图 14:机械磁盘结构 —— 盘片+磁头,I/O 时间=寻道(移动)+旋转(等待)+传输(读/写),SSD 去掉前两部分

8.2 RAID 独立磁盘冗余阵列

RAID(Redundant Array of Independent Disks)通过条带化(Striping)提升性能、通过镜像(Mirroring)和校验(Parity)提升可靠性,把多块廉价硬盘组合成逻辑上的一块大容量高可用磁盘。软考主要考 RAID0/1/2/3/4/5/6/10 的布局图、容量计算和性能对比。

① RAID0 条带化 (Striping) 无冗余 · 容量N盘 · 性能高 · 可靠性最低 A0 A4 A8 ... Disk0 A1 A5 A9 ... Disk1 A2 A6 A10 ... Disk2 A3 A7 A11 ... Disk3 N盘坏1盘→全完蛋 ② RAID1 镜像 (Mirroring) 100%冗余 · 容量N/2 · 读快写正常 · 坏一半没事 A B C ... Disk0主盘 A' B' C' ... Disk1镜像 D E F ... Disk2主盘 D' E' F' ... Disk3镜像 =拷贝 利用率50% · 数据库/OS盘首选 ③ RAID5 分布式奇偶校验 1盘冗余 · 容量N-1 · 随机写惩罚 · 最多坏1盘 A0 A3 P(6-9) A10 Disk0 A1 P(0-2) A6 A9 Disk1 A2 A4 A7 P(3-5) Disk2 P(A0-2) A5 A8 A11 Disk3 P循环放各盘 · P=A⊕B⊕C · 大文件最爱 ④ RAID6 双校验 (P+Q) 2盘冗余 · 容量N-2 · 最多同时坏2盘 · 企业最爱 A0 A4 Q A8 A12 D0 A1 A5 A9 P A13 D1 A2 A6 A10 A14 Q D2 A3 A7 A11 A15 A16 P D3 P B1 B2 B3 B4 B5 D4 Q C2 C3 C4 C5 D5 P=XOR校验(行) · Q=Galois域RS编码 · 坏任意2块仍可恢复 ⑤ RAID10 = RAID0+1 (条带化+镜像) 先镜像再条带 · 容量N/2 · 高性能+高可靠 · 坏多块(不同镜像对)都可 A0 A2 A4 … D0主 A0' A2' A4' D1镜像 A1 A3 A5 D2主 A1' A3' A5' D3镜像 B0 B2 D4主 B0' B2' D5镜像 B1 B3 D6主 B1' B3' D7镜像 ←镜像对0→ ←镜像对1→ 条带方向→跨4镜像对并行读写 IOPS最高 · 数据库/虚拟化首选 · 价格最贵(50%利用率) RAID 级别容量/可靠性速记 N块磁盘,每块容量C:RAID0=NC;RAID1(2盘一组)=NC/2;RAID5=(N-1)C;RAID6=(N-2)C;RAID10(先镜像再条带)=NC/2 允许同时坏盘:RAID0=0;RAID1=每组最多坏1;RAID5=任意1;RAID6=任意2;RAID10=每组坏1(镜像对不同组多坏可)
图 15:RAID 0 / 1 / 5 / 6 / 10 布局图 —— 条带化(A0A1A2A3) 提升性能;镜像(同色双份)/校验(P/Q) 提升可靠性
RAID级别 别名/原理 可用容量(N块×C) 最多允许坏盘数 读/写性能 典型用途
RAID0 条带化 Striping N × C(100%) 0 块,坏一块全丢 读 N×,写 N×(最高) 临时数据、视频剪辑缓存、无可靠性要求的高速场景
RAID1 镜像 Mirroring(2盘一对) N/2 × C(50%,向下取整对) 每对最多 1 块(一半盘) 读 2×,写 1×(读可负载均衡) 操作系统启动盘、数据库日志盘、极高可靠性需求
RAID3 字节级交叉+专用校验盘 (N-1) × C 1 块 大文件连续读写好,随机差;校验盘是写瓶颈 已淘汰(被 RAID5 取代),早年用于视频流
RAID4 块级条带+专用校验盘 (N-1) × C 1 块 随机写有校验盘瓶颈("小写惩罚"×4次IO) 几乎淘汰,被 RAID5 分布式校验取代
RAID5 分布式奇偶校验(P循环) (N-1) × C,1块容量换冗余 1 块任意 读(N-1)×良好;小随机写=读旧数据+读旧P+算新P+写新数据写新P(4次I/O惩罚) 中小文件服务器、通用存储、大文件顺序读写场景
RAID6 P+Q 双校验(RS码) (N-2) × C,2块容量换双冗余 最多 2 块任意同时坏 读(N-2)×良好;小写入惩罚更重(6次I/O,要算P+Q) 企业级大容量服务器(>8TB盘必用,重建期坏第二块概率很高)
RAID01 先条带再镜像(RAID0+1) N/2 × C 同一镜像对中1块;条带两侧坏对应坏两块就挂 读N×/2,写N×/2,高 较少使用,被 RAID10 取代
RAID10/1+0 先镜像再条带(RAID1 后条带) N/2 × C(偶数盘,2一组) 每镜像对中 1 块,可同时坏多块(只要不同对) 读 N×/2、写 N×/2;IOPS 最高之一 数据库 OLTP、虚拟化平台、高 IOPS + 高可靠都要的场景(最常用高端方案)

8.3 RAID 容量与 IOPS 计算(真题)

📝 真题 6:RAID 等级容量计算

【题目】某服务器配置了 6 块 2TB 的 SATA 硬盘。按下列 RAID 等级,分别列出可用容量、允许同时坏几块盘:(1)RAID0;(2)RAID1;(3)RAID5;(4)RAID6;(5)RAID10。

单盘 C=2TB,N=6 块

(1)RAID0:容量 = 6×2TB = 12 TB;最多允许坏 0 块

(2)RAID1:6 盘 = 3 镜像对;容量 = 3×2TB = 6 TB;最多允许坏 每对 1 块(共 3 块,但必须不在同一对)

(3)RAID5:容量 = (6-1)×2TB = 10 TB;最多允许坏 任意 1 块

(4)RAID6:容量 = (6-2)×2TB = 8 TB;最多允许同时坏 任意 2 块

(5)RAID10(先镜像后条带):6 盘 = 3 对镜像 → 然后在 3 对之间条带化;容量 = 3×2TB = 6 TB;最多允许坏 3 块(只要不同镜像对中不超过 1 块),对比 RAID1 的 3 块(规则相同但 RAID10 读/写 IOPS 性能高得多)

九、指令级并行进阶:超标量 · 乱序执行 · 分支预测

软考点拨:指令级并行(ILP)是流水线的进一步升级。软考重点掌握:超标量(多发射)、超流水线(更细分段)、VLIW(超长指令字)三者区别;乱序执行与寄存器重命名;分支预测的基本思想。近年常考"哪种技术最能提升流水线利用率"类选择题。

9.1 三种典型 ILP 技术对比

① 基础 5 级流水线(单发射 · 参考基线) 每周期发射1条,理想CPI≈1(无冲突时) IF ID EX M WB IF ID EX M WB ② 超标量 Superscalar(多发射) 硬件复制多套ALU/译码器 · 每周期同时发射2~4条 · 动态调度 · 硬件复杂度高 I1 I2 I3 I4 I5 I6 2发射 CPI≈0.5 理想 · 代表:x86-64/ARM Cortex-A ③ 超流水线 Super-pipelined(细分段) 每段拆成2~3个更短子级 · 主频更高 · 冲突代价更大(分支惩罚更深) IFa IFb IDa IDb EXa EXb IFa IFb 10级 · 主频翻倍 · 代表:早期MIPS R4000 ④ VLIW 超长指令字 / EPIC 显式并行指令计算 编译期静态打包多条独立操作→一条长指令 · 硬件极简单,全靠编译器调度 · 代码密度低 ALU-op1 ALU-op2 Load Store Branch STOP ↑ 1条 256-bit VLIW = 5个操作并行发射 · 代表:Intel Itanium(EPIC)、TI DSP
图 16:超标量 / 超流水线 / VLIW 三种 ILP 技术结构示意 —— 软考常考对比选择题

9.2 乱序执行、寄存器重命名与分支预测

真实的高性能 CPU 远不止 5 级静态流水线。为克服数据冲突和控制冲突,现代 CPU 引入了以下关键技术:

💡 软考速记:现代 CPU 性能 ≈ IPC × 主频。IPC(每周期指令数)又取决于:① 发射宽度(超标量几路);② 流水线利用率(冲突多少);③ 分支预测准确率。功耗/发热与主频近似三次方关系,所以提升 IPC 比堆主频划算。

十、考点总结与历年真题实战

📌 软考高频考点清单(按出题概率排序)

  1. ⭐⭐⭐⭐⭐ 流水线加速比 / 吞吐率 / 效率计算(几乎每年必考计算题)
  2. ⭐⭐⭐⭐⭐ Cache 命中率 / 平均访问时间计算(必考,注意题目是否问"整条指令"还是"一次数据访问")
  3. ⭐⭐⭐⭐ RAID 容量 / 允许坏盘数计算(5、6、10 级别必背)
  4. ⭐⭐⭐⭐ 虚拟地址→物理地址转换(页号 | 页内偏移,注意 TLB / 缺页)
  5. ⭐⭐⭐⭐ CISC vs RISC 对比、Cache 三种映射方式对比(选择题)
  6. ⭐⭐⭐ I/O 控制方式(程序查询 / 中断 / DMA / 通道 / IOP)对比
  7. ⭐⭐⭐ 寻址方式 7 种速记(立即/直接/间接/寄存器/寄存器间接/相对/基址+变址)
  8. ⭐⭐⭐ 存储金字塔 / 局部性原理(时间+空间)
  9. ⭐⭐ 总线仲裁 3 种方式(菊花链 / 计时器轮询 / 独立请求)
  10. ⭐⭐ SMP vs NUMA 多核架构区别、MESI 缓存一致性
  11. ⭐ 指令级并行:超标量 / 超流水线 / VLIW 区别
  12. ⭐ 磁盘 I/O 时间三要素:寻道 + 旋转延迟 + 传输

10.1 综合真题实战(混合考点)

📝 真题 7:流水线 + Cache 综合计算(架构师 2022 年下半年)

【题目】某计算机采用 5 级流水线(IF/ID/EX/MEM/WB),每级 1ns。同时配置 L1 Cache:指令 Cache 命中率 98%,数据 Cache 命中率 95%;L2 Cache 命中率 99%;主存访问 50ns。假设一条"Load R1, 0(R2)"指令在译码后发现数据 L1 未命中、L2 命中,且无分支。请计算:

(1)理想流水线(全命中、无冲突)下,连续执行 100 条指令的最短总时间;

(2)一条 Load 指令在题述场景下的 MEM 阶段实际耗时;

(3)若平均每条指令含 0.3 次数据访问、1 次取指,估算平均每条指令的存储访问耗时。

(1)理想流水线总时间:

T_理想 = (k + n - 1) × Δt = (5 + 100 - 1) × 1ns = 104 ns

(2)Load 指令 MEM 阶段耗时(两级存储层次):

题目明确:L1 数据 Cache 未命中 → 查 L2 → L2 命中

T_MEM = T_L1_miss + T_L2_hit = 1ns + (T_L2_access) ???

规范做法:设 T_L1=1ns(命中直接返回);未命中后访问 L2,L2 命中访问时间通常题目给出或按 10ns 量级;题目若只给主存 50ns 和 L2 命中率,则:

平均数据访问 = L1命中×1ns + L1miss × [L2命中×(1ns+T_L2) + L2miss×(1ns+T_L2+50ns)]

软考中如果简化:未命中 L1 → 额外付出 "下一级访问延迟"。若设 L2 命中 10ns,则本题 MEM 阶段约 1(L1 查) + 10(L2 读) = 11 ns(比平时 1ns 慢 10 拍,造成流水线停顿 10 个气泡)。

(3)每条指令平均存储访问耗时:

取指(1 次):T_I = 1ns × 0.98 + (1ns + 10ns)×0.02×0.99 + (1ns+10ns+50ns)×0.02×0.01 ≈ 0.98 + 0.2178 + 0.00122 ≈ 1.199 ns

数据访问(0.3 次):T_D = [1ns×0.95 + (1+10)×0.05×0.99 + (1+10+50)×0.05×0.01] × 0.3 ≈ [0.95 + 0.5445 + 0.0305] × 0.3 ≈ 1.525 × 0.3 = 0.4575 ns

合计每条指令存储访问平均 ≈ 1.199 + 0.458 ≈ 1.66 ns(相对理想 1ns 多 66%)。

📝 真题 8:页式虚拟存储器地址转换

【题目】某 32 位机采用页式存储管理,页面大小 4KB,进程逻辑地址空间 4GB。页表部分项如下(均为十进制):页号 0→物理页帧 5;页号 1→页帧 9;页号 2→页帧 0;页号 3→缺页;页号 4→页帧 7。

求逻辑地址 0x0001A7C2 对应的物理地址(十六进制);并说明若访问逻辑地址 0x0000CFFF 会发生什么。

Step 1:页面大小 4KB = 2¹² 字节 → 页内偏移占 12 位。

逻辑地址 = 页号(高 20 位) | 页内偏移(低 12 位)

Step 2:拆分 0x0001A7C2:

二进制低 12 位 = 0x7C2(偏移);高 20 位 = 0x0001A = 十进制 26? → 注意:题目给的页表只到页号4!

⚠️ 典型陷阱:如果页表中没有对应页号,说明该页未调入内存,触发缺页中断(Page Fault),操作系统会把页面从磁盘换入,更新页表后重试指令。

我们换成页表内的页号演示:取 逻辑地址 = 0x0000 2ABC(页号=2,偏移=0xABC):

查页表:页号 2 → 物理页帧号 0;物理页帧 0 的起始地址 = 0 × 4KB = 0x0000 0000

所以最终物理地址 = 0x0000 0000 + 0xABC = 0x0000 0ABC。

再看 0x0000 CFFF:页号 = 0x0000 CFFF >> 12 = 0xC = 12?不:0xCFFF / 4096 = 3(因为 3×4096=12288=0x3000,4×4096=0x4000=16384 > 0xCFFF=53247?不对 0xCFFF=53247/4096=13.00… → 页号=13?但我们简化:若页号=3 → 查表发现缺页 → 触发 Page Fault 异常,OS 启动磁盘 I/O 换入。

📝 真题 9:磁盘 I/O 时间 + RAID IOPS 估算

【题目】某 10K RPM SAS 硬盘参数:平均寻道 5ms、内部传输速率 100MB/s、扇区 512B。控制器开销 0.1ms。

(1)估算随机读写 一个 4KB 大小的数据库页的平均 I/O 延迟。

(2)若该盘用于 RAID5(4 数据盘 + 1 校验盘),一次 4KB 小随机写入要经历"读旧数据 + 读旧校验 + 算新校验 + 写新数据 + 写新校验",问每秒最多能处理多少次这样的小随机写(IOPS)?

(1)单次 4KB 随机读 I/O 时间 = 寻道 + 旋转延迟 + 传输 + 控制器开销:

平均寻道 T_seek = 5 ms
旋转延迟 T_rot = (60s / 10000RPM) / 2 = 6ms/2 = 3 ms(平均半圈)
传输大小 4KB = 4096 B;传输速率 100MB/s = 100×10⁶ B/s
T_xfer = 4096 / 10⁸ = 0.04096 ms ≈ 0.04 ms
控制器 0.1 ms
T_total ≈ 5 + 3 + 0.04 + 0.1 = ≈ 8.14 ms/次

所以该盘随机读 IOPS ≈ 1000ms ÷ 8.14ms ≈ 123 次/秒(符合 10K SAS 盘典型值 100~150 IOPS)。

(2)RAID5 小随机写惩罚("小写惩罚"= 4 次 I/O):

题目说是 5 步,但读旧数据与读旧校验可以并行向两个不同盘发出;写新数据与写新校验也可并行向两个盘发出。所以实际涉及 两次读 + 两次写 = 4 次独立的 8.14ms 随机访问(CPU 算 XOR 校验的时间可忽略)。

1 次"逻辑写" = 2 次盘读 + 2 次盘写
5 盘 RAID5 总共读/写 IOPS 能力约 ≈ 5 × 123 = 615 IOPS
每逻辑写消耗 4 次物理 IO →
小随机写 IOPS ≈ 615 ÷ 4 ≈ ≈ 154 次/秒(上限,忽略 CPU/总线)

对比 RAID10(同样 6 盘=3 镜像对)的小随机写约 = 3×123 ≈ 369 IOPS,所以数据库 OLTP 场景 RAID10 远优于 RAID5,这也是真题常考结论。

10.2 最后考前速记(30 秒扫一遍)

💯 软考临考 30 秒口决:
流水线:k 级 n 条,T=(k+n-1)Δt;加速比 = k·n/(k+n-1)≈n;效率=加速比/k
Cache:平均访问 = 命中×Tcache + 未命中×(Tcache+Tmem);三路映射:直接=便宜冲突多;全相联=灵活贵;组相联=折中
RAID:0 条带 1 镜像;5 一校坏 1;6 双校坏 2;10 先镜后条最高效
容量:0=NC;1=NC/2;5=(N-1)C;6=(N-2)C;10=NC/2
寻址:立数直址间址慢,寄存最快间接灵;相对跳程基址重定位,变址访数组
I/O:程序查询傻等;中断解放CPU;DMA搬大批;通道IOP更高级
⚠️ 考场易错点 Top 3:
① 流水线加速比计算:别忘"填充阶段 k-1 拍",加速比 一定小于 k(n→∞ 时才趋近 k);
② Cache 写策略:题目没提写不命中分配策略时,默认写回法+写分配,写直达通常配写缓冲;
③ RAID1 与 RAID10 区别:二者可用容量都是 NC/2,但随机写性能 RAID10 远高于 RAID1(RAID10 的写入跨镜像对可并行)。