操作系统与并发¶
本页整理操作系统、并发、虚拟内存和指令流水线基础。内容来自本地速记的通用计算机知识补充,具体教材口径待核验。
1. 进程、线程与运行状态¶
进程是资源分配的基本单位,线程是 CPU 调度的基本单位。同一进程内线程共享代码段、数据段和打开的文件等资源,但每个线程拥有独立的栈和程序计数器。
系统调用会引发用户态到内核态的切换,例如文件读写、创建进程、网络通信和内存申请。频繁系统调用可能带来上下文切换开销,实际开销取决于处理器、操作系统和调用路径。
2. 虚拟内存分页与 TLB¶
分页把进程虚拟地址空间划分成固定大小的页,把物理内存划分成同样大小的页框。程序页可以装入不连续的物理页框,页表维护“虚拟页号 → 物理页框号”的映射,并记录存在位、权限位和修改位等状态。分页可消除外部碎片,但最后一页未用满时可能产生内部碎片。
虚拟地址通常拆为“虚拟页号 + 页内偏移量”。页内偏移在转换前后保持不变:
页大小为 4 KB 时,页内偏移需要 12 位,因为 4 KB = 2^12。快表 TLB 是处理器中缓存近期 VPN→PFN 映射的高速小型缓存,不是整个进程或磁盘数据。
地址转换流程:CPU 产生虚拟地址后先查 TLB;命中则直接取得物理页框号;未命中则查内存中的页表;若页表表明页面不在内存,才发生缺页异常,由操作系统从后备存储调入页面,必要时置换页面,再重新执行指令。
TLB 未命中不等于缺页:前者只表示快表没有映射,页面可能仍在内存;后者表示页表也表明页面不在物理内存。页表通常保存在主存,TLB 容量较小但速度更快,利用访问的时间局部性和空间局部性降低地址转换开销。进程切换时是否刷新 TLB 或使用 ASID,取决于处理器机制,待核验。
3. 页面置换¶
请求分页中,页面在访问且不在内存时才调入。缺页且没有空闲页框时需要选择页面换出:
- FIFO:先进先出,可能出现 Belady 异常;Belady 异常是某些页面置换算法中分配页框增加后缺页次数反而增加的现象,并非 FIFO 独有。
- LRU:淘汰最近最少使用页面。
- OPT:淘汰未来最长时间不会使用的页面,理论最优但实际无法准确预知未来。
- Clock:利用访问位和循环指针近似 LRU;具体访问序列和实现规则下也可能出现异常,不能简单断言 CLOCK 绝不会出现 Belady 异常。
页面置换算法与 TLB 项替换策略不是同一个问题。分页的代价包括页表占用内存、地址转换开销、页内内部碎片,以及缺页时磁盘 I/O 的高成本。
4. CPU 作业调度:HRRN 响应比¶
HRRN(Highest Response Ratio Next,最高响应比优先)是一种非抢占式作业调度算法。每次 CPU 空闲时,计算所有已到达且尚未运行作业的响应比,选择响应比最高的作业运行。
- 等待时间:作业已在就绪队列中等待的时间。
- 服务时间:预计需要的 CPU 执行时间(题目也可能称运行时间)。
- 响应比:无量纲,数值越大,优先级越高。
例子:作业 A 等待 8 ms,需运行 4 ms,响应比为 (8+4)/4=3;作业 B 等待 2 ms,需运行 2 ms,响应比为 (2+2)/2=2,因此先运行 A。短作业的服务时间较小,通常更容易取得较高响应比;作业等待越久,响应比也越高,所以 HRRN 兼顾短作业优先和避免长时间饥饿。作业开始运行后通常不会被 HRRN 抢占。
为什么需要 HRRN:单纯的先来先服务可能让短作业排在很长的作业后面,平均等待较久;单纯的短作业优先则可能让长作业一直被新来的短作业挤到后面,发生饥饿。HRRN 用等待时间逐渐提高作业的响应比,给等待久的作业增加机会;与此同时,服务时间较短的作业仍有优势。它是在平均等待效率与公平性之间折中,不是保证所有作业都最优,也不消除非抢占调度带来的等待。
5. 磁盘访问:寻道时间、旋转延迟与传输时间¶
传统磁盘读取一个目标扇区的数据,通常经历:
- 寻道(seek):磁头臂移动,使读写磁头到达目标磁道;这一步磁头在移动。
- 旋转等待(rotational latency):盘片旋转,使目标扇区转到磁头下方;这一步盘片在转。
- 数据传输(transfer):目标扇区经过磁头时读出或写入数据。
这里的“道”是磁道(track):盘片表面上以旋转轴为中心、半径不同的一圈圈同心圆轨迹;磁道再被划分为扇区(sector),扇区是磁盘读写与定位常用的区块单位。不同盘面上半径相同的一组磁道通常称为柱面(cylinder)。
因此,寻道时间只计算磁头臂移动到目标磁道所花的时间,不是扇区旋转的时间。盘片转到目标扇区所需的时间叫旋转延迟。为什么要先寻道?因为目标磁道可能与磁头当前所在磁道不同,必须先把磁头移到该磁道;之后盘片持续旋转,直到目标扇区来到磁头下。磁盘访问时间的简化分解为:
例子:要读第 20 磁道上的某个扇区,磁头原来在第 5 磁道。先移动磁头臂从第 5 道到第 20 道(寻道),再等待盘片旋转到目标扇区(旋转延迟),最后传输数据。固态硬盘没有机械磁头和旋转盘片,因此不使用传统意义上的寻道时间和旋转延迟。
6. 内部碎片与外部碎片¶
碎片指可用内存因分配方式而不能充分利用的部分。关键区别是:浪费空间在已分配区域内部,还是散落在已分配区域之间。
| 类型 | 空间在哪里 | 常见原因/例子 | 典型处理方向 |
|---|---|---|---|
| 内部碎片 | 已分给某进程或对象的区域内部,但没有被实际使用 | 固定分区分配了 8 KB,进程实际只用 6 KB;分页时最后一页未占满 | 减小分配单位可减少,但通常难以完全消除 |
| 外部碎片 | 多个已分配区域之间,空闲空间分散成小块 | 空闲区总计 10 KB,但分散为 2 KB、3 KB、5 KB,无法满足一个连续 8 KB 请求 | 可通过紧凑/碎片整理合并空闲区;分页允许非连续页框分配,可避免外部碎片 |
判断口诀:分到的块“里面”没用满,是内部碎片;空闲块“外面”零散不连续,是外部碎片。分页消除外部碎片,但最后一页可能仍有内部碎片。
描述视角:在操作系统基础题中,内外部碎片最常见的确是针对主存(物理内存)的内存分配来讲,例如固定分区、动态分区和分页。但它不是“只能用于物理内存”的术语:只要存在“按固定大小/固定边界分配空间”或“空闲空间分散”的分配过程,也可以讨论碎片。判断时先看题目对象:若对象是页框、分区、堆内存,就是内存管理语境;若对象是文件系统块、磁盘空间或内存分配器,则是在对应存储/分配器语境下描述。
7. 死锁¶
死锁的四个必要条件必须同时成立;只要破坏其中任意一个,就能预防死锁:
- 互斥(Mutual exclusion):至少有一种资源一次只能被一个进程使用。例如打印机不能同时服务两个进程。
- 请求并保持(Hold and wait):进程已经占有至少一个资源,又请求其他资源,并在等待时继续占有已得到的资源。
- 不可剥夺(No preemption):资源不能被系统强行从占有者手中夺走,只能由进程使用完后主动释放。
- 循环等待(Circular wait):存在进程和资源的环形等待链,例如 P1 等 P2 持有的资源,P2 又等 P1 持有的资源。
小例子:P1 持有打印机并等待扫描仪,P2 持有扫描仪并等待打印机。若资源不可抢占,二者互相等待,就形成循环等待;同时资源互斥、进程请求并保持,四个条件齐备,可能死锁。
易错点:这四项是死锁发生的必要条件,不是说满足其中一项就一定发生死锁;要四项同时成立。破坏循环等待的常见办法是规定所有进程按统一顺序申请资源,避免形成环。
处理方法包括:破坏必要条件的死锁预防;使用银行家算法的死锁避免;允许发生后检测并恢复;在特定系统中选择忽略。具体系统是否采用忽略策略待核验。
8. 进程通信与并发¶
常见进程通信方式有管道、消息队列、共享内存、信号量和 Socket。共享内存速度快,但多个执行流同时访问时需要配合锁或信号量解决互斥和同步问题。并发题应区分资源共享、临界区、同步关系和通信方式,不能把线程共享地址空间误认为自动保证数据一致性。
内存分段:按逻辑意义组织地址空间¶
分段把进程地址空间按程序的逻辑结构划分成若干长度可变的段,例如代码段、数据段、堆段和栈段。逻辑地址通常表示为“段号 + 段内偏移”;段表根据段号找到该段在物理内存中的起始地址和段长,再检查偏移是否越界,最后计算物理地址:
为什么分段:
- 符合程序员的逻辑认识:代码、数据、栈本来就是不同的逻辑模块。
- 便于保护和共享:代码段可以设置为只读并被多个进程共享,数据段可以设置为可读写,某个段也可以单独设置权限。
- 便于动态增长:栈和堆可以作为不同段管理,不必把整个进程当成一个整体搬移。
- 支持模块化:程序模块可以按段装入、重定位和共享。
分段的代价是段长可变,经过多次装入和释放后,空闲空间之间容易形成外部碎片;分页使用固定大小页框,更利于消除外部碎片,但不如分段直接表达程序逻辑。现代系统常使用段页式或以分页为主、分段功能较弱的机制。
中断向量与中断向量表¶
- 中断向量:一个具体中断类型对应的处理入口信息,最核心的是中断服务程序的入口地址;有些体系结构中还包含代码段选择子、权限或其他描述信息。它回答“发生这种中断后,应该跳到哪里处理”。
- 中断向量表(IVT):按中断类型号组织起来的中断向量集合,通常放在内存的规定区域或由寄存器指向。它回答“所有中断类型与处理入口的对应关系在哪里”。
可以类比通讯录:中断向量是一条联系人记录;中断向量表是整本按编号排列的通讯录。设备发出中断请求后,CPU 根据中断类型号查表,取得对应中断向量,保存必要现场并转去执行中断服务程序;处理完成后恢复现场并返回被中断程序。
易混点:中断向量不是中断信号本身,也不是中断向量表。中断信号表示“有事件需要处理”;中断类型号用于定位表项;中断向量提供处理入口;中断向量表集中保存这些入口信息。现代保护模式系统常使用中断描述符表(IDT),它承担类似的按中断号查找处理入口的作用。
9. 指令流水线¶
指令流水线把一条指令拆成多个阶段并让多条指令的不同阶段重叠执行,经典五段为:取指 IF → 译码 ID → 执行 EX → 访存 MEM → 写回 WB。流水线主要提高整体吞吐率,不一定缩短单条指令经过全部阶段的实际延迟。
流水线冒险¶
| 冒险类型 | 原因 | 例子 | 主要对策 |
|---|---|---|---|
| 结构冒险 | 多条指令争用同一硬件资源 | 取指和访存同时使用同一存储器 | 增加或分离资源,如指令 Cache 与数据 Cache 分开 |
| 数据冒险 | 后一条指令需要前一条尚未写回的结果 | ADD 产生 R1,后续 SUB 立即使用 |
转发/旁路、停顿、调整指令顺序 |
| 控制冒险 | 分支或跳转改变执行流 | 条件结果确定前已取入顺序指令 | 分支预测、尽早计算分支结果 |
RAW(写后读)是按序流水线中最常见的数据冒险。转发是主要解决手段,但 LW 后紧跟使用加载结果时,加载结果通常到 MEM 阶段结束才产生,下一条指令可能来不及使用,常仍需插入一个停顿周期;具体流水线实现待核验。
控制冒险可用静态或动态分支预测、延迟分支等方式处理。预测正确时流水线继续运行,预测错误时清除错误路径指令并从正确目标重新取指。
流水线性能计算¶
设有 k 个阶段,每阶段耗时近似为 t,共有 n 条指令:
- 非流水线时间:
n × k × t。 - 流水线时间:
(k + n - 1) × t。 - 稳态吞吐率约为
1/t条/周期。 - 加速比:
nkt / [(k+n-1)t],当n很大时接近k,但不会超过阶段数。
5 段流水线执行 10 条、每段 1 周期的指令,非流水线为 50 周期,流水线为 14 周期,加速比约 3.57,而不是 5,因为需要装入和排空流水线。
流水线阶段划分、停顿周期和分支预测代价依 CPU 实现与题设而异,遇到计算题应以题设为准。
考前易错速记¶
分页地址由“虚拟页号 + 页内偏移”组成,页表把虚拟页号映射为物理页框号,偏移保持不变。TLB 未命中只表示快表无映射,不等于缺页;页表发现页面不在内存时才发生缺页异常。Belady 异常是增加页框后缺页次数反而上升,不应表述为 FIFO 独有;FIFO 可能出现,CLOCK 在某些实现和访问序列下也可能出现。LRU 淘汰最近最少使用页,OPT 理论最优但需预知未来。
进程是资源分配单位,线程是 CPU 调度单位。流水线冒险分为结构、数据和控制冒险;可分别考虑资源分离、转发/停顿及分支预测。k 段流水线执行 n 条指令、每段耗时 t 时,理想耗时约为 (k+n−1)t,性能提升主要体现在吞吐率而非单条指令延迟。
来源:专业课速记/09_考前必背清单.md
10. 存储器扩展与硬件基础¶
以下为依据第一批 OCR 练习题补充的通用知识,并非原题官方解析;原始记录保留在独立错题本中。
字扩展与位扩展¶
存储器规格写作“存储单元数量 × 每个单元的位数”。字扩展增加单元数量,位扩展增加单元位数,二者都能增加总容量,但改变的维度不同。
1K × 8 → 4K × 8:字扩展,用 4 片芯片经片选译码选择其中一片;单元数量增加,字长仍为 8 位。1K × 8 → 1K × 16:位扩展,用 2 片共用地址、并行提供高低各 8 位;单元数量不变,数据位宽增加。- 字扩展不意味着读写速度必然提高,也不是增加每个存储字的长度。
IEEE 754 浮点数字段¶
| 格式 | 总长度 | 符号 | 阶码 | 尾数/小数字段 | 偏置 |
|---|---|---|---|---|---|
| binary32 单精度 | 32 位 | 1 | 8 | 23 | 127 |
| binary64 双精度 | 64 位 | 1 | 11 | 52 | 1023 |
对规格化有限非零数:值 = (-1)^s × (1.f)₂ × 2^(E-偏置)。单精度存储的小数字段是 23 位,加上隐含最高位 1,有效精度为 24 个二进制位。阶码全 0 或全 1 时需按非规格化数、零、无穷大、NaN 的特殊规则解释,不能直接套用此式。浮点加减通常依次进行对阶(调整较小阶码并右移尾数)、尾数加减、规格化、舍入和溢出/下溢处理;对阶会损失低位精度,具体保留位数、保护位和舍入方式以题设或 IEEE 754 模式为准。浮点运算不能只把指数和尾数分别相加,运算后还要重新规格化并检查特殊值。
多体交叉存储器¶
把主存组织为多个可独立工作的存储体,以交错、重叠访问提高连续数据的吞吐带宽,而不是保证单次访问延迟变小。
例如 4 体低位交叉中,按字编址的连续地址 0、1、2、3 分别映射到体 0、1、2、3;访问体 0 后,可以在它的存取周期尚未结束时启动对体 1 的访问。高位交叉的连续地址可能集中在同一体中。收益受访存模式、总线和存储体冲突限制。
Cache 经典 3C 缺失¶
| 类型 | 定义 | 例子 |
|---|---|---|
| 强制缺失 Compulsory | 第一次访问某内存块导致的缺失 | 冷启动后第一次读取该 Cache 行 |
| 容量缺失 Capacity | 工作集超过容量,即使全相联也不足 | 反复扫描远大于 Cache 的数组 |
| 冲突缺失 Conflict | 映射约束使数据块互相替换 | 直接映射 Cache 中两块交替争用同一行 |
“传输缺失”不属于经典 3C。多核还会讨论一致性缺失等扩展类别,所以“3C”不是所有体系结构中唯一的分类体系。强制缺失按块首次访问判断,不是数组每个元素都必然缺失。
11. 异步性与 MMU 辨析¶
操作系统异步性¶
异步性强调进程因调度、资源竞争和 I/O 等原因,以不可预知的速度走走停停地推进,不是说“必须在多核同时执行”。单核上任务交替运行是并发,多核同一时刻执行是并行;异步性强调推进时机的不确定性。
例如两个进程分别等待磁盘与网络,同一程序运行两次,I/O 完成和再次获得 CPU 的先后顺序可能不同。这并不意味着同步约束失效,程序仍要用锁、信号量等保证必要顺序。
MMU 与地址转换¶
MMU(内存管理单元)负责地址转换和权限检查,配合页表与 TLB 把虚拟地址映射为物理地址。Cache 缓存数据/指令,DMA 负责设备与内存的数据传送,中断控制器负责中断管理,均不能替代 MMU 的作用。
例如页大小为 4096 字节,虚拟页 5 映射到物理页框 12,页内偏移为 100,则物理地址为 12×4096+100=49252。若页面尚未驻留,硬件触发缺页异常,操作系统负责调页,MMU 不会自行读取磁盘。未映射或越权访问还可能属于非法访问,不是所有“无效页面”都能通过调页修复。
12. 计算机系统组成、层次与性能¶
以下按所列大纲主题补充基础学习正文,用于建立概念、计算和过程链;不代表官方命题解释。计算题中的位宽、编址单位、缓存策略和设备时序均以题设为准。
系统组成与程序执行层次¶
计算机系统由硬件系统和软件系统组成。经典硬件五大部件是运算器、控制器、存储器、输入设备和输出设备;现代 CPU 通常集成运算器、控制器、寄存器及若干级 Cache。软件分为操作系统、编译器等系统软件,以及面向业务的应用软件。固件也是程序,不因存放在 ROM 或 Flash 中就变成纯硬件。
存储程序思想:把指令和数据以编码形式存入存储器,处理器按程序计数器指示取出指令、译码并执行,分支指令可以改变执行顺序。指令与数据的位串本身不带天然身份,CPU 的取指路径、指令解释和访问权限决定其用途。指令 Cache 与数据 Cache 分开,不等于整机必须是纯哈佛结构。
ISA 规定软件可见的指令、寄存器、数据类型和寻址规则;微体系结构决定流水线、执行单元、缓存等具体实现。相同 ISA 的 CPU 可以使用不同实现,因此“能运行同一机器码”不意味着性能相同。解释执行、即时编译等执行路径不一定先生成独立的可执行文件。
可复核样例 1:一次程序运行的过程链。以编译型程序读取文件并求和为例:① 编译器将求和逻辑翻译为机器指令,链接器组织可执行文件;② 操作系统装入/映射程序并建立地址空间;③ CPU 取指,ALU 执行加法;④ 程序通过读文件系统调用请求内核服务;⑤ 内核检查权限并经文件系统、驱动取得数据,数据也可能已在内存缓存;⑥ 返回用户程序继续计算。编译器不是运行时每条加法的执行者,磁盘也不是每次读取都必须访问。
性能指标与计算口径¶
- 响应时间/延迟:完成一次任务所需的时间;吞吐率:单位时间完成的任务数量。流水线、批处理常提升吞吐率,但不保证单个请求更快。
- 主频:每秒时钟周期数;CPI:平均每条指令所需周期数;IPC:每周期完成的指令数。统一统计范围且 CPI 非零时,平均 IPC 为平均 CPI 的倒数,超标量处理器的 IPC 可以大于 1。
- CPU 执行时间:
指令数 IC × 平均 CPI ÷ 主频 f。实际经过时间还可能包含 I/O 等待、排队等,不能直接等同于 CPU 时间。 - 加速比:
改进前时间 ÷ 改进后时间。若原时间中比例 p 的部分加速 s 倍,则总加速比为1 / [(1-p)+p/s],即 Amdahl 定律。
可复核样例 2:主频与 CPI 对比。同一任务在 A 上执行 10^8 条指令,CPI 为 2,主频为 2 GHz,则 CPU 时间为 10^8×2/(2×10^9)=0.10 s。B 的指令数相同,CPI 为 3,主频为 2.5 GHz,时间为 0.12 s;A 反而更快,按时间算 A 相对 B 的加速比为 0.12/0.10=1.2。不能只比较主频,换编译器或 ISA 时还必须重新比较指令数。
可复核样例 3:局部优化上限。程序原耗时 10 s,其中 8 s 可被加速 4 倍,剩余 2 s 不变。新耗时为 2+8/4=4 s,总加速比为 10/4=2.5;即使可优化部分无限快,总加速比也只能趋近 10/2=5。MIPS、FLOPS 等指标依赖指令构成与负载,不能脱离相同工作任务直接排名。
13. 数制编码、定点数、补码与 ALU¶
数制转换与信息编码¶
位置计数制中,各位的权值是基数的整数次幂。二进制每位为 0 或 1;八进制一位对应 3 位二进制,十六进制一位对应 4 位二进制。小数转换可用“乘基取整”,有些十进制有限小数在二进制中是无限循环小数,存储时必须舍入。
可复核样例 4:整数与小数转换。(45.625)₁₀ = 32+8+4+1+1/2+1/8 = (101101.101)₂ = (2D.A)₁₆。反向核算为 2×16+13+10/16=45.625。十六进制分组应从小数点向两边每 4 位一组补零,整数高位补零,小数末尾补零。
编码规定“位串代表什么”。无符号整数、补码整数、BCD、字符编码都可以使用同样的位串,但解释不同。8421 BCD 用 4 位编码一个十进制数字,合法数字编码为 0000 至 1001,不是把整个十进制数直接转二进制。
可复核样例 5:BCD 与字符不是同一表示。十进制 59 的纯二进制是 00111011,8421 BCD 是 0101 1001;ASCII 字符串 "59" 的两字节是十六进制 35 39。00111011 若按 ASCII 解释则是分号,不是字符串“59”。Unicode 规定字符编码空间,UTF-8 是其编码方式之一;字符数不等于字节数。奇偶校验能检测奇数个位翻转,不能保证检测偶数个位翻转,也不能单独定位纠错。
定点数范围与补码运算¶
定点数的小数点位置由约定固定,不一定在存储位串中显式记录。n 位无符号整数范围是 0~2^n−1;n 位补码整数范围是 −2^(n−1)~2^(n−1)−1。补码正数与普通二进制一致,负数可由对应正数在固定 n 位内“按位取反再加 1”得到;补码只有一种零,负数多表示一个最小值。
原码使用符号位和绝对值,反码负数将对应正数逐位取反;二者均存在正零与负零,n 位有符号整数范围均为 −(2^(n−1)−1)~2^(n−1)−1。补码便于用同一加法器统一完成加减法,但必须保留约定的位宽。
可复核样例 6:补码加法与减法。在 8 位补码中,+5=00000101,+3=00000011,所以 −3=11111101。计算 5−3:00000101+11111101=1 00000010,舍弃第 9 位得到 00000010=2;进位被舍弃不代表有符号溢出。−128 的编码为 10000000,其相反数 +128 无法用 8 位补码表示。
可复核样例 7:进位与溢出分开判断。8 位运算 01111111+00000001=10000000:按无符号数是 127+1=128,无进位;按补码是两个正数相加却得负数,发生有符号溢出。相反,11111111+00000001=1 00000000 有进位;按补码却是 −1+1=0,没有有符号溢出。判断补码加法溢出可看“同号相加、结果异号”,不能直接看最高位进位。
可复核样例 8:定点小数与扩展。约定 8 位补码位串代表的整数再乘 2^−4,则 00011000 代表 24/16=1.5,11101000 代表 −24/16=−1.5,范围是 −8~7.9375。8 位补码 11111011=−5 扩展到 16 位应补符号位,得到 1111111111111011;若高位补零则变成 251。缩短位宽、左移或乘法可能溢出,并非所有移位都等价于无限精度乘除法。
ALU 与运算路径¶
ALU(算术逻辑单元)执行加减、与或非、比较等运算;移位可由配套移位器完成。控制器依据操作码选择功能,寄存器提供操作数并接收结果,状态寄存器记录零标志、符号标志、进位或溢出等状态。不同 ISA 对标志位的设置方式不同,不能把某种 CPU 的规则当成通用规则。
典型减法路径是 A−B → A+补码(−B) → 加法器 → 结果及状态标志,适合比较、循环计数、地址偏移等场景。逻辑右移高位补零;补码算术右移通常补符号位。例如 11111011 算术右移一位得到 11111101=−3,而不是向零取整的 −2,对负奇数不能不加条件地说“右移等于整数除以 2”。
14. 存储层次与 Cache 访问机制¶
层次、局部性与存储介质¶
典型层次为 寄存器 → L1/L2/L3 Cache → 主存 → SSD/磁盘等外存。越靠近 CPU 通常延迟越低、单位容量成本越高、容量越小;这一概括不是所有设备参数的严格排序。时间局部性是近期用过的信息可能很快再用,空间局部性是相邻地址的信息可能随后被访问,缓存以块为单位传送正是利用这两类特征。
Cache 常用 SRAM,主存常用 DRAM:SRAM 不需要 DRAM 式周期刷新,DRAM 需要刷新且集成密度通常更高;二者通常都掉电丢失。ROM、Flash 等可非易失保存程序或数据,Flash 不等于“不能改写的 ROM”。虚拟内存提供地址空间与按需调入机制,Cache 自动缓存指令/数据,不能把二者都简化为“扩大物理内存”。
地址分解、映射与替换¶
- 直接映射:一个主存块只能放入固定 Cache 行,
行号=主存块号 mod 行数,硬件简单但可能冲突。 - 全相联:一个主存块可放入任意行,没有组索引,比较代价较高。
- 组相联:先固定映射到一组,再从组内多路中选择一行;替换算法在目标组内生效。
对于按字节编址、容量与块大小均为 2 的幂的常见题目,地址划分为 标记 Tag | 组索引 Index | 块内偏移 Offset。块大小决定偏移位数,组数决定索引位数;命中还必须检查有效位及标记,不能只凭索引判断命中。标称数据容量通常不包括标记、有效位、脏位等额外空间。
可复核样例 9:Cache 地址字段。32 位字节地址,Cache 数据容量 16 KiB,块大小 64 B,4 路组相联:① 共 16384/64=256 行;② 共 256/4=64 组;③ 偏移 log₂64=6 位,组索引 6 位,标记 32−6−6=20 位。地址 0x1234 的块号为 floor(4660/64)=72,组号 72 mod 64=8,偏移 4660 mod 64=52,标记 floor(72/64)=1。算组数时不能漏除相联路数。
可复核样例 10:直接映射冲突过程。设 Cache 仅 4 行,每块 16 B,初始为空,访问字节地址 0、64、0、64。块号依次为 0、4、0、4,都映射到第 0 行;每次都替换前块,4 次均未命中。前两次为对应块的首次访问;后两次在同容量全相联缓存中可命中,属于冲突缺失,而不是因为总容量装不下这两个块。
写策略与平均访问时间¶
写直达每次写命中都更新下一级,常配合写缓冲;写回先改 Cache 并置脏位,替换脏块时再写入下一级。写分配是在写未命中时把块装入 Cache,不写分配则直接向下一级写;“何时向下写”和“未命中是否装入”是两个维度,虽有常见组合,却不是定义上绑定。多核 Cache 一致性也不能仅凭写直达就自动解决。
可复核样例 11:平均访问时间 AMAT。假定每次先查一级 Cache,命中时间 1 ns,未命中率 5%,未命中后额外花费 80 ns,则平均时间为 1+0.05×80=5 ns。若题目给的是未命中访问的总耗时 80 ns,应算 0.95×1+0.05×80=4.95 ns。多级 Cache 要区分局部未命中率与相对所有请求的全局未命中率,不能重复乘算或漏算查找时间。
15. 指令格式、寻址方式与 CPU 执行过程¶
指令格式与寻址方式¶
机器指令通常包含操作码和操作数相关字段,后者可包含寄存器号、地址、立即数及寻址方式。零地址、一地址、二地址、三地址指令中的“地址数”通常描述显式操作数字段数,不是指整个计算过程只有几个存储地址;栈式零地址指令仍会隐含访问栈顶操作数。
定长指令便于固定边界取指和译码,变长指令可提高编码密度,但不能简单推断哪一种必然执行更快。若定长指令中固定留出 k 位操作码,最多区分 2^k 种编码;实际可用指令数还受保留码、扩展编码和格式约束影响。
| 寻址方式 | 操作数或有效地址 EA 的形成 | 适用场景与边界 |
|---|---|---|
| 立即寻址 | 操作数在指令中 | 常量;立即数字段长度限制范围 |
| 寄存器寻址 | 操作数在指定寄存器中 | 临时变量;读取操作数不等于访问主存 |
| 直接寻址 | EA=A,A 为指令地址字段 |
固定位置数据;字段长度限制可表达地址 |
| 间接寻址 | EA=M[A] |
指针;需先读出地址再取最终操作数 |
| 寄存器间接寻址 | EA=R |
寄存器持有指针,区别于直接把 R 当操作数 |
| 基址/变址寻址 | EA=寄存器内容+位移量 |
重定位、结构体、数组;两者用途和约定不同但计算形式可相似 |
| 相对寻址 | EA=规定的 PC 基准+有符号位移 |
分支跳转;PC 基准、位移单位由 ISA 指定 |
可复核样例 12:同一地址字段的不同含义。按字节编址,设 A=100,R=1000,M[100]=500,M[500]=7,M[1000]=9,M[1100]=11。立即数 A 为 100;直接寻址得到操作数 500;间接寻址先读地址 500,再得操作数 7;寄存器寻址得到 1000,寄存器间接寻址得到 9;以 R 为基址、100 为字节位移得到 EA=1100,操作数为 11。这里未计取指过程,不能把立即数 100 误作地址 100 处的内容。
可复核样例 13:相对分支与指令位宽。假定指令长 4 B,位于地址 1000,ISA 规定以顺序下一条的地址为基准,位移是有符号字节数 −12,则目标为 1000+4−12=992。若位移单位改为指令字,则还需乘相应长度。另设 32 位定长三寄存器指令,操作码 8 位,32 个通用寄存器各需 5 位编号,则三寄存器字段共 15 位,剩余 32−8−15=9 位用于其他字段;不能直接当作额外 9 位操作码而忽略格式约定。
CPU 结构、控制与指令周期¶
CPU 数据通路包含寄存器组、ALU、内部连接和数据选择部件,控制器产生读写、运算选择及流程控制信号。PC 保存取指位置相关地址,IR 保存当前指令,MAR 表示存储器地址寄存器,MDR/MBR 表示存储器数据缓冲寄存器;这些是教学模型中的功能划分,实际处理器未必都暴露同名独立部件。硬布线控制直接用逻辑电路形成控制信号,微程序控制用微指令组织控制步骤;微指令不是程序员通常编写的机器指令。
指令周期是完成一条指令的全过程;时钟周期是时钟节拍,一个指令周期可包含多个时钟周期。传统教材还按取指、间址、执行、中断等阶段描述,具体指令不一定经过全部阶段,访存等待也可能扩展耗时。流水线可以重叠多条指令的阶段,不改变“一条指令需要哪些语义步骤”。
可复核样例 14:一条 LOAD 的微操作链。设简化 CPU 按字节编址,固定指令长 4 B,PC=1000,下一条指令为 LOAD R1,[2000],且 M[2000]=37:① MAR←PC,请求读取指令;② 等待存储器返回,MDR←M[MAR],IR←MDR,顺序 PC 更新为 1004;③ 译码得到 LOAD 与 EA=2000;④ MAR←2000,读内存并令 MDR←37;⑤ R1←MDR,完成该指令;⑥ 在体系结构规定的可响应边界检查中断。该教学模型中取指与取数是两次逻辑访问,不表示硬件必须精确花 6 个时钟周期,缓存也可能让访问不落到主存。
16. 总线、I/O、DMA 与中断协作¶
总线连接、编址与带宽¶
总线是部件间传递信息的公共通路,可按功能分为地址、数据、控制信号:地址信号指出访问目标,数据信号传送内容,控制信号表达读写、请求、确认等。多个主设备需要仲裁以决定谁可发起传输;同步总线以共同节拍协调,异步总线依靠握手等协议协调,异步不代表无需时序约束。现代互连还可能采用点对点链路,不能把所有连接都理解成一条共享并行线。
内存映射 I/O 将设备寄存器放入统一地址空间,使用相应访存指令访问;独立编址 I/O 使用单独端口空间和专用 I/O 指令。设备寄存器可能有读清零、写触发等副作用,不能按普通内存随意缓存、合并或重排。地址总线宽度影响可寻址空间,数据总线宽度影响一次传送的数据量,二者不能互换。
可复核样例 15:可寻址容量与带宽。32 位地址按字节编址时理论可区分 2^32 B=4 GiB 地址空间,不等于必装 4 GiB 内存,部分区域还可用于设备。64 位数据总线在 100 MHz 下每周期传送一次,理想带宽为 (64/8)×100×10^6=800 MB/s;若每周期两次传送则为 1600 MB/s。仲裁、地址阶段、协议开销和等待会降低有效带宽,MB 的十进制口径不要与 MiB 混用。
三种 I/O 控制方式对比¶
| 方式 | CPU 主要做什么 | 数据搬运路径与场景 | 易错边界 |
|---|---|---|---|
| 程序查询 | 反复读状态并搬运数据 | CPU 轮询设备就绪后读写;简单设备、短等待 | 等待期间消耗 CPU;简单轮询不等于阻塞睡眠 |
| 中断驱动 | 发起后处理其他任务,响应设备事件 | 典型程序中断方式由 CPU 在处理程序中搬运数据 | 中断是事件通知,频繁中断也有保存现场等开销 |
| DMA | 配置传输并处理完成/错误 | DMA 控制器或具 DMA 能力的设备直接在设备与内存间搬运数据;适合块传输 | CPU 仍参与设置,DMA 仍竞争内存/总线,通常仍有完成中断 |
可复核样例 16:DMA 读盘过程链。① 进程请求读文件,内核确认目标缓冲区;② 驱动准备可用于 DMA 的缓冲区与映射,写入目标地址、长度、方向等描述信息;③ 设备/DMA 引擎经互连取得传输机会,将数据写入主存;④ 设备报告完成,常通过中断;⑤ 驱动确认状态,必要时执行 DMA 映射同步/解除映射与缓存一致性维护;⑥ 内核唤醒等待进程,进程被调度后使用数据。IOMMU 可进行设备地址转换与访问保护,但不是所有平台都具备或启用;不能直接把用户虚拟地址当成任何设备都能使用的 DMA 地址。
可复核样例 17:通知成本估算。传送 64 KiB,假定程序中断方式每搬运 1 B 产生一次中断,每次 CPU 处理成本固定为 2 μs,则仅中断处理占 65536×2 μs=131.072 ms。若改为一次 DMA 传输,CPU 配置花 10 μs,完成处理花 2 μs,则 CPU 服务时间为 12 μs;但设备传输 64 KiB 的耗时仍存在,不能把 12 μs 当成整体 I/O 延迟。实际设备可批量中断,这里只是按题设比较。
中断、异常与系统调用边界¶
外部中断通常来自计时器、网卡等异步事件;异常通常由当前指令执行触发,如缺页、非法指令和除零。系统调用是程序主动请求内核服务的受控入口,在不同架构中可通过专用指令等实现,不宜把所有内核入口都称为外部中断。可屏蔽中断可受中断使能/屏蔽控制;不可屏蔽中断不受通常的可屏蔽中断开关控制,但具体规则依体系结构而定。
可复核样例 18:中断与恢复过程链。设备提出请求 → 中断控制逻辑判断屏蔽与优先级 → CPU 在允许的边界响应并保存必要返回状态 → 根据类型定位处理入口 → 处理程序保存其要破坏的其他现场、确认设备状态并处理事件 → 按控制器协议确认中断结束 → 恢复现场并中断返回。硬件和软件各保存哪些寄存器取决于架构。进入内核态不等于必然切换进程;完成后可能继续原进程,也可能因唤醒更高优先级任务而调度。缺页处理成功通常重试原指令,而外部中断后通常继续原执行流,返回位置不能一概写死。
17. 操作系统总论与保护机制¶
目标、功能与系统类型¶
操作系统是管理硬件资源、控制程序执行并为用户与应用提供服务的系统软件。主要目标包括方便性、有效性、公平性和可靠性;实时系统还强调规定时限内的可预测响应。主要功能包括进程与处理机管理、内存管理、文件管理、设备与 I/O 管理,以及保护与安全。并发、共享、虚拟和异步是理解现代多任务操作系统的常见特征:共享资源需要规则,虚拟化抽象不意味着物理资源无限。
| 系统类型 | 关注点 | 典型场景与边界 |
|---|---|---|
| 批处理系统 | 作业成批执行,提高资源利用率和吞吐率 | 无需频繁交互的批量任务;不以即时反馈为首要目标 |
| 分时系统 | 时间片轮转等机制支持多用户交互 | 终端交互、多任务;响应较快不等于保证硬实时期限 |
| 实时系统 | 在规定期限内完成响应 | 控制与监测;硬实时违约不可接受,软实时允许有限退化 |
内核是操作系统的核心执行部分,命令解释器、桌面和许多工具通常运行在用户态,并非所有操作系统软件都处于内核态。宏内核把多项服务放入内核地址空间,微内核倾向于把部分服务移至用户态并以通信协作;不能仅凭分类断言某一方案在任何场景都更快或更安全。
用户态、内核态与调度边界¶
处理器通过特权级和权限检查阻止普通程序随意操作设备、页表或中断控制。系统调用入口从受控位置进入内核,内核验证参数、权限和用户指针,再访问资源并返回;普通函数调用或库函数调用不一定触发系统调用。模式切换是执行权限级别变化,上下文切换是 CPU 改为执行另一个线程/进程,二者不能等同。
可复核样例 19:阻塞读的状态链。假定程序调用阻塞读且数据尚未就绪:① 用户线程运行中发起系统调用;② 内核检查参数,提交或等待 I/O;③ 线程由运行态进入阻塞态,调度其他就绪线程;④ I/O 完成,中断/驱动唤醒该线程,使其进入就绪态;⑤ 获得 CPU 后继续内核返回路径,再回用户态。阻塞态不能仅因时间片到期就直接变运行态,就绪也不等于立即运行。若数据已缓存,读调用可在不阻塞、不切换线程的情况下完成。
保护强调“谁可以访问什么资源”,安全还包括身份认证、审计、防攻击等。以最小权限授予文件访问和设备控制能力有利于限制故障范围,但权限检查不能替代数据备份;可用性、保密性和完整性是不同目标。
18. 文件系统:目录、空间组织与一致性¶
文件、目录与打开文件¶
文件是操作系统提供的命名数据对象,目录负责名字到文件元数据的组织与查找。在类 Unix 文件系统中,inode 通常记录类型、权限、属主、长度、数据块索引等,文件名主要在目录项中;这一实现不是所有文件系统的统一规定。路径解析逐级查目录并检查权限;绝对路径从根开始,相对路径从当前工作目录开始。
打开文件一般形成“进程文件描述符 → 打开文件描述/系统打开文件状态 → 文件元数据及数据”的关系。文件描述符是进程使用的句柄,不是磁盘块号;打开状态可记录当前偏移和访问模式。独立 open 通常产生独立偏移,而复制描述符或某些继承方式可能共享打开文件描述及偏移。
可复核样例 20:路径解析与读偏移。以类 Unix 的 /home/u/a.txt 为例:① 从根目录查找 home;② 在 home 查找 u;③ 在 u 查找 a.txt,并验证目录搜索权限和文件读权限;④ open 得到 fd=3,初始偏移为 0;⑤ 成功读 100 B 后偏移为 100;⑥ 再成功读 50 B 后偏移为 150;⑦ close 释放此描述符。路径查找、实际读取都可能命中缓存,不必每一级都产生一次磁盘 I/O。返回短读时应按实际读到的字节数更新偏移,而不是按请求长度更新。
文件分配与空闲空间管理¶
| 分配方式 | 机制 | 优点 | 代价与边界 |
|---|---|---|---|
| 连续分配 | 文件占用一段连续块 | 顺序和随机定位简单 | 增长困难,可能产生外部碎片;现代可用多个区段 extent 折中 |
| 链式分配 | 每块或分配表记录下一块 | 易增长,无需整个文件连续 | 随机访问需沿链,指针有空间与可靠性成本 |
| 索引分配 | 索引结构记录数据块地址 | 支持按逻辑块查找 | 索引本身占空间,多级索引可能增加访问层数 |
空闲空间可用位示图、空闲链表等管理。位示图以一位表示一个分配单元的占用状态,0/1 的具体含义按约定;文件尾部未用满的已分配块属于内部碎片。文件逻辑长度、已分配数据块数及包含元数据的实际占用量不是同一指标,稀疏文件和压缩还会改变其关系。
可复核样例 21:文件块数和位示图大小。块大小 4096 B,普通非稀疏文件长 10000 B,不计元数据时需 ceil(10000/4096)=3 块,分配 12288 B,尾块未用空间 12288−10000=2288 B。若某卷有 2^20 个可分配块,其位示图需 2^20 bit=2^17 B=128 KiB。块数向上取整,不是把文件长度直接四舍五入。
可复核样例 22:一级间接索引容量。假设 inode 有 10 个直接块指针和 1 个一级间接指针,块大小 4 KiB,每个块号 4 B,则间接索引块能存 4096/4=1024 个数据块号。最大可索引文件数据为 (10+1024)×4096=4235264 B;间接索引块本身还占 4096 B,但不增加文件可容纳的用户数据。此题假设文件大小字段、保留块号等不另行限制范围。
链接、缓存与崩溃一致性¶
硬链接在支持它的文件系统中让多个目录项指向同一文件对象;符号链接保存目标路径,目标删除后可成为悬空链接。硬链接通常不能跨文件系统,也通常禁止普通用户为目录创建硬链接,以避免目录环等问题;具体权限与实现以系统为准。
可复核样例 23:删除名字不等于立即释放数据。类 Unix 文件 a 有一个硬链接 b,链接计数为 2,进程已打开 a:① unlink a 后计数降为 1,b 仍可访问;② 再 unlink b 后计数为 0,但进程仍持有打开引用,通常仍能通过原描述符访问;③ 最后一个打开引用释放后,文件数据才可回收。符号链接不是第二个硬链接,不会以相同方式维持目标 inode 的链接计数。
缓冲/页缓存让写入先落入内存,随后异步回写;因此 write 成功不一定表示已持久化到稳定介质。日志文件系统通过按协议先记录相关变更再提交,帮助崩溃恢复时维持结构一致性;日志模式可只覆盖元数据,不保证所有用户数据都已落盘。需要持久性时,应按系统约定使用同步接口及必要的目录同步等;日志、RAID 都不能替代独立备份。
19. 设备管理:缓冲、排队与磁盘调度¶
分层管理与设备抽象¶
设备管理通过设备无关层、驱动程序、中断处理和控制器协同工作。设备无关层提供统一接口、命名、保护、缓冲和分配策略;驱动将一般请求转换为控制器命令;控制器面向硬件执行并报告状态。块设备以可寻址块组织数据,字符设备一般提供字节流式接口;这不是说字符设备内部绝不使用块或缓冲。
缓冲用于吸收速度不匹配、转换传输粒度或解耦生产与消费;缓存用于保留数据以便后续复用,两者目的不同但同一内存区可能兼具作用。双缓冲在一块用于 I/O 时让另一块用于计算,能重叠工作但仍受最慢阶段、总线和处理器资源限制。SPOOLing(假脱机)先将作业排入磁盘队列,由后台程序依次输出,使独占设备向用户呈现可共享的服务,不是让一台打印机同一时刻打印多个页面。
可复核样例 24:双缓冲流水化。每块读入需 8 ms,处理需 5 ms,共 4 块;假定缓冲足够、I/O 与 CPU 可完全重叠且忽略交接开销。单缓冲且读/处理完全串行时需 4×(8+5)=52 ms;双缓冲时第一块 0~8 ms 读入、8~13 ms 处理,第二块 8~16 ms 读入、16~21 ms 处理,后续同理,最后一块 24~32 ms 读入、32~37 ms 处理,总计 8+3×max(8,5)+5=37 ms。不能直接算成 32 ms,因为末块还需处理。
磁盘调度与饥饿边界¶
FCFS 按到达顺序服务,简单但可能移动较远;SSTF 每次选离当前磁头最近的请求,通常减少局部移动,但远处请求可能饥饿;SCAN 按方向扫描到边界再折返,LOOK 在该方向最后一个请求处折返;C-SCAN 单向服务,返回另一端后继续。是否把折返和回程移动计入距离必须按题设说明。这些算法主要针对机械磁盘的寻道成本,不能照搬为 SSD 的机械寻道模型。
可复核样例 25:FCFS、SSTF 与 LOOK 对比。磁头初始在 50,道号请求按顺序为 10、60、20、90,均已到达,不考虑旋转:FCFS 距离为 40+50+40+70=200;SSTF 顺序为 60→90→20→10,距离为 10+30+70+10=120;LOOK 初始向较大道号,顺序为 60→90→20→10,也是 120。这里只在这个队列上相同,不代表 SSTF 与 LOOK 等价;SCAN 若要求继续到磁盘上界再回头,还需要已知最大道号。
设备分配与回收还需考虑独占、共享和死锁;例如进程持有扫描仪又等待打印机时,需要结合统一申请顺序等策略。中断优先级主要决定事件响应先后,CPU 进程调度优先级决定就绪任务的运行机会,两者不是同一队列或同一套规则。
20. 容器化管理:隔离、资源与生命周期¶
容器、镜像与虚拟机对比¶
容器将应用及依赖组织为相对独立的运行环境。镜像是可用于创建容器的分层模板,容器是其运行实例,通常在只读镜像层上增加可写层。容器不是一个完整的硬件虚拟机;以常见 Linux 容器为例,它们共享宿主机内核,而虚拟机通常拥有各自的客户机内核并由虚拟化层提供虚拟硬件。
| 维度 | 容器 | 虚拟机 |
|---|---|---|
| 隔离基础 | 进程隔离、资源控制等,通常共享内核 | 虚拟硬件与客户机内核 |
| 启动与密度 | 通常启动较快、单位实例开销较小 | 通常有完整客户机系统开销 |
| 系统兼容 | 受宿主内核和运行环境限制 | 可运行虚拟化平台支持的不同客户机系统 |
| 安全边界 | 需谨慎防护共享内核及特权配置 | 通常提供不同层次隔离,但也不保证绝对安全 |
易错点:在非 Linux 桌面运行 Linux 容器时,底层可能先运行 Linux 虚拟机;“使用容器”与“环境中绝无虚拟机”并不矛盾。容器不是自动安全沙箱,特权模式、挂载宿主敏感目录或暴露管理接口都可能削弱隔离。
命名空间、资源限制与数据管理¶
Linux namespaces 分隔进程号、挂载点、网络、主机名、IPC、用户身份等可见范围;cgroups 对进程组的 CPU、内存、I/O 等进行计量、限制或调度控制。前者主要回答“能看到哪些对象”,后者回答“可使用多少资源”,不是把物理 CPU 和内存永久切成独占小块。用户命名空间映射可使容器内的 root 不等同于宿主 root,但是否配置和映射方式必须核实。
可复核样例 26:CPU 配额与内存限制。假设 Linux cgroup v2 的 cpu.max 设置为 200000 100000,含义是每 100000 μs 的周期中,该组最多消耗合计 200000 μs 的 CPU 时间,即平均约 2 个逻辑 CPU 的算力上限;不是固定绑定两个核心,也不是每个线程各得两个核心。若 memory.max=536870912,限制为 512 MiB;当受计量内存逼近限制时可能回收,无法满足分配时可能发生组内 OOM 等,具体结果依配置与负载而定。限制不是预先保证预留同等资源,交换空间也有单独规则。
容器可写层适合临时运行数据,持久业务数据通常通过卷或明确的外部存储管理。删除并重建容器通常不会保留原可写层;持久卷是否保留取决于运行时和删除策略,不应把“卷”视为自动备份。镜像中不宜直接写入密钥,需按平台使用受控的秘密信息注入、权限和审计机制。
可复核样例 27:部署、健康检查与恢复过程链。① 选择明确版本或摘要的镜像,检查配置、依赖与权限;② 配置网络、端口、持久卷和 CPU/内存限制;③ 创建并启动容器,入口主进程开始运行;④ 通过健康/就绪检查判断服务状态并采集日志、指标;⑤ 更新时用新实例验证服务后逐步切换流量,保留可回滚版本;⑥ 停止时先请求优雅退出并等待,超时再按策略强制终止;⑦ 删除实例时核对卷和数据保留策略。主进程退出通常导致容器停止;“进程还在”不等于服务健康,重启策略也不能修复错误数据或错误配置。
运行时负责单机容器创建与执行,编排系统在其上进行调度、服务发现、扩缩容和故障重建。以 Kubernetes 为例,Pod 是常用的调度部署单元,一个 Pod 可包含协同容器并共享特定环境;它不是一台独立虚拟机。就绪检查失败通常影响流量接入,存活检查失败可触发重启,两者目的不同。自动重建实例只能恢复符合预期配置的运行副本,不能替代数据持久化、备份与容灾。
正式复核补充:浮点表示的数值样例
以 IEEE 754 binary32 表示十进制 −13.25:绝对值为 (1101.01)₂=(1.10101)₂×2³,故符号位 s=1,存储阶码 E=3+127=130=(10000010)₂,23 位小数字段为 10101000000000000000000。完整编码为 1 | 10000010 | 10101000000000000000000,十六进制 0xC1540000。反解为 −(1+1/2+1/8+1/32)×8=−13.25。隐含的最高位 1 不存入小数字段;该数是规格化有限数,不适用阶码全零/全一的特殊值规则。
正式复核补充:浮点加法与舍入过程
精确二进制例:1.5+0.75,先写为 1.1₂×2⁰+1.1₂×2⁻¹;对阶将较小指数项改写成 0.11₂×2⁰;尾数相加得 10.01₂×2⁰;规格化得 1.001₂×2¹=2.25。binary32 能精确表示本例,不需要丢弃非零位,结果编码为 0 | 10000000 | 00100000000000000000000,即 0x40100000。这说明加法不能直接把两个阶码相加。
舍入例:binary32 在 [1,2) 内相邻数间隔为 2⁻²³。精确和 1+2⁻²⁴ 正好在 1 与 1+2⁻²³ 的中点,采用“舍入到最近,平局取偶”时得到 1:1 的有效尾数末位为 0,另一候选末位为 1。这不是小数项等于零,而是有限精度舍入;换舍入模式可能得到不同结果。浮点乘法则先将有效数相乘、实际指数相加,再规格化、舍入并检查范围;例如 (1.5×2¹)×(1.5×2²)=2.25×2³=1.125×2⁴=18,偏置阶码不能不去偏置就直接相加。
正式复核补充:Cache FIFO/LRU 替换逐步样例
设某个组相联 Cache 的同一组只有 3 路,初始全部无效;读访问块序列 A、B、C、A、D、A,这些块都映射到该组,每次未命中均装入。表内队列是替换优先级,不是固定物理路编号:FIFO 从最早装入到最晚装入,LRU 从最久未访问到最近访问。命中不改变 FIFO 顺序,但必须更新 LRU 顺序。
| 步骤/访问块 | FIFO 命中情况与组内队列 | LRU 命中情况与组内队列 |
|---|---|---|
| 1/A | 缺失,空路装入;A | 缺失,空路装入;A |
| 2/B | 缺失,空路装入;A,B | 缺失,空路装入;A,B |
| 3/C | 缺失,空路装入;A,B,C | 缺失,空路装入;A,B,C |
| 4/A | 命中,不重排;A,B,C | 命中,A 移至最近端;B,C,A |
| 5/D | 缺失,淘汰 A;B,C,D | 缺失,淘汰 B;C,A,D |
| 6/A | 缺失,淘汰 B;C,D,A | 命中;C,D,A |
FIFO 共 5 次缺失、1 次命中;LRU 共 4 次缺失、2 次命中。前 3 次缺失利用空路,并没有淘汰有效块;组满后才需要选择牺牲块。随机替换从候选路中随机选择,LFU 按访问频次选择(还须规定平局和老化规则),不等于 LRU。直接映射每块只有固定位置,无需在多路中选择。若采用写回策略且淘汰块为脏块,还需回写;本例只读且初始为空,不产生脏块回写。LRU 本例较好不代表对所有访问序列都比 FIFO 缺失更少。
正式复核补充:页框、缺页与 FIFO/LRU 逐步推演
页是进程虚拟地址空间的固定大小单位,页框是物理内存中同样大小的容纳单位。假定进程固定分配 3 个页框 F1/F2/F3,初始为空,采用请求分页且不预取,引用页号序列 1、2、3、1、4、1。访问页不在这 3 个页框中即记一次缺页;空页框可直接装入,只有缺页且页框已满才发生置换。表中三元组严格按 F1/F2/F3 排列,“—”表示空页框,不表示页号 0。
| 步骤/页号 | FIFO 页框状态 | FIFO 判定/动作 | LRU 页框状态 | LRU 判定/动作 |
|---|---|---|---|---|
| 1/1 | (1,—, —) | 缺页,装 F1 | (1,—, —) | 缺页,装 F1 |
| 2/2 | (1,2,—) | 缺页,装 F2 | (1,2,—) | 缺页,装 F2 |
| 3/3 | (1,2,3) | 缺页,装 F3 | (1,2,3) | 缺页,装 F3 |
| 4/1 | (1,2,3) | 命中,装入顺序仍为 1,2,3 | (1,2,3) | 命中,最近使用顺序从旧到新为 2,3,1 |
| 5/4 | (4,2,3) | 缺页,最早装入的 1 换出 | (1,4,3) | 缺页,最久未访问的 2 换出 |
| 6/1 | (4,1,3) | 缺页,最早装入的 2 换出 | (1,4,3) | 命中,更新页 1 的最近使用时间 |
FIFO 缺页 5 次、缺页率 5/6、置换 2 次;LRU 缺页 4 次、缺页率 4/6=2/3、置换 1 次。最初 3 次装入也算缺页,但不算换出。页表存在位反映驻留状态;处理缺页时操作系统分配/选择页框,脏页必要时写回,再调入请求页、更新页表及相关 TLB 状态,随后重试指令。TLB 未命中但页已驻留时只需获得映射,不能加算缺页。本页前例的 Cache 缺失和这里的虚拟内存缺页属于不同层次,即使替换算法同名也不能混计次数。
正式复核补充:非抢占 HRRN 调度计算
设单 CPU,作业 A/B/C 的到达时间分别为 0/1/2 ms,服务时间分别为 4/3/1 ms,无 I/O 阻塞和切换开销。t=0 仅 A 到达,先执行 A,区间 [0,4);t=4 时 B 等待 3 ms,响应比 (3+3)/3=2,C 等待 2 ms,响应比 (2+1)/1=3,故执行 C,区间 [4,5);t=5 再执行 B,区间 [5,8)。完成时间 A/B/C 为 4/8/5 ms,周转时间(完成减到达)为 4/7/3 ms,等待时间(周转减服务)为 0/4/2 ms;平均周转 14/3 ms,平均等待 2 ms。非抢占意味着 A 执行期间不因 C 到达而中止;响应比只在下一次选择时对已到达的就绪作业重新计算,不能预先按服务时间把全部作业排好。