- 1 概述
collapsed:: true
- 层次结构
- 计算机软件
- 三个级别的语言
- 机器语言 - 唯一能被计算机直接执行的语言
- 注意: 硬件描述语言(HDL)不是机器语言, 仍需经过综合工具转换为门级网表后才能在硬件上运行
- 汇编语言
- 高级语言
- 两类软件
- 编译流程
- 软件和硬件逻辑功能具有等价性
- 性能指标
- 基本指标
- 机器字长
- 存储容量
- 吞吐量: 系统在单位时间内处理请求的数量
- 运算性能相关指标
- 时钟频率
- 时钟周期
- 指令周期
- CPI
- IPC
- MIPS
- FLOPS
- 考点 #🕳 有坑
- CPU的速度提高50% , 程序执行时间减少多少?
- 假设指令条数M, CPI为C, 原CPU时钟频率为f, 则原执行时间T1=fM×C
- 提高50%后, 新时钟频率f′=1.5f, 新执行时间T2=f′M×C=1.5fM×C=1.5T1
- 程序执行时间减少T1T1−T2=T1T1−1.5T1=1.51.5−1=31≈33.33%
- 单位制
- 国际单位制SI
- k (10^3)
- M (10^6)
- G (10^9)
- T (10^12)
- P (10^15)
- E (10^18)
- Z (10^21)
- 二进制单位制
- Ki (2^10)
- Mi (2^20)
- Gi (2^30)
- 2 数据表示和运算
collapsed:: true
- 进制转换
- 二 八 十六 进制相互转换
- 任意进制转十进制
- 十进制转任意进制 #🤔 考前记
- 除基取余法 (整数部分)
- 乘基取整法 (小数部分)
- 原反补移
- 补码
- 补码的范围
- n位补码表示的整数范围: [−2n−1,2n−1−1]
- 求补码
- 正数: 原码 = 反码 = 补码
- 负数: 反码 = 原码符号位不变, 其他位取反; 补码 = 反码 + 1
- 扫描法
- 从低位向高位扫描, 遇到第一个1后, 该1及其低位不变, 其余位取反
- 求补码对应相反数的补码: 全部按位取反再加1
- 补码求真值
- 正数: 补码 = 真值
- 负数: 真值 = 补码取反再加1,然后加负号
- 按权展开, 最高位权值为负
- 浮点数表示
- 基数大小对表示范围和精度的影响
- 基数越大, 表示范围越大, 精度越低
- 基数越小, 表示范围越小, 精度越高
- IEEE 754标准
- 单精度32位
- 符号位1位, 阶码位8位, 尾数位23位
- 阶码采用移码, 偏移量为127
- 阶码范围: -126 ~ +127 (0~255中除去全0和全1再减去偏移量127)
- 双精度64位
- 规格化浮点数表示形式
- (−1)S×1.M×2E−Bias
- S: 符号位
- M: 尾数 (隐含1)
- E: 阶码 (无符号整数)
- Bias: 偏移量 (单精度127, 双精度1023)
- 特殊值表示
- 非规格化数: 阶码全0, 尾数非0
- 零: 阶码全0, 尾数全0, 符号位区分正负零
- 无穷大: 阶码全1, 尾数全0, 符号位区分正负无穷大
- NaN: 阶码全1, 尾数非0, 表示未定义或不可表示的值
- 考点
- 几种最值的大小
- 最小规格化正数: 尾数最小(全0), 阶码最小(1), 符号位0
- 最大规格化正数(最大的规格化数): 尾数最大(全1), 阶码最大(254), 符号位0
- 最小规格化负数(最小的规格化数): 尾数最大(全1), 阶码最大(254), 符号位1
- −(2−2−23)×2127=−(2128−2104)
- 最大规格化负数: 尾数最小(全0), 阶码最小(1), 符号位1
- 值最小的规格化数−(2−2−23)×2127<值最大的负规格化数−1.0×2−126<0<值最小的正规格化数1.0×2−126<值最大的规格化数(2−2−23)×2127
- 非规格化数的真值
- 浮点数运算
- C语言数据类型
collapsed:: true
- 数据类型及其存储空间
- 1 字节: char, unsigned char
- 2 字节: short, unsigned short
- 4 字节: int, unsigned int, float
- 8 字节: long long, unsigned long long, double
- 数据类型转换
- 隐式类型转换
- 低精度向高精度转换 #🕳 有坑
- 源类型为有符号类型: 符号位扩展; 无符号类型: 零扩展
-
short si = -32767 // si = 0x8001
unsigned int ui = si; // 先隐式整型提升 ii = 0xFFFFFFFF8001
// 然后强制类型转换, ui = ii
- 有符号向无符号转换
- 强制类型转换
- 特殊转换
- float到double: 精度不变
- double到float: 可能丢失精度
- int到float: 可能丢失精度, 尾数最多23位
- int到double: 精度不变, 尾数位数足够
- float/double到int: 小数部分截断
- 移位运算
- 逻辑移位: 空位补0
- 算术移位: 右移时空位补符号位
- 循环移位: 移出位重新补入另一端
- 定点数加减法
- 补码加减法
- 加法: 直接按位相加, 忽略最高位的进位
- 减法: 将减法转为加法, 即加上被减数相反数的补码(全部按位取反再加1)
- 溢出检测
id:: 69394b42-0e23-4a63-a7be-4d90872fd418
- 双符号位
- 结果双符号位相同 - 无溢出
- 结果双符号位不同 -
01 正溢出, 10 负溢出
- 单符号位
- 结果判断法
- 两正数相加结果为负 - 正溢出
- 两负数相加结果为正 - 负溢出
- 操作数判断法(硬件采用)
- Cs为符号位的进位, Cs−1为最高数值位的进位
- Cs=Cs−1 则溢出
- Cs=0,Cs−1=1 正溢出
- Cs=1,Cs−1=0 负溢出
- 标志位
- 进位标志CF: 无符号数减法时借位, 加法时进位取1, 否则取0
- 溢出标志OF: 有符号数运算溢出
- 零标志ZF: 结果为0取1, 非0取0
- 符号标志SF: 结果为负取1, 结果为正取0
- 硬件实现
- 一位全加器
- 输入: 两个加数位A,B, 进位Cin
- 输出: 和S, 进位Cout
- 串行进位加法器(延迟高)
- 基于补码的串行加法器
- 添加加数的取反器和最低位加1电路
- 执行减法时, 加数通过取反器全部位取反, 并在最低位加1
- 先行进位加法器(延迟低)
- 并行计算各位的进位
- 使用生成进位函数和传递进位函数
- 定点数的乘法 #🤔 考前记
- 无符号数乘法原理
- 将乘法按权展开为若干加法和右移操作
- 当部分积为0时, 可以省略加法操作
- 实现方式
- 没有乘法指令(最慢, 指令周期长)
- 编译器通过循环加法和移位实现乘法
- 即使乘数与被乘数都是变量, 也能够使用基于编译器实现的乘法
- 基于ALU和移位实现的乘法指令(较慢)
- 阵列乘法器(最快, 专有硬件)
- 定点数的除法 #🤔 考前记
- 无符号数除法原理
- 恢复余数法
- 将除法按权展开为若干减法和左移操作
- 每次左移后, 试图用除数去减被减数
- 如果被减数大于等于除数, 商位为1, 并更新被减数
- 否则商位为0, 并恢复被减数
- 因此需要ALU支持减法, 加法和左移操作
- 不恢复余数法
- 与恢复余数法类似, 但不恢复被减数
- 如果被减数小于除数, 则下一次左移前先加上除数
- 除法异常情况 Y2025/T44
- 除数为0: 产生异常中断
- 被除数为最小负数, 除数为-1: 溢出(如-8/-1 = 8, 超出3位补码范围)
- 浮点数运算
- 浮点加减法
- 对阶: 将阶码较小的数的尾数右移, 直到阶码相等(小阶向大阶看齐)
- 尾数加减: 根据符号位决定加法或减法
- 规格化: 调整结果的尾数和阶码, 使其符合规格化表示形式
- 左移规格化: 尾数最高位为0, 左移尾数并减小阶码
- 右移规格化: 尾数溢出, 右移尾数并增大阶码
- {{embed ((69394b42-0e23-4a63-a7be-4d90872fd418))}}
- 舍入: 对规格化后的尾数进行舍入处理,以保证运算结果的精度
- 可能出现尾数溢出, 需再次规格化
- 尾数进位 - 可能引起阶码增1 - 阶码上溢出
- 尾数借位 - 可能引起阶码减1 - 阶码下溢出
- 舍入方法
- 截断法
- 恒置1法
- 0舍1进法
- 最近偶数法: 当舍入位为1且后面有非零位时进1; 当舍入位为1且后面全为0时, 根据舍入位前一位决定进舍
- 考点:
- 两数相加减,可以直接舍弃低阶操作数的情况
- 当阶码之差的绝对值大于尾数位数时(即差>24或53), 低阶操作数的尾数全部右移出范围, 可直接舍弃
- 浮点乘法
- 阶码相加: 将两个操作数的阶码相加, 并减去偏移量Bias
- 尾数相乘: 将两个操作数的尾数相乘
- 规格化和舍入: 对乘积进行规格化和舍入处理
- 乘法指令溢出判断 #🤔 考前记
- 浮点除法
- 阶码相减: 将被除数的阶码减去除数的阶码, 并加上偏移量Bias
- 尾数相除: 将被除数的尾数除以除数的尾数
- 规格化和舍入: 对商进行规格化和舍入处理
- 运算器设计
- 算术逻辑单元ALU
- 寄存器组
- 状态寄存器
- 控制电路
- 数据总线
- 3 存储系统
- 基本概念
collapsed:: true
- 存储器分类
- 按存取方式: 随机存取存储器RAM, 顺序存取存储器SAM
- 按易失性: 易失性存储器, 非易失性存储器
- 按存储介质: 半导体存储器, 磁存储器, 光存储器
- 存储器层次结构
- 存储器性能指标
- 主存储器
collapsed:: true
- 存储芯片分类 #🕳 有坑
- SRAM 静态随机存取存储器
- DRAM 动态随机存取存储器
- 电容
- 行列地址
- 分两次送入地址
- 列选/列选复用地址线, 且由于按行刷新, 应该尽量减少行数
- 行缓冲器使用SRAM实现
- 刷新方式
- 集中刷新: 一次刷新所有行
- 分散刷新
- 把存取周期分成两段, 一段存取数据, 一段刷新行
- 每个存取操作后绑定一个刷新操作
- 异步刷新: 将刷新时间均匀分散到整个刷新周期
- 数据预取
- 读取某行数据时, 将该行数据读入行缓冲器
- 后续对该行的访问直接从行缓冲器读取
- ROM 只读存储器
- 掩模ROM
- 可编程ROM PROM
- 可擦除可编程ROM EPROM
- 电可擦除可编程ROM EEPROM
- SSD 固态硬盘
- 存储器的结构
- 多模块并行存储器
- 单体多字
- 类似存储器的位扩展
- 每次读按同一个地址并行读取不同模块的同一单元
- 多体交叉存储
- 高位交叉方式
- 高位地址决定模块选择, 低位地址决定模块内单元
- 各模块串行工作, 不能提高吞吐量
- 低位交叉方式
- 低位地址决定模块选择, 高位地址决定模块内单元
- 各模块并行工作, 提高吞吐量
- 访存冲突问题
- 模块读取一个单元需要一个读取周期, 如果同时到来第二个请求, 则会产生冲突
- 启动方式问题 #🤔 考前记
- 轮流启动方式(模块字长等于总线宽度时)
- 假设模块存取周期为tm, 总线周期为tb
- 至少需要m=⌈tbtm⌉个模块
- 每隔m1个总线周期启动一个模块
- 可使读取速度提高m倍
- 同时启动方式(所有模块字长之和等于总线宽度时)
- 每个总线周期同时启动所有模块, 读取1个完整的总线宽度数据
- 考点
- 与CPU的接口
- 容量扩展技术
- 位扩展: 增加数据总线宽度
- 字扩展: 增加地址总线宽度
- 字位扩展: 同时增加数据总线和地址总线宽度
- 数据存放(字节序)
- 大端方式: 低地址存放高位字节(MSB)
- 小端方式: 低地址存放低位字节(LSB)
- 机器代码中字节数据也需要按照机器字节序存放
- 数据边界对齐
- 外部存储器
collapsed:: true
- 机械硬盘(温彻斯特硬盘) #🤔 考前记
- 结构组成
- 磁道: 同心圆轨道
- 扇区: 每个磁道划分为若干扇区, 每个扇区存放固定字节数(通常512字节)
- 柱面: 多个盘片叠加形成的柱面组
- 簇: 文件系统分配存储空间的最小单位, 由若干连续扇区组成
- 寻址方式
- 柱面-盘面-扇区
- 磁道-磁头-扇区
- 簇号-簇内地址
- 磁盘性能指标
id:: 693b708a-8e5d-4623-bace-e4ac36835532
- 存取时间
- 寻道时间
- 旋转延迟时间: 平均为半圈时间
- 扇区传输时间: 由数据传输率决定
- SSD 固态硬盘
- 随机访问性能优于机械硬盘
- 读写寿命有限
- 需要磨损均衡技术
- 高速缓存Cache
collapsed:: true
- 读写策略
- 读取过程
- 命中: 直接从Cache读取数据
- 未命中: 从主存读取数据到Cache, 然后再从Cache读取数据
- 写入策略 #🤔 考前记
- 写命中时
- 直写法: 同时更新Cache和主存
- 写回法: 只更新Cache, 只有在替换出Cache时才写回主存
- 写未命中时
- 写分配: 将数据块从主存读入Cache, 然后再写入Cache(通常配合写回法使用)
- 非写分配: 直接写入主存(通常配合直写法使用)
- Cache地址映射
- 直接映射
- 全相联映射
- 组相联映射
- 比较器的位数和个数 #🤔 考前记
- 位数: 映射方式中标记字段
tag的位数
- 个数: 直接映射时为1, 全相联映射时为Cache行数, 组相联映射时为每组行数(路数)
- Cache替换算法
- 先进先出FIFO
- 最近最少使用LRU
- cache行需要增加LRU计数字段, 宽度为log2n位, 其中n为组内行数(路数)
- 最少使用LFU
- 最佳替换OPT
- 随机替换
- Cache分类
- 分离Cache: 数据Cache和指令Cache分开设计
- 好处: 主要目的减少冲突, 还能提高并行度 Y2014/T16
- 多级Cache
- 虚拟存储器
collapsed:: true
- 基本概念
- 虚拟地址(逻辑地址): CPU发出的地址, 为程序在虚拟存储空间中的地址
- 物理地址(实地址): 存储器使用的地址, 为数据在实际存储器中的地址
- 地址转换
- 由内存管理单元MMU完成
- TLB阶段: 根据虚拟地址查找TLB, 在MMU之前
- cache阶段: 根据物理地址访问Cache, 在MMU之后
- 虚拟存储技术
- 通过地址映射和页面置换实现逻辑地址到物理地址的转换
- 允许程序使用比实际物理内存更大的地址空间
- 必须基于非连续存储分配
- 页式虚拟存储
id:: 693b708a-c623-46d8-ba80-1ed4d1d4bd5c

- 页表结构
- 有效位
- 脏位(修改位)
- 页框号
- 访问权限位
- 其他控制位
- 二级页表 #🤔 考前记
-
| 10 位 | 10 位 | 12 位 |
|---|
| 页目录号 | 页表索引 | 页内偏移 |
| 一级页表 | 二级页表 | 物理地址 |
- 优点
- 对于使用较少内存的进程,只需分配 1 个页目录和少量页表,节省内存空间
- 否则每个进程都需要分配完整的页表,需要大量连续内存
- ((693bbee6-f0a9-45f3-8a26-5fddcc38b1e3))
- ((693bbf6b-14e9-44be-9ba7-34324092ac3e))
- 带TLB和Cache的地址转换过程 #🤔 考前记
- CPU生成虚拟地址VA
- MMU将VA分解为虚页号VPN和页内偏移VPO
- MMU检查TLB(根据VPN)
- 命中: 直接得到对应的物理页框号PPN, 跳到物理地址生成阶段
- 未命中: 继续执行
- MMU查页表
- 页表基址寄存器PTBR
- 页表项(PTE)物理地址:
PTBR + VPN * PTE_size
- 检查PTE的有效位和权限位
- 无效或无权限: 触发缺页异常或保护异常
- 有效且有权限: 取出PPN, 更新TLB
- 更新TLB
- 查找页表后, 一旦获得了有效的 PPN, 就将该映射关系加载到 TLB 中
- 物理地址生成阶段
- CPU/MMU检查Cache
- PA被分解为Cache标签Tag, Cache行号Index和块内偏移Offset
- 根据Index访问Cache, 并与Tag比较, 判断命中与否
- MMU使用PA访问主存
- 主存将数据块读取出来, 并送CPU
- 重要
- 同时,该数据块会被加载到 Cache 中, 并更新标志位
- 同时, 依据替换算法, 可能会将某个 Cache 行中的数据块替换出去
- CPU收到数据, 访存结束
- 考点 #🤔 考前记
- TLB命中则页必然命中(页面在主存中)
- 几种缺失类型的具体实现
- cache缺失: 硬件实现
- TLB缺失: 硬件或软件实现
- 页缺失: 软件实现
- 计算页表项的物理地址
- 页表基址寄存器PTBR + 虚页号VPN * 页表项大小PTE_size
- 注意: 页表也存放在主存中, 有些模型下也需要通过虚拟地址访问页表
- 访存时命中/发生缺页中断时的访存次数
- 直接命中时 2次访存
- 发生缺页中断时 4次访存
- 第一次访问页表(发现无效)
- 缺页中断处理(调入页表)
- 第二次访问页表(发现有效)
- 访问数据(仍然可能发生cache缺失 …)
- 缺页中断率和平均存取时间计算
- 设缺页中断率为p, 主存存取时间为m, 缺页中断处理时间为d
- 平均存取时间=(1−p)×2m+p×(d+3m)
- 其中2m为直接命中时的访存时间, 3m为发生缺页中断时的访存时间(具体看题目要求)
- 段式虚拟存储
id:: 693b708a-2c5c-4a3c-ab11-d3557753031b

- 地址结构
- 段表结构
- 段表寄存器(STBR): 存放段表基址
- 共享段
- 多个进程可以共享同一段代码段或数据段
- 共享段的段表项在各进程的段表中均有描述, 段号可能不同, 但段起始地址和段长相同
- 操作系统维护一个全局共享段表, 记录所有共享段的信息以及引用计数
- 4 指令系统
collapsed:: true
- 指令格式
- 一般格式
- 操作码: 指示操作性质及功能
- 地址码: 指示操作数地址或操作数本身
- 寻址方式
- 指令字长 #🕳 有坑
- 定长指令字长
- 不一定等于机器字长, 一定等于指令寄存器IR宽度
- 指令地址空间不一定等于存储器地址空间, 要看PC是按字节还是按指令字长寻址
- 变长指令字长
- 指令地址码字段
- 寻址方式 #🤔 考前记
- 立即寻址
- 直接寻址
- 间接寻址
- 寄存器寻址
- 寄存器间接寻址
- 相对寻址
- 操作数地址由指令中给出的位移量和程序计数器PC的值相加得到
- 形式地址是带符号数
- PC指向下一条指令
- 变址寻址
- EA = (IX) + D, 一般用于数组元素访问
- IX: 变址寄存器 - 无符号数
- 基址寻址
- EA = (BX) + D, 一般用程序重定位
- BX: 基址寄存器 - 无符号数
- 堆栈寻址
- 其他寻址(复合)
- 考点 #🕳 有坑
- 区分题目要求: 操作数还是有效地址EA
- 形式地址的符号
- 直接/间接寻址: 无符号数 - 直接给出主存地址
- 涉及寄存器号: 无符号数 - 给出寄存器号
- 相对寻址/基址寻址/变址寻址: 带符号数 - 给出位移量, 需与寄存器内容相加得到有效地址
- 指令偏移量
- 操作系统至少需要分配的页框数
- 允许一级间址寻址的指令系统 - 3个页框
- 存放当前指令的页框
- 存放操作数的地址(间接地址)的页框
- 存放操作数的页框
- 指令类型
- 数据传送指令
- 算术运算指令
- 逻辑运算指令
- 移位指令
- 控制转移指令 #🕳 有坑
- 条件转移指令
jz, jg, jl 等
- 无条件转移指令
jmp
- 子程序调用与返回指令
call, ret
- 中断与返回指令
int, iret
- 空指令
nop
- 停机指令
hlt
- 考点
- 只要涉及改变PC的指令就会引起 ((6939944e-86f4-4c2c-9aa7-9f6e81abc5bc)) (以上所有指令)
- 转移指令的转移条件
- 无符号数大于
- CF=0且ZF=0(或CF+ZF=1) 相减后不借位且结果非0
- 有符号数大于
- SF=OF且ZF=0 符号位与溢出位共同指示结果为正数(且不为0)
- 输入输出指令
- 堆栈操作指令
- 机器代码表示
- 汇编程序员可见的寄存器
- 程序计数器PC
- 通用寄存器
- 标志寄存器
- 中断字寄存器:存放中断类型, 中断优先级等信息
- 基址寄存器和变址寄存器
- 复杂指令集CISC和精简指令集RISC
- CISC
- 指令集复杂, 指令格式多样
- 确保向后兼容
- 多种寻址方式
- 指令字长可变
- 大多采用微程序控制
- RISC
- 指令集精简, 常用指令数量有限
- 指令长度固定
- 寻址方式简单
- 只允许Load/Store指令访问存储器, 其余指令都在寄存器间操作
- 指令执行时间短, 通常为一个时钟周期
- 一般设置大量通用寄存器
- 通常采用流水线技术
- 采用硬布线控制
- 一般无法实现向后兼容
- 5 中央处理器
- CPU的结构
collapsed:: true
- 运算器 + 控制器 #🤔 考前记
- 运算器
- 算术逻辑单元ALU
- 寄存器组GPRs
- 程序状态字PSW
- 暂存器
- 移位寄存器
- 控制器
- 功能
- 组成
- 程序计数器PC
- 指令寄存器IR
- 指令译码器ID
- 存储器地址寄存器MAR
- 存储器数据寄存器MDR
- 时序系统
- 微操作信号发生器
- 数据通路 + 控制部件
- 指令执行过程
collapsed:: true
- 取指周期
- 控制器固有的功能,不需要操作码的控制
- 自动进行
- 步骤
- MAR ← PC
- MDR ← M[MAR]
- IR ← MDR
- PC ← PC + 指令字长
- 间址周期
- 取出有效地址EA
- 步骤
- MAR ← 有效地址EA (来自IR地址码字段)
- MDR ← M[MAR]
- EA ← MDR
- 执行周期
- 中断周期
- 当CPU检测到中断请求时才进入
- 如果中断屏蔽字屏蔽了该中断请求, 那么CPU是收不到该中断请求的
- {{embed ((693990d4-a3bd-4cbf-90f2-cd21aedce7d4))}}
- 指令执行方案 #🤔 考前记
collapsed:: true
- 单周期CPU
- CPI = 1
- 每条指令在一个时钟周期内完成, PC在每个时钟周期末更新(无须暂存器保存PC值)
- 多周期CPU
- 流水线CPU
- 超标量流水线CPU
- 数据通路
collapsed:: true
- 定义: 数据在指令执行的过程中所经过的路径,包括路径上的部件,称为数据通路
- 组成
- ALU
- 通用寄存器组GPRs
- 状态寄存器PSW
- 异常和中断处理逻辑等
- 注意
- 数据通路由控制部件控制
- 单总线数据通路所有寄存器共享一条总线, 同一时间只能有一个寄存器向总线输出数据
- CPU的读写信号线控制MDR与存储器之间的数据传输方向
- 区分内部总线(CPU内部寄存器之间的数据传输)和外部总线(CPU与存储器或I/O设备之间的数据传输)
- 单总线方式
- 多总线方式
- 操作举例
- 从主存读指令到IR
- MAR ← (PC) // PCout, MARin
- MDR ← M[MAR] // Read, MDRin
- IR ← (MDR) // MDRout, IRin
- 将寄存器R1的内容写入R2指向的主存地址
- MAR ← (R2) // R2out, MARin
- MDR ← (R1) // R1out, MDRin
- M[MAR] ← (MDR) // Write, MDRout, MARout
- 执行加法运算 R3 ← R1 + R2
- Y ← (R1) // R1out, Yin
- ALU ← Y + (R2) // R2out
- Z ← (ALU) // ALUop=+, Zin
- R3 ← (Z) // Zout, R3in
- 控制器的功能原理
collapsed:: true
- 主要功能
- 从主存取出指令, 并指示下一条指令的地址
- 对指令进行译码, 产生相应的控制信号
- 指挥并控制CPU, 主存和I/O设备之间的数据流向
- 硬布线控制器
- 控制单元CU对IR的操作码进行译码, 产生相应的控制信号
- 由组合逻辑电路实现
- 优点: 执行速度快
- 缺点: 灵活性差, 难以实现复杂指令集
- 微程序控制器
- 基本概念
- 微程序
- 每条机器指令对应的一个微程序
- 微程序是微指令的有序集合
- 相当于一个针对机器指令的实时解释器
- 微指令和微周期
- 微指令: 微程序中包含若干微指令, 微指令是若干微命令的集合
- 操作控制字段(微操作码)
- 顺序控制字段(微地址码)
- 微周期: 取出并执行一条微指令所需的时间, 通常为一个时钟周期
- 微命令和微操作
- 微命令: 控制部件向执行部件发出的控制命令, 是控制序列的最小单位
- 互斥型微命令: 不能同时执行的微命令
- 相容性微命令: 可以同时执行的微命令
- 微操作: 执行部件收到微命令后执行的对应操作
- 控制存储器CM #🤔 考前记
- 位于CPU内部, 存放微程序, 用ROM实现
- 微指令地址寄存器CMAR或μPC
- 下地址的宽度对应CMAR的宽度(决定微指令地址空间)
- 微指令寄存器CMDR或μIR
- 区分主存储器MEM(位于CPU外部, 用RAM实现, 存放用户程序和数据)
- 微指令的编码方式 #🤔 考前记
- 直接编码
- 字段编码
- 微指令的微命令字段被划分为若干子字段, 每个子字段表示一组微命令中的某一微命令
- 分段方法
- 互斥型微命令放在同一子字段
- 相容性微命令放在不同子字段
- 每个子字段还要保留全0码, 表示不执行任何微命令
- 字段间接编码
- 微指令格式 #🤔 考前记
- 水平型微指令
- 操作控制字段
- 定义和执行多个微命令(并行)
- 每个字段存放互斥的微命令
- 顺序控制字段
- 定义下一条微指令地址
- 包括下地址字段, 条件转移字段等
- 垂直型微指令
- 一条微指令只定义一个微命令(串行)
- 微操作码字段/目的地址/源地址等
- 微指令地址形成方式 #🤔 考前记
- 根据后继地址字段(下地址断定法)
- 增量计数器法, 即通过μPC加1实现顺序执行
- 根据机器指令译码后微程序的入口地址确定
- 根据条件转移微指令的条件判定结果确定
- 中断和异常机制
collapsed:: true
- 异常(内部中断)
- 由CPU在执行指令过程中自动产生
- 例如: 内存缺页, 除0错误, 越界访问, 非法指令等
- 分类
- 任何时候只要出现异常, CPU就会进入中断处理周期
- 中断(外部中断)
- 由I/O设备或其他外部事件引起
- CPU每执行完一条指令后检查中断请求, 若有则进入中断处理周期
- 中断分类
- 屏蔽性
- 可屏蔽中断
- 通过INTR引脚请求中断
- 可通过设置中断屏蔽字屏蔽该类中断
- 不可屏蔽中断
- 通过NMI引脚请求中断
- 不能被屏蔽, 通常用于紧急情况如电源故障
- 软硬中断
- 中断响应时机 #🤔 考前记
- 异常: 立即响应, CPU在执行指令过程中检测到异常时立即响应
- 处理完成后
- 返回异常发生的指令处重新执行该指令, 如缺页异常
- 返回下一条指令处继续执行, 如除0错误, trap等
- 中断: 当前指令执行完后响应
- CPU响应中断的条件
- 中断请求信号有效
- 中断未被屏蔽
- 全局中断允许标志置位
- 处理完成后返回下一条指令处继续执行
- DMA请求: 在一个总线事务完成后响应
- 中断响应过程 #🤔 考前记
id:: 693990d4-a3bd-4cbf-90f2-cd21aedce7d4
- 异常和中断检测由硬件实现, 响应过程不可打断
- 中断隐指令(硬件)
- 真题答案中关于隐指令的描述
- 将断点和程序状态保存到内核栈或特定寄存器中,关中断,最后跳转到内核中的异常处理程序执行
- 关中断
- 保存断点和程序状态
- 识别中断类型并转到中断处理程序
- 中断向量表: 存放各类中断处理程序入口地址
- 存放于内核空间, 由整个操作系统共享
- 本质是一个指针, 指向函数指针数组
- 中断向量号即数组的索引
- 操作系统中断处理程序(软件)
- 考点
- 中断相关寄存器
- 中断允许寄存器:用于开、关中断。
- 中断向量寄存器:存储中断服务程序的入口地址。
- 中断屏蔽寄存器:用于屏蔽特定的中断请求,防止其被处理。
- 中断请求寄存器:用于记录当前的中断请求状态。
- 指令流水线
collapsed:: true
- 性能指标
- 流水线周期时间
- 流水线吞吐率
- 流水线加速比
- 流水线效率
- 流水线结构
- 数据通路
- 控制部件
- 流水线寄存器
- 包括后面流水段要用到的所有数据信息
- 包括后面流水段要用到的所有控制信号
- 流水线执行过程
- 典型的五段流水线
- IF 指令取指
- ID 指令译码和寄存器读
- EX 执行或地址计算
- MEM 访存操作
- WB 写回寄存器
- 涉及访存的指令周期 #🕳 有坑
- IF/MEM: 取指, 访存阶段会访问存储器
- ID/WB: 寄存器读写, 不涉及访存
- 流水线的冒险处理 #🤔 考前记
- 结构冒险(资源冲突)
- 前一指令的某个阶段与后一指令的某个阶段争用同一硬件资源
- 解决方法
- 前一指令访存时, 使后一指令暂停一个周期
- 超标量流水线设计中设置多个独立部件
- 数据冒险
- 指令间存在数据相关性, 导致后一指令在前一指令的结果尚未写回时就需要使用该结果
- 按序执行流水线
- 乱序执行流水线
- 存在写后读RAW, 写后写WAW, 读后写WAR冲突
- 解决方法
- 流水线暂停: 通过插入空指令(延迟)使后一指令等待
- 数据旁路转发: 将前一指令的结果直接转发给后一指令, 而不必等到写回阶段
- load-use冒险特殊处理: 对于load指令, 需要延迟 + 转发技术解决
- 考点:
- 上一条命令阻塞, 下一条命令的 IF 必须与上一条命令的 ID 一起执行(资源冲突)
- 对于五段式流水线, 若指令A,B之间存在数据冒险, 且指令B需要使用指令A的结果, 则需要多少个气泡? #🕳 有坑
- 前半周期写寄存器堆, 后半周期读寄存器堆(前一个指令的WB与后一个指令的ID在同一时钟周期)
- 不支持该特性

- 不是所有冒险都能通过转发解决
- RAW冒险可以通过转发解决
- load-use冒险需要延迟 + 转发解决
- 控制冒险必须通过流水线暂停或分支预测解决
- 控制冒险
id:: 6939944e-86f4-4c2c-9aa7-9f6e81abc5bc
- 由于分支指令改变了程序的执行顺序, 导致流水线无法确定下一条指令的地址
- 只要涉及改变PC的指令就会引起控制冒险
- 解决方法
- 流水线暂停: 在分支指令执行期间暂停流水线
- 分支预测: 预测分支指令的结果, 提前加载可能的下一条指令
- 高级流水线技术
- 超标量流水线
- 同时发射多条指令, 需要多个处理部件
- 不能缩短单条指令的执行时间, 能提高单位时间内的指令吞吐率
- 超长指令字流水线(静态多发射)
- 将多条指令打包成一条超长指令字, 同时发射多条指令
- 挖潜潜在的并行性
- 超流水线技术
- 多处理器系统 #🤔 考前记
collapsed:: true
- 计算机体系结构分类(指令流和数据流)
- SISD 单指令流单数据流
- SIMD 单指令流多数据流
- 一个指令流控制多个处理单元同时执行相同的指令, 但操作不同的数据
- 向量处理器和阵列处理器
- MISD 多指令流单数据流
- MIMD 多指令流多数据流
- 多个处理单元同时执行不同的指令流, 操作不同的数据流
- 多处理器系统和多核处理器
- SIMD和MIMD都是并行的计算模式
- 硬件多线程
- 每个线程都有单独的通用寄存器组, 程序计数器
- 线程切换开销小(无须实际数据交换, 只需切换寄存器组)
- 不必是多核处理器, 单核处理器也可以实现
- 多核处理器
- 多个处理核心集成在同一芯片上
- 每个核心有独立的运算器和寄存器组
- 共享一级Cache或二级Cache
- 共享内存处理器SMP(对称多处理系统 Symmetric Multiprocessor)
- 共享单一物理地址空间的多处理器系统
- 通过总线连接多个处理器和主存
- 分类
- 统一存储访问UMA
- 非统一存储访问NUMA
- 不同处理器访问主存的时间不同, 某些处理器访问某些内存块的速度更快
- 6 总线
collapsed:: true
- 分类
- 按功能
- 片内总线: CPU内部总线
- 系统总线: CPU与存储器和I/O设备之间的总线
- 按传输内容
id:: 69399760-279d-49cd-8593-287515b0f1fd
- 数据总线
- 地址总线
- 控制总线
- 双向
- CPU发出读写信号, 存储器和I/O设备响应
- I/O总线: 连接I/O设备和系统总线
- 专用总线: 如PCIe总线, USB总线等
- 按时序
- 按数据传输方式
- 串行总线
- 并行总线
- 多位数据同时传输
- 适用于短距离传输
- 不一定速度更快, 受限于时钟频率和信号完整性
- 系统总线结构
- 单总线
- 多总线
- 双总线结构
- 三总线结构
- 总线之间通过桥接器连接
- 越靠近 CPU 的总线速度越快
- 总线的性能指标 #🕳 有坑
- 总线周期
- 一次总线传输所需的时间, 由若干个总线时钟周期组成
- 包括申请阶段, 寻址阶段, 数据传输阶段和总线释放阶段
- 总线时钟周期
- 总线工作频率
- 总线周期的倒数
- 为单位时间内总线实际发生传输的次数, 不要与总线时钟频率混淆
- 如DDR3总线, 在时钟上升沿和下降沿都传输数据, 总线时钟频率为800MHz, 但总线工作频率为1600MHz
- 如PCIe总线, 本身串行, 通过多通道技术提高总线工作频率, 有多少通道, 总线工作频率就提高多少倍
- 总线宽度
- 总线带宽
- 理想条件下总线的最大传输速率
- 计算公式:
总线带宽 = 总线宽度 × 总线工作频率
- 总线数据传输方式
- 突发传输
- 一次总线传输中连续传输多个数据单元
- 优点: 提高总线利用率, 减少寻址开销
- 非突发传输
- 总线定时
- 同步总线定时
- 由统一的时钟信号控制数据传输
- 传输双方在时钟上升沿或下降沿进行数据采样
- 异步总线定时
- 通过握手信号控制数据传输
- 分类
- 不互锁式
- 发送方发送数据后立即释放总线, 不等待接收方确认
- 速度快, 但可靠性差
- 半互锁式
- 全互锁式
- 发送方发送数据后等待接收方确认, 接收方处理完数据后发送完成信号, 发送方收到完成信号后释放总线
- 可靠性高, 但速度慢

- 7 输入输出系统
collapsed:: true
- IO接口(I/O 控制器)
- 基本功能
- 数据缓冲
- 状态控制
- 地址解码
- 数据格式转换: 串并转换, 码制转换等
- 传送控制命令和状态信息
- IO端口
- 可被CPU直接访问的寄存器
- 分类
- 数据端口: 存放数据
- 状态端口: 存放设备状态信息
- 控制端口: 存放控制命令
- 状态端口和控制端口可以共用一个寄存器
- 通过方向区分
- 读端口: CPU从IO设备读数据或状态信息
- 写端口: CPU向IO设备写数据或控制命令
- 考点
- ASCII 异步串行传输
- 起始位: 1位, 数据位: 7或8位, 奇偶校验位: 0或1位, 停止位: 1或2位
- 一般会要求计算有效数据传输率(不含起始位, 停止位, 校验位等开销)
- IO接口的编址方式
- 统一编址
- IO设备和存储器共享同一地址空间
- 通过普通访存指令进行IO操作
- 独立编址
- IO设备和存储器有独立的地址空间
- 通过专门的IO指令进行IO操作
- IO方式
- 程序查询方式
id:: 693b708a-8e30-4be1-8e8f-f1d0a6ca4c47
- CPU通过轮询方式检查IO设备状态
- 简单但效率低下
- 两种查询方式
- 程序中断方式
id:: 693b708a-9326-4c78-aa6d-2940ceabd813
- IO设备数据准备完成后通过中断请求通知CPU进行IO操作
- 提高CPU利用率
- 中断处理过程
- 中断请求
- 中断判优
- 响应优先级: 硬件确定, 不可修改
- 处理优先级: 通过设置中断屏蔽字确定, 可修改
- 中断响应
- 响应条件: 中断请求有效且未被屏蔽, 无更高优先级中断请求或不可屏蔽中断请求正在处理
- 中断处理
- 中断返回
- CPU执行中断返回指令, 恢复现场, 继续执行被中断程序
- 多重中断(中断嵌套)
- 允许在执行一个中断服务程序时,响应一个优先级更高的新中断请求
- 实现方式
- 执行中断服务程序时, 保护现场后重新开启中断
- 中断返回之前, 恢复现场并关闭中断

- DMA方式(直接存储器访问)
id:: 693b708a-1d58-4146-8ef6-e3505e2c3df9
- 一种完全由硬件 (DMA 控制器, DMAC) 进行成组信息传送的控制方式
- 是一种以存储器为中心的高速数据传送方式 #🤔 考前记
- DMA控制器 (DMAC接口)
- 组成
- 主存地址寄存器(DAR): 存放主存地址, 传送时自动递增/减
- 传送长度寄存器(WC): 存放传送字节数, 传送时自动递减
- 数据缓冲寄存器(DR): 存放传送数据
- DMA请求触发器(DRQ): 接收IO设备的DMA请求信号
- DMA传送过程
- 预处理阶段
- 数据传送阶段
- DMA控制器发出总线请求信号(BRQ)
- CPU响应总线请求, 发出总线授权信号(BG)
- DMA控制器进行数据传送
- 重复上述步骤, 直到传送完成
- 后处理阶段
- DMA控制器发出传送完成中断请求(DRQ)
- CPU响应中断请求, 执行DMA传送完成处理程序
- DMA传送方式
- 猝发模式(停止CPU访问)
- 周期挪用
- 每次只请求传送一个字, 传送后释放总线, 允许CPU访问总线
- 透明模式(DMA与CPU交替工作)
- DMA控制器在CPU不使用总线时进行传送, 不影响CPU工作
- 通道控制方式
