跳转至

来源:c:\Users\26947\Desktop\考试\专业课速记\03_操作系统与并发.md 用途:分类保存“原文完整迁移”基准,供完整阅读与逐字核对;以下正文保持源文件原样,不压缩、不改写。


操作系统与并发

1. 进程与线程

  • 进程是资源分配的基本单位。
  • 线程是 CPU 调度的基本单位。
  • 同一进程内线程共享代码段、数据段、打开的文件等资源。
  • 线程拥有独立的栈和程序计数器。

2. 用户态与内核态

系统调用会引发用户态到内核态的切换,例如文件读写、创建进程、网络通信、内存申请。频繁系统调用会产生上下文切换开销。

3. 虚拟内存分页与 TLB(快表)

分页的基本概念

分页把进程的虚拟地址空间划分成固定大小的页(Page),把物理内存划分成同样大小的页框/帧(Page Frame)。程序的页可以装入物理内存中不连续的页框,由操作系统维护页表记录映射关系。

  • 页:虚拟内存中的固定大小区块。
  • 页框/页帧:物理内存中的固定大小区块,大小与页相同。
  • 页表:记录“虚拟页号 → 物理页框号”的映射,以及存在位、权限、修改位等状态。
  • 分页可消除外部碎片,但最后一页未用满时可能有少量内部碎片。

虚拟地址如何转换

虚拟地址通常拆成两部分:虚拟页号 + 页内偏移量。页内偏移在转换前后保持不变,页表或快表将虚拟页号转换为物理页框号,再与页内偏移组合成物理地址。

1
2
3
虚拟地址 [虚拟页号 | 页内偏移量]
        ↓ 查快表 / 页表
物理地址 [物理页框号 | 页内偏移量]

例:页大小为 4 KB,则页内偏移需要 12 位(4 KB = 2^12);虚拟地址低 12 位是页内偏移,其余高位用于虚拟页号。页大小为 2 的幂,页号与偏移可通过位划分得到。

快表(TLB)

快表是处理器中用于缓存近期页表映射的高速小型硬件缓存。它缓存的是虚拟页号到物理页框号的映射,不是整个进程,也不是磁盘数据。

地址转换过程:

  1. CPU 产生虚拟地址,硬件先用 VPN 查 TLB。
  2. TLB 命中:直接取得 PFN,与页内偏移组合成物理地址,速度快。
  3. TLB 未命中:到内存中的页表查映射;若该页在内存中,把映射装入 TLB 后继续访问。
  4. 页表显示该页不在内存时,发生缺页异常/缺页中断;操作系统从磁盘调入页面,更新页表,必要时置换其他页面,再重新执行引发缺页的指令。
事件 含义 后果
TLB 命中 快表中找到 VPN→PFN 快速完成地址转换
TLB 未命中 快表没找到映射 查内存中的页表;页面可能仍在内存
缺页 页表表明页面不在物理内存 需要操作系统从后备存储调页,代价远高于 TLB 未命中

关键辨析:TLB 未命中不等于缺页。未命中只表示“快表没有缓存映射”;只有页表也表明页面不在内存,才需要缺页处理。

TLB 与页表的配合

  • 页表通常保存在主存中,容量可以较大,但访问它会增加地址转换开销。
  • TLB 是速度更快但容量较小的缓存,利用程序访问的时间局部性和空间局部性提高地址转换速度。
  • TLB 命中率越高,平均地址转换开销通常越低。
  • 进程切换时,若不同进程的地址空间映射不同,需要通过地址空间标识(ASID)区分 TLB 项,或刷新部分/全部 TLB;具体由处理器机制决定。

分页的优缺点与相关概念

  • 优点:物理内存可不连续分配;消除外部碎片;便于实现虚拟内存和内存保护。
  • 代价:页表占用内存;地址转换增加开销;页未用满会产生内部碎片;缺页时磁盘 I/O 代价很高。
  • 请求分页:页面只有在被访问且不在内存时才调入,属于虚拟内存常见机制。
  • 页面置换:内存没有空闲页框时,选择页面换出,为新页腾出空间;置换算法不等同于 TLB 替换策略。

4. 页面置换算法

缺页且没有空闲页框时,操作系统需要选一个内存页面换出:

  • FIFO:先进先出,可能出现 Belady 异常。
  • LRU:淘汰最近最少使用页面。
  • OPT:淘汰未来最长时间不会使用的页面,理论最优,但实际无法准确知道未来。
  • Clock:LRU 的近似实现。

4. 死锁

死锁四个必要条件:

  1. 互斥
  2. 请求并保持
  3. 不可剥夺
  4. 循环等待

处理方法:

  • 预防死锁:破坏必要条件。
  • 避免死锁:银行家算法。
  • 检测与恢复:允许发生,定期检测并处理。
  • 忽略:某些通用操作系统的实际策略。

5. 进程通信

常见方式:管道、消息队列、共享内存、信号量、Socket。

共享内存速度快,但需要配合锁或信号量解决并发问题。

6. 指令流水线与流水线冒险

指令流水线:把一条指令的执行拆成多个阶段(经典五段:取指 IF → 译码 ID → 执行 EX → 访存 MEM → 写回 WB),不同指令的不同阶段重叠执行——像工厂装配线,每个工位只干一道工序,多条指令同时在流动,整体吞吐量大幅提高。

流水线冒险(Hazard):因为某种冲突,下一条指令无法在预定的时钟周期继续执行,流水线"卡壳"。共三类(必背):

冒险类型 原因 例子 主要对策
结构冒险 多条指令争用同一硬件资源 取指和访存指令同时要用同一个存储器 资源重复设置:指令 Cache 与数据 Cache 分开
数据冒险 后一条指令要用前一条的结果,结果还没写回 ADD 算出 R1,紧跟的 SUB 立刻要用 R1 转发/旁路(结果直接送下游,不等写回)、插入停顿(气泡)、编译器调整指令顺序
控制冒险 分支/跳转改变执行流,转向目标确定前已取错指令 if 判断还没出结果,下一条取顺序指令还是跳转目标? 分支预测(猜方向,猜错作废重来)、尽早算出分支结果

银行柜面类比(帮助记忆):

  • 流水线 = 柜面流水作业:填单 → 审核 → 录入 → 出钞,四个柜员同时各服务一位客户的不同环节。
  • 结构冒险:两位客户同时要用同一台验钞机——对策是多配一台设备(资源重复)。
  • 数据冒险:录入岗等审核岗的结论,审核没完只能干等——对策是结论直接口头递过去(转发),不用等归档完再查(写回)。
  • 控制冒险:客户中途改主意"不取了,改存款",已经准备好的出钞动作作废重来(预测失败清空流水线)。

高频考点:

  1. 数据冒险里 RAW(写后读)最常见:后一条指令读了前一条尚未写入的寄存器;WAR(读后写)、WAW(写后写)在按序流水线中较少出现。
  2. 转发(Forwarding / 旁路)是数据冒险的主要解法,停顿(Stall / 气泡)是补充手段——纯靠停顿性能损失太大。
  3. 分支预测猜对零代价,猜错清空流水线重来(控制冒险的代价来源)。

流水线性能计算

设流水线有 k 个阶段,每个阶段耗时近似为 t,共有 n 条指令:

  • 非流水线执行时间:n × k × t。
  • 流水线执行时间:(k + n − 1) × t。第一条指令要经过全部 k 个阶段,之后通常每个时钟周期完成一条。
  • 吞吐率:单位时间完成的指令数。稳定运行后约为 1 / t 条/周期。
  • 加速比:非流水线时间 ÷ 流水线时间,即 nkt / [(k+n−1)t]。
  • 当 n 很大时,加速比接近 k,但不会真正超过阶段数 k。

例:5 段流水线执行 10 条指令,每段 1 个周期:

  • 非流水线:10 × 5 = 50 周期;
  • 流水线:5 + 10 − 1 = 14 周期;
  • 加速比:50 / 14 ≈ 3.57;
  • 不是 5 倍,因为第一条指令需要“装入”流水线,最后还要“排空”流水线。

注意:流水线提高的是吞吐率,不一定缩短单条指令的实际执行延迟;单条指令仍需经过全部阶段。

数据冒险的典型时序:load-use 冒险

LW  R1, 0(R2)      ; 从内存读数据到 R1
ADD R3, R1, R4     ; 下一条立即使用 R1

LW 的结果通常要到 MEM 阶段结束才产生,而下一条 ADD 在 EX 阶段开始就需要 R1。即使有转发,也可能来不及,因此通常需要插入 1 个停顿周期(气泡),然后再转发结果。

判断方法:

  • 普通算术指令产生的结果,常可通过转发直接供下一条使用;
  • 加载指令后紧跟使用加载结果,是最典型的必须停顿场景;
  • 编译器可以把一条无关指令插入两条指令之间,减少或消除停顿。

控制冒险的分支预测

处理器遇到条件分支时,可能暂时不知道下一条指令来自顺序地址还是跳转目标。常见策略:

  • 静态预测:固定预测“跳转”或“ 不跳转”,实现简单;
  • 动态预测:根据历史执行结果预测,通常维护分支历史信息;
  • 延迟分支:由编译器安排分支后的指令槽位;
  • 预测正确:流水线继续运行;
  • 预测错误:清除已经取入的错误路径指令,并从正确目标重新取指,产生若干周期损失。

一眼判断题

  • 流水线是让一条指令同时执行多个阶段:错;流水线是让多条指令的不同阶段重叠执行。
  • 流水线能把单条指令执行时间降为一个阶段:错;它主要提高整体吞吐率。
  • 指令 Cache 和数据 Cache 分开可减少取指与访存的结构冲突:对。
  • 只要采用转发,所有数据冒险都不需要停顿:错;load-use 冒险常仍需停顿。
  • 分支预测失败时应清空错误路径上的部分指令:对。

10. 题目对应补充:存储器、Cache、异步性与 MMU

10.1 字扩展与位扩展

存储器规格通常写成“存储单元数量 × 每个存储字的位数”。扩展时要先判断改变的是地址数量还是每个地址对应的数据位数:

扩展方式 改变内容 地址线 数据线 典型目的
字扩展 增加存储单元数量,存储字长不变 增加地址线或片选译码 基本不变 扩大容量
位扩展 增加每个存储字的位数,单元数量不变 基本不变 增加数据线 扩大字长

例子:已有 1K × 8 芯片,要组成 4K × 8,需要 4 片并进行字扩展:每片仍提供 8 位数据,但用更高位地址经过译码选择其中一片。若要组成 1K × 16,需要 2 片并行工作进行位扩展:两片共用地址和控制信号,分别提供低 8 位和高 8 位数据。

易错点:字扩展改变的是“能存多少个字”,不是“每个字有多少位”;位扩展才改变存储字长。读写速度、总线宽度不是字扩展的直接定义。

10.2 IEEE 754 浮点数格式

IEEE 754 浮点数通常表示为:

数值 = (-1)^符号位 × 1.尾数 × 2^(阶码 - 偏置值)
类型 总位数 符号位 阶码 尾数字段 阶码偏置
单精度 32 1 8 23 127
双精度 64 1 11 52 1023

单精度的“尾数位数”在选择题中通常指尾数字段的存储位数,即 23 位;规格化数的有效精度还包括隐藏的最高位 1,因此不能把 23 位与总位数、阶码位数混淆。

例子:单精度格式按“1 位符号 + 8 位阶码 + 23 位尾数”划分,共 32 位。双精度按“1 + 11 + 52”划分,共 64 位。题目问单精度尾数字段时选 23 位,不选 8 位阶码。

10.3 多体交叉存储

多体交叉把主存划分为多个相互独立、可以交错工作的存储体,核心目标是提高连续访问时的主存吞吐率和带宽,而不是直接扩大总容量、降低刷新频率或减少 Cache 缺失。

  • 低位交叉:用地址低位选择存储体,连续地址通常落入不同存储体,适合连续数据的并行访问。
  • 高位交叉:用地址高位选择存储体,连续地址可能集中在同一存储体,更多体现分区管理效果。
  • 存储体之间仍可能受存取周期限制;交叉并不表示每个存储体能在同一时刻无限次读写。

例子:4 体低位交叉存储中,连续地址 0、1、2、3 可分别放入第 0、1、2、3 体。处理器连续读取这 4 个字时,可以在一个存储体等待恢复的同时访问其他存储体,从而提高连续数据的传输速度。

10.4 Cache 的三类缺失

Cache 缺失(Cache miss)是处理器访问的数据块不在 Cache 中,需要从下一层存储器取回。经典分类为:

类型 含义 例子 主要原因
强制缺失 某数据块第一次被访问,之前从未装入 Cache 程序第一次读取数组首元素 冷启动或首次访问
容量缺失 Cache 容量不足,已装入的数据块被淘汰 循环处理的大数组超过 Cache 容量 工作集大于 Cache
冲突缺失 不同数据块映射到同一 Cache 位置,互相替换 直接映射 Cache 中两个地址反复占用同一行 映射位置竞争

“传输缺失”不是 Cache 经典三分类之一。例子:一个数组第一次遍历时,首次访问的 Cache 行产生强制缺失;反复访问远大于 Cache 的数组可能产生容量缺失;两个地址虽然总数据量不大,但总映射到同一行时产生冲突缺失。

10.5 操作系统的异步性

异步性是指进程的推进速度、调度顺序以及 I/O 完成时机具有不确定性,不能预先准确知道某个事件何时发生。它强调“事件时机不可预知”,不是“多个进程同时执行”。

  • 并发:多个进程在同一时间段内交替推进,宏观上同时存在。
  • 并行:多个处理器或核心在同一时刻真正执行多个任务。
  • 异步:一个进程不必等待另一个事件按固定时间发生,事件到达和执行顺序可能变化。

例子:进程发起磁盘 I/O 后进入等待,磁盘何时完成、进程何时被唤醒取决于设备和调度;即使同一程序运行两次,I/O 完成顺序和进程获得 CPU 的时间也可能不同。这体现异步性。若两个进程在单核 CPU 上轮流运行,是并发;若在两个核心上同时运行,是并行。

10.6 MMU 与虚拟内存硬件支撑

MMU(Memory Management Unit,内存管理单元)是处理器中的硬件模块,负责在访问内存时配合页表和 TLB,把虚拟地址转换为物理地址,并检查访问权限。

一次分页地址转换可概括为:

  1. CPU 生成虚拟地址,MMU 将其拆成虚拟页号和页内偏移。
  2. MMU 先查 TLB;命中时直接取得物理页框号。
  3. TLB 未命中时查页表。页表显示页面在内存中,就取得物理页框号并更新 TLB。
  4. 页表显示页面不在内存中时,触发缺页异常,由操作系统调入页面、更新页表后重新执行访问。
  5. 物理页框号与不变的页内偏移组合成物理地址,再完成访问。

例子:虚拟地址由虚拟页号 VPN=5 和偏移 100 组成,页表把第 5 页映射到物理页框 PFN=12,则物理地址由页框 12 和偏移 100 组成。若页表显示第 5 页不在内存,MMU 不会自己从磁盘读取,而是触发缺页异常,由操作系统完成调页。

硬件辨析:Cache 缓存近期数据和指令;DMA 控制器负责设备与内存之间的直接数据传送;中断控制器负责管理和分发中断;虚拟地址到物理地址的转换核心硬件是 MMU。TLB 是 MMU 地址转换路径中的高速映射缓存,不等于 MMU 本身。


🟡 本分册解释为通用计算机知识补充,可能与你老师讲的不完全一致;专业范围以《考试大纲》"金融监管计算机类"部分为准。