操作系统复习六覆盖技术覆盖技术Overlay 是早期计算机操作系统中为了在物理内存容量极小比如只有几十KB的条件下运行比物理内存大得多的程序而采用的一种手动内存管理技术。简单来说它的核心思想是“内存装不下整个程序那就把它拆成几块哪块要用就加载哪块不用的块就丢弃或覆盖掉。”对换技术就是把内存中暂时不用的程序整个换出外存中腾出内存供要运行的程序使用。1. 什么是对换技术Swapping定义由操作系统控制以整个进程为单位将内存中某个暂时不能运行的进程的全部地址空间代码数据堆栈一次性写入磁盘的“对换区”从而腾出物理内存当该进程具备运行条件时再由操作系统一次性将其全部读回内存。核心特征“整体进出一次搬完”。2. 什么情况下会换出触发时机不是随便就换的操作系统遵循以下原则选择换出进程阻塞态进程优先正在等待I/O如等待键盘输入、磁盘读写的进程短时间内用不到CPU首选换出。低优先级进程在多道批处理或分时系统中当内存紧张且所有进程都在就绪态时优先换出优先级最低或剩余时间最长的进程。内存紧缺预警系统检测到空闲物理内存低于安全阈值时启动交换。注意被换出的进程是**“暂时”**不运行的它的状态会被保存在PCB中等I/O完成或轮到它时再换入。3. 对换技术 vs 覆盖技术考试必区分这是两者最核心的区别千万不能混淆对比维度对换技术Swapping覆盖技术Overlay管理主体操作系统内核自动完成对程序员透明程序员手动编码控制加载和覆盖操作单位整个进程完整的地址空间进程内部的程序段部分模块空间关系内存中一个进程的空间与另一个进程的空间交换换出A换入B同一进程内部不同模块共享同一块内存区域互相覆盖目标宏观上让多个进程分时复用物理内存微观上让一个大程序在有限内存中运行当前状态演变为虚拟内存的换页机制纯整体交换已淘汰已被虚拟内存彻底取代操作系统自动分页4. 为什么纯“整体对换”在现代操作系统中也淘汰了虽然它比覆盖技术进步由OS自动管理但依然存在致命缺陷I/O开销极大。现代一个进程动辄几百MB甚至几个GB如果每次调度都要从磁盘换进换出整个进程磁盘I/O会成为巨大的瓶颈系统会陷入频繁的“抖动”。现代改良方案现代操作系统如Linux不再进行“整体进程交换”而是采用请求分页Demand Paging技术将交换粒度从“整个进程”缩小为“4KB的页面”。只换出那些长期未被访问的页面而非整坨进程。总结一次性把整个暂时不运行的程序搬到磁盘。但要注意区分覆盖是同一程序的内部模块“手动覆盖”对换是不同程序之间的“整体换出换入”。在对换的基础上现代系统进化出了更精细的请求分页虚拟内存用“页面”替代了“进程”作为交换单位大大减少了磁盘I/O压力。虚拟存储技术它是一种内存管理技术将程序的逻辑地址空间与物理内存地址空间分离。逻辑空间虚拟空间程序员/编译器等看到的地址如 0x0000 ~ 0xFFFF…可以远大于物理内存。物理空间实际内存硬件上真实存在的RAM条容量。核心机制程序不必全部装入内存才能运行只需装入当前即将执行的部分即可。其余部分存放在磁盘的“交换区”或“页面文件”中需要时再自动调入。Belady异常Belady异常Belady’s Anomaly是指在使用先进先出FIFO页面置换算法时分配给进程的物理内存块页框增加缺页中断缺页次数反而增多的反常现象。这完全违背了我们的直觉——“内存越大性能应该越好”。它是由Belady在1969年发现的因此以他的名字命名。经典演示案例手把手推演使用著名的Belady异常访问序列1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5情况一分配 3 个内存块FIFO算法置换过程括号内为被淘汰的页访问页内存块状态队首→队尾是否缺页11✔️ (1)21, 2✔️ (2)31, 2, 3✔️ (3)42, 3, 4 (淘汰1)✔️ (4)13, 4, 1 (淘汰2)✔️ (5)24, 1, 2 (淘汰3)✔️ (6)51, 2, 5 (淘汰4)✔️ (7)11, 2, 5命中21, 2, 5命中32, 5, 3 (淘汰1)✔️ (8)45, 3, 4 (淘汰2)✔️ (9)55, 3, 4命中3个内存块时缺页次数 9次。情况二分配 4 个内存块同样用FIFO访问页内存块状态队首→队尾是否缺页11✔️ (1)21, 2✔️ (2)31, 2, 3✔️ (3)41, 2, 3, 4✔️ (4)11, 2, 3, 4命中21, 2, 3, 4命中52, 3, 4, 5 (淘汰1)✔️ (5)13, 4, 5, 1 (淘汰2)✔️ (6)24, 5, 1, 2 (淘汰3)✔️ (7)35, 1, 2, 3 (淘汰4)✔️ (8)41, 2, 3, 4 (淘汰5)✔️ (9)52, 3, 4, 5 (淘汰1)✔️ (10)4个内存块时缺页次数 10次。结论内存块从3个增加到4个缺页次数反而从9次上升到了10次——这就是Belady异常。为什么FIFO会出现这种“反直觉”现象FIFO只关注年龄它淘汰的是在内存中停留时间最长的页而不在乎这个页是否马上要用。增加内存块改变了“淘汰时间窗口”当你有3个块时某些关键页如页1恰好会在“安全期”被淘汰当你有4个块时淘汰节奏被打乱导致一个本不该淘汰的页如页5在关键节点被保留了下来反而把另一些更早需要用到的页挤出去了从而引发后续更多的连续缺页。哪些算法不会发生Belady异常LRU最近最少使用、最佳置换算法OPT等算法具有“栈性质”Stack Property。栈性质意味着内存块数增加时任意时刻内存中驻留的页面集合一定是块数较少时的集合的超集即包含关系。增加内存只会增加保留的页面绝不会丢掉块数少时能保留的页面因此缺页次数必然减少或不变。正是由于FIFO存在这种致命缺陷现代操作系统通常不会将FIFO用作主置换算法而更多地使用LRU的近似算法如Clock算法。分区存储管理分区存储管理是早期多道程序系统中为了支持多个程序同时在内存中运行而采用的一种连续分配存储管理方案。它的核心思想是把内存的用户区域除操作系统占用外的部分划分为若干个分区每个分区在任意时刻只装入一道程序从而实现多道程序并发执行。1. 核心原理物理上连续一个分区一道程序分区存储管理的核心假设是程序必须装入一个连续的内存区域才能运行。系统通过基址寄存器和限长寄存器或上界/下界寄存器来实现地址映射和保护逻辑地址 → 物理地址程序中的地址逻辑地址 基址寄存器中的基值 实际物理内存地址。保护机制限长寄存器检查该地址是否在分区边界内防止越界。2. 两大类固定分区 vs 动态分区可变分区对比维度固定分区静态分区动态分区可变分区划分时机系统初始化时划分分区大小和数量固定不变。作业装入时动态划分分区大小随作业需求而定。分区数量固定内存中同时存在的分区数量不变。动态变化随着进程创建/撤销而增减分区。作业大小限制作业必须 ≤ 最大分区大小若作业小于分区则产生内部碎片。作业大小受限于当前剩余总内存无内部碎片但会产生外部碎片。内存利用率较低内部碎片浪费。较高但需解决外部碎片问题。典型算法无复杂放置策略依次装入对应分区。首次适应、最佳适应、最差适应、循环首次适应用于管理空闲分区表/链。3. 动态分区的放置算法在动态分区中当有多个空闲分区可供选择时采用哪种策略直接影响碎片情况首次适应First Fit从头开始找找到第一个能装下的空闲分区。实现简单综合性能较好保留大块分区在尾部。最佳适应Best Fit遍历所有空闲分区找最小且能装下的分区。会产生大量难以利用的外部碎片。最差适应Worst Fit找最大的空闲分区。产生的大碎片少但容易耗尽大块内存。循环首次适应Next Fit从上一次结束位置继续往后找避免了频繁扫描头部但内存利用率通常不如首次适应。4. 优点与缺点优点实现简单硬件支持仅需基址寄存器和限长寄存器地址变换速度快。管理开销小无需维护复杂的页表或段表。支持多道程序实现了多道程序并发提升了CPU和内存利用率相比单一连续分配。缺点碎片问题严重内部碎片固定分区分配给作业的分区有剩余空间无法使用。外部碎片动态分区随着进程的撤销和装入内存中会散布大量小碎片虽然总和足以装入一个新作业但不连续导致无法利用需要采用紧凑Compaction技术来移动进程但开销极大。作业大小受物理内存限制一个作业必须一次性全部装入内存才能运行这一点我们刚刚在“非虚拟存储器”的题中强调过。如果程序大于物理内存仅靠分区管理无法运行。不支持虚拟内存无法实现程序的部分装入和按需换入换出无法突破物理内存的容量限制。