跳转至

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 个整体奇偶校验位,实现单错纠正、双错检测

原码、反码、补码与移码

8 位整数的原码、反码、补码与偏置为 128 的移码对照,以及取反加一和补码转原码快捷法的推导

--- 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