01. 计算机组成与体系结构¶
计算机基础知识、计算机组成、指令系统、可靠性与性能指标。
配套阅读:计算机组成与体系结构:课件笔记,含课程配图、例题和参考解析。
本章目录¶
数据表示、码制与校验码¶
---
markmap:
height: 760
initialExpandLevel: 2
autoFit: true
colorFreezeLevel: 2
maxWidth: 280
spacingHorizontal: 80
spacingVertical: 12
nodeMinHeight: 24
paddingX: 10
---
# 二进制与数据表示
## 进制转换
- 短除法:整数转为目标进制,余数逆序排列
- 凑位权法 / 减法:按目标进制的位权分解数值
- 按权展开法:各位数字乘对应位权后求和
## 码制
- 原码:最高位为符号位,其余位表示绝对值
- 反码
- 非负数:与原码相同
- 负数:原码的符号位不变,数值位取反
- 补码
- 非负数:与原码相同
- 负数:在反码基础上加 1
- n 位整数范围:`−2^(n−1) ~ 2^(n−1)−1`
- 移码:真值加上约定的偏置
- 偏置为 `2^(n−1)` 时,可由 n 位补码翻转最高位得到
- 具体偏置取决于编码约定
## 浮点数
- 一般形式:`数值 = 尾数 × 基数^阶码`
- 阶码位数影响表示范围,尾数有效位数影响精度
- 格式要区分
- 教材抽象模型:尾数可用补码,阶码可用移码
- IEEE 754:符号、偏置指数、尾数字段;尾数不是补码
- 加减运算
- 对阶:小阶向大阶对齐,对应尾数右移
- 尾数加减
- 规格化、舍入,并判断是否溢出
## 校验码
### 奇偶校验码
- 能检测奇数个位发生翻转的错误
- 不能纠错,偶数个位翻转可能漏检
### CRC 循环冗余校验码
- 常用于检错,利用生成多项式进行模 2 除法
### 海明校验码
- 基本海明码可以纠正 1 位错误
- 校验位数量:取满足 `2^r ≥ m + r + 1` 的最小整数 r
- m:数据位数;r:校验位数;编码总长度为 m + r
- 公式推导
- r 个二进制校验结果共有 2^r 种状态
- 需要区分 m + r 种单个位出错的位置,包括数据位和校验位
- 还需要 1 种状态表示没有出错,所以至少需要 m + r + 1 种状态
- 例:8 个数据位需要几个校验位
- r = 3:2^3 = 8 < 8 + 3 + 1 = 12,不够
- r = 4:2^4 = 16 ≥ 8 + 4 + 1 = 13,满足条件
- 因此需要 4 个校验位,编码共 12 位
- 扩展海明码:在上述 r 个校验位之外再加 1 个整体奇偶校验位,实现单错纠正、双错检测
原码、反码、补码与移码¶
---
markmap:
height: 760
initialExpandLevel: 2
autoFit: true
colorFreezeLevel: 2
maxWidth: 280
spacingHorizontal: 80
spacingVertical: 12
nodeMinHeight: 24
paddingX: 10
---
# 原码、反码、补码:固定字长的整数编码
## 先确定字长与解释方式
- 以下示例均使用 8 位有符号整数;最左边是最高位
- 原码、反码、补码是同一整数的不同编码规则
- 最高位 0 表示非负;最高位 1 表示负数,原码和反码还存在负零
- 比特串必须结合编码解释:10000000 在原码中是负零,在反码中是 −127,在补码中是 −128
- 同一个 10000000 若按无符号整数解释,则是 128
## 正数
- 原码、反码、补码相同
- +5 的三种编码都是 00000101
- 正零的三种编码都是 00000000
## 原码:符号与绝对值分开
- 最高位为符号位,余下位表示绝对值
- −5:符号位 1,绝对值 5 写作 0000101,合起来是 10000101
- +0 = 00000000;−0 = 10000000
- n 位范围:−(2^(n−1)−1) ~ 2^(n−1)−1
- 8 位范围:−127 ~ 127
## 反码:负数的数值位取反
- 正数及正零与原码相同
- 负数:原码符号位保持 1,其余各位 0 与 1 互换
- −5:10000101 → 11111010
- 反码转原码:负数的数值位再次取反,符号位不变
- +0 = 00000000;−0 = 11111111
- n 位数值范围与原码相同,8 位为 −127 ~ 127
## 补码:负数的反码加一
- 正数及零与原码相同
- 在原码、反码都可表示的负数范围内:反码加 1,保留 n 位
- −5:11111010 + 1 = 11111011
- 也可从 +5 的编码出发:00000101 全部位取反,再加 1
- 只有一个零:00000000
- n 位范围:−2^(n−1) ~ 2^(n−1)−1
- 8 位范围:−128 ~ 127;10000000 表示 −128
- −128 没有同字长的 8 位原码或反码,不能强行按三步流程转换
## 怎样读出负数补码的值
### 位权法
- n 位补码的最高位权值为 −2^(n−1),其余位仍用正的二进制位权
- 8 位位权依次为:−128、64、32、16、8、4、2、1
- 11111011 = −128 + 64 + 32 + 16 + 8 + 2 + 1 = −5
- 后 7 位不是负数的绝对值,不能直接读成“符号加大小”
### 无符号值减去模数
- 最高位为 0:直接按非负整数读取
- 最高位为 1:先按无符号数读成 U,再计算 U − 2^n
- 11111011 的无符号值为 251;251 − 256 = −5
### 取反加一求绝对值
- 对负数补码全部位取反再加 1,以无符号方式读取结果,得到绝对值
- 11111011 → 00000100 → 00000101,绝对值是 5
- 对 10000000 操作后仍得到 10000000;无符号值为 128,超出 8 位有符号正数范围
---
markmap:
height: 760
initialExpandLevel: 2
autoFit: true
colorFreezeLevel: 2
maxWidth: 280
spacingHorizontal: 80
spacingVertical: 12
nodeMinHeight: 24
paddingX: 10
---
# 补码为什么适合整数运算
## 用加法处理减法
- n 位补码运算可按模 2^n 的规则保留低 n 位
- A − B 可以通过 A 加上 −B 的补码实现
- +5 与 −5 相加:00000101 + 11111011 = 1 00000000
- 保留低 8 位得到 00000000,即 0;最左边的额外进位丢弃
- 原码的符号与大小分开,不能把整串比特直接相加就当作有符号结果
## 进位与有符号溢出要区分
- 进位:运算结果产生了超出固定位宽的位
- 有符号溢出:数学结果超出了有符号类型的表示范围
- 两个同号补码相加,结果符号反转,说明发生有符号溢出
- +127 + 1:01111111 + 00000001 = 10000000
- 数学结果是 128,超出 8 位补码范围;此处没有最高位进位,仍然溢出
- +5 + (−5) 有额外进位,但数学结果 0 没有溢出
- 上述描述是固定宽度二进制运算模型;具体语言对有符号溢出的处理由语言规范决定
## 扩展字长
- 补码符号扩展:在左侧补原来的最高位,保持数值不变
- +5:00000101 → 00000000 00000101
- −5:11111011 → 11111111 11111011
- 若把负数补码左侧补 0,会改变它的有符号数值
---
markmap:
height: 760
initialExpandLevel: 2
autoFit: true
colorFreezeLevel: 2
maxWidth: 280
spacingHorizontal: 80
spacingVertical: 12
nodeMinHeight: 24
paddingX: 10
---
# 移码与偏置
## 把数值整体平移
- 设真值为 x、偏置为 B,编码的无符号数值 E = x + B
- 解码:x = E − B
- 编码后按无符号数比较,在有效编码范围内保持原数值的大小顺序
- 移码的最高位不能沿用原码或补码的符号位解释
## 8 位、偏置 128 的示例
- −5:−5 + 128 = 123 → 01111011
- 0:0 + 128 = 128 → 10000000
- +5:5 + 128 = 133 → 10000101
- −128 → 00000000;+127 → 11111111
- 只有一个零编码 10000000,数值范围为 −128 ~ 127
## 为什么能由补码翻转最高位得到
- 仅当 n 位移码偏置 B = 2^(n−1) 时成立
- x 非负:补码数值为 x,加上 B 恰好把最高位从 0 改为 1
- x 为负:补码的无符号值为 2^n + x,减去 B 得到 B + x,最高位从 1 改为 0
- 其余位保持不变,编码结果都是 E = x + B
- −5:补码 11111011 → 移码 01111011
## 偏置依格式约定
- 一般 n 位偏置编码,若全部码字都用于普通数值,范围为 −B ~ 2^n−1−B
- 浮点数的指数编码常使用偏置,但还可能保留特殊码字
- IEEE 754 单精度指数偏置为 127,并非 128
- 规格化数:实际指数 = 指数字段的无符号值 − 127
- 指数字段全 0、全 1 有特殊含义,不能一律按普通指数解码
- 因此不能把“翻转补码最高位”当作所有移码格式的通用规则
---
markmap:
height: 760
initialExpandLevel: 2
autoFit: true
colorFreezeLevel: 2
maxWidth: 280
spacingHorizontal: 80
spacingVertical: 12
nodeMinHeight: 24
paddingX: 10
---
# 取反加一与快捷转换的推导
## 补码来自固定字长的模运算
- n 位运算只保留低 n 位,相当于模 2^n
- 8 位中的 256 写成 1 00000000,保留低 8 位后是 0
- 对负数 −a,1 ≤ a ≤ 128,其 8 位补码的无符号值是 256 − a
- 原因:a + (256 − a) = 256,保留低 8 位得到 0
- −12 的补码:256 − 12 = 244,即 11110100
- +12 的编码 00001100 与它相加,得到 1 00000000
## 为什么取反后还要加一
- n 位全 1 的无符号值为 2^n − 1
- 把 a 的全部 n 位取反,得到 (2^n − 1) − a
- 再加 1,正好得到负数 −a 的补码数值 2^n − a
- 8 位例子:00001100 → 11110011 → 11110100
## 反过来求绝对值
- 若负数补码的无符号值为 U = 256 − a
- 全部 8 位取反再加一:255 − U + 1 = 256 − U = a
- −12:11110100 → 00001011 → 00001100,得到绝对值 12
- 若要得到 −12 的原码,将符号位设为 1:10001100
- 也可直接保留负号位,只对其余数值位取反加一;须排除无法用同字长原码表示的最小负数
## 从右往左找到第一个 1
- 以 −12 为例,分成:符号位、左侧数值位、最右的 1、尾部的 0
- 补码:`1 | 1110 | 1 | 00`
- 符号位不变、数值位取反:`1 | 0001 | 0 | 11`
- 再加一:`1 | 0001 | 1 | 00`,即原码 10001100
## 快捷规则为什么成立
- 尾部的 0:取反后变成 1,加一连续进位,又变回 0
- 最右的 1:取反后变成 0,接住进位后变回 1,进位在这里停止
- 更左侧的数值位:没有进位再传入,所以只发生取反
- 因而符号位不变,右起第一个 1 及其右侧不变,其他数值位取反
- 规则也适用于可表示负数的原码转补码,变换可逆
## 最小负数是边界
- 8 位补码 10000000 表示 −128,没有对应的 8 位原码
- 取反加一后仍是 10000000;按无符号数读是绝对值 128
- 若要表示它的原码,应先扩展字长,例如 9 位原码为 110000000
定点整数与定点小数¶
布尔逻辑与逻辑门¶
---
markmap:
height: 760
initialExpandLevel: 2
autoFit: true
colorFreezeLevel: 2
maxWidth: 280
spacingHorizontal: 80
spacingVertical: 12
nodeMinHeight: 24
paddingX: 10
---
# 布尔逻辑和逻辑门
## 逻辑运算
- OR 或:全 0 才为 0
- AND 与:全 1 才为 1
- XOR 异或:不同为 1,相同为 0
- NOT 非:0、1 取反
算术逻辑单元¶
---
markmap:
height: 760
initialExpandLevel: 2
autoFit: true
colorFreezeLevel: 2
maxWidth: 280
spacingHorizontal: 80
spacingVertical: 12
nodeMinHeight: 24
paddingX: 10
---
# 算术逻辑单元 ALU
## 作用
- 完成算术运算和逻辑运算
## 与寄存器的配合
- 从寄存器获取操作数
- 将结果保存到寄存器
- 运算产生的状态标志记入状态寄存器
寄存器与主存编址¶
---
markmap:
height: 760
initialExpandLevel: 2
autoFit: true
colorFreezeLevel: 2
maxWidth: 280
spacingHorizontal: 80
spacingVertical: 12
nodeMinHeight: 24
paddingX: 10
---
# 寄存器与内存
## CPU 寄存器
- AC 累加寄存器:暂存操作数或运算结果
- DR 数据缓冲寄存器:暂存与内存交换的数据
- PSW 程序状态字:记录状态标志与控制标志
- 在运算器或控制器中的归类,依教材和具体实现而异
## 主存编址
- 存储单元数:`最大地址 − 最小地址 + 1`
- 前提:地址区间连续,首尾地址均包含
- 编址单位
- 按字编址:一个地址对应一个字
- 按字节编址:一个地址对应一个字节
- 总容量:`存储单元数 × 每个单元容量`
- 芯片数:`所需总容量 / 单片容量`
- 容量单位保持一致,同时核对字扩展和位扩展
CPU 与总线¶
---
markmap:
height: 760
initialExpandLevel: 2
autoFit: true
colorFreezeLevel: 2
maxWidth: 280
spacingHorizontal: 80
spacingVertical: 12
nodeMinHeight: 24
paddingX: 10
---
# 中央处理器 CPU
## 组成
- 运算器:以 ALU 为核心,完成数据运算
- 控制器:解释指令,协调执行过程
## 控制器
- PC 程序计数器:保存后续取指地址
- IR 指令寄存器:保存当前正在译码或执行的指令
- ID 指令译码器:分析指令的操作码
- 时序部件:提供时序控制信号
## 总线系统
- 数据总线:传送数据,宽度影响一次并行传输的数据量
- 地址总线:标识访问的存储单元或设备地址
- n 位地址可表示 2ⁿ 个地址;可寻址容量还取决于编址单位
- 控制总线:传送读写、时序、中断等控制信号
- 多个部件共享总线时,需要仲裁访问权并遵循传输时序
存储层次与存储器分类¶
---
markmap:
height: 760
initialExpandLevel: 2
autoFit: true
colorFreezeLevel: 2
maxWidth: 280
spacingHorizontal: 80
spacingVertical: 12
nodeMinHeight: 24
paddingX: 10
---
# 内存与存储介质
## 层次化存储结构
- 寄存器:靠近执行单元,速度快、容量小、单位容量成本高
- Cache:高速缓存,数据区通常使用 SRAM
- 主存:通常使用 DRAM
- 外存:硬盘、固态硬盘、光盘、U 盘等
- 局部性原理
- 时间局部性:刚访问过的内容,近期可能再次访问
- 空间局部性:某地址附近的内容,近期可能被访问
## 存储器分类
- 按位置:内存、外存
- 按访问方式
- 按内容访问:相联存储器,通过内容匹配查找
- 按地址访问
- RAM:随机存取存储器,如 SRAM、DRAM
- ROM:只读存储器及相关非易失性器件,常用于保存固件
- BIOS / UEFI 固件通常保存在非易失性存储器中
- 通用计算机的操作系统通常保存在外存,运行时装入内存
指令系统与寻址方式¶
---
markmap:
height: 760
initialExpandLevel: 2
autoFit: true
colorFreezeLevel: 2
maxWidth: 280
spacingHorizontal: 80
spacingVertical: 12
nodeMinHeight: 24
paddingX: 10
---
# 指令与程序
## 寻址方式
### 立即寻址
- 操作数直接位于指令中
- 获取快,数值范围受指令格式限制
### 直接寻址
- 指令的地址字段直接给出操作数地址
### 间接寻址
- 地址字段指向的存储单元,保存操作数的实际地址
### 寄存器寻址
- 指定寄存器保存操作数
### 寄存器间接寻址
- 指定寄存器保存操作数地址
## CISC 与 RISC
- 以下为教材中的典型特征,具体实现可能融合两类技术
### CISC
- 指令较复杂,寻址方式较丰富
- 常采用微程序控制,设计与实现复杂
### RISC
- 指令较规整,寻址方式相对较少
- 典型设计强调通用寄存器和硬布线控制
- 便于流水线实现
Cache、流水线、性能与可靠性¶
---
markmap:
height: 760
initialExpandLevel: 2
autoFit: true
colorFreezeLevel: 2
maxWidth: 280
spacingHorizontal: 80
spacingVertical: 12
nodeMinHeight: 24
paddingX: 10
---
# 高级 CPU 设计
## Cache
- 基本概念
- 在 CPU 与主存之间提供更快的数据访问
- 地址映射与标记匹配通常由硬件完成
- 相联查找用于标记匹配,不等于整个 Cache 都是相联存储器
- 直接映射
- 一个主存块只能映射到一个指定位置
- 电路简单,冲突通常较多
- 全相联映射
- 一个主存块可放入任意缓存位置
- 无映射位置导致的冲突失效,查找硬件复杂
- 组相联映射
- 先映射到指定组,再在组内选择位置
- 在冲突与硬件复杂度之间折中
## 流水线技术
- 不同指令的执行阶段重叠,提高吞吐量
- 理想流水线周期:由最慢阶段决定
- 实际还需计入流水寄存器等开销
- 常见理想计算模型
- `总时间 = 首条指令通过流水线的时间 + (n−1) × 流水线周期`
- 等长 k 段同步流水线:`总时间 = (k+n−1) × Δt`
- n:指令条数;Δt:流水线周期
- 前提:忽略停顿、冲突和分支造成的额外开销
## 计算机性能指标
### 主频与时钟周期
- `时钟周期 = 1 / 主频`
- 在采用倍频的时钟模型中:`主频 = 基准时钟频率 × 倍频系数`
### CPI 与 IPC
- CPI:平均每条指令消耗的时钟周期数
- `CPI = 时钟周期总数 / 指令总数`
- IPC:平均每个时钟周期完成的指令数
- `IPC = 指令总数 / 时钟周期总数`
- 同一统计范围内:`IPC = 1 / CPI`
- CPU 执行时间:`指令总数 × CPI / 时钟频率`
### MIPS 与 MFLOPS
- MIPS:每秒百万条指令
- `MIPS = 时钟频率 / (CPI × 10^6)`,频率单位为 Hz
- MFLOPS:每秒百万次浮点运算
- `MFLOPS = 浮点运算次数 / (执行秒数 × 10^6)`
### 字长与总线宽度
- 字长:体系结构中自然处理的数据字位数
- 总线宽度:一次并行传输可承载的数据位数
### 带宽与吞吐
- 带宽:`传输数据总量 / 总时间`
- 吞吐量:某段时间内完成的任务总数
- 吞吐率:`任务总数 / 总时间`
## 可靠性
### 可靠性与可用性指标
- 可靠度 R(t):在给定条件下,规定时间内不发生故障的概率
- MTTF:平均失效前时间
- MTTR:平均修复时间
- MTBF:平均故障间隔时间,用于可修复系统,需明确统计口径
- 简单双状态修复模型的稳态可用度
- `A = 平均正常运行时间 / (平均正常运行时间 + 平均修复时间)`
- 常写作 `A = MTTF / (MTTF + MTTR)`
### 串联系统与并联系统
- 前提:各部件失效相互独立,可靠度针对相同时间区间
- 串联:所有部件正常,系统才正常
- `R = R₁ × R₂ × … × Rₙ`
- 并联:至少一个部件正常,系统即可正常
- `R = 1 − (1−R₁) × (1−R₂) × … × (1−Rₙ)`
### 失效率与千小时可靠度
- 简化估计:`失效率 λ ≈ 失效数量 / 总运行时间`
- 同时运行 N 台、每台运行 t 小时且暴露时间近似相同时,分母可近似为 `N × t`
- 恒定失效率的指数模型:`R(t) = e^(−λt)`
- 仅在 `λt` 很小时:`R(t) ≈ 1 − λt`
- 若 λ 的单位为每小时
- 千小时可靠度:`R(1000) = e^(−1000λ)`
- `1 − 1000λ` 只适用于小失效概率的近似
I/O 数据传输控制方式¶
---
markmap:
height: 760
initialExpandLevel: 2
autoFit: true
colorFreezeLevel: 2
maxWidth: 280
spacingHorizontal: 80
spacingVertical: 12
nodeMinHeight: 24
paddingX: 10
---
# 操作系统:I/O 控制
## I/O 数据传输控制方式
### 程序查询
- CPU 反复检查设备状态
- 方法简单、硬件开销小,但忙等会占用 CPU 时间
### 程序中断
- 设备发出中断请求,CPU 无需持续轮询等待
- 断点:被中断程序恢复执行的位置
- 中断向量表:保存中断处理入口或描述信息
- 保存现场:保存继续执行所需的寄存器等状态,常借助栈
- 恢复现场:处理完成后恢复状态,再返回断点继续执行
### DMA
- 在主存与外设之间进行高速、批量数据传输
- CPU 配置传输,DMA 控制器执行传输,通常在完成后通知 CPU

