操作系统笔记:内存 (下)

说明:本文为个人学习笔记,内容参考王道《操作系统》网课与配套讲义,按个人理解整理总结,仅用于学习交流,如有疏漏欢迎指正。 内存空间的扩充 覆盖 为了解决程序大小超过物理内存总和的问题, 引入了覆盖技术 思想 将程序分为多个段(多个模块) 常用的段常驻内存, 不常用的段在需要时调入内存 内存中分为一个"固定区", 和若干个"覆盖区" 区域类型 存放内容 调度规则 固定区 程序中需要常驻的核心段 调入后永久驻留,仅在程序运行结束时才调出 覆盖区 不常用、非核心的功能段 按需动态调度:用时调入,不用时调出,可被其他段覆盖 例子 注: 在计算机里,“透明”= 用户完全不用管,系统自动帮你做好。反过来,“不透明”= 用户必须手动操心、手动配置,系统不会自动帮你做。 为什么这叫 “不透明”? 现代虚拟内存(分页 / 分段):程序员完全不用管内存,写代码时默认 “内存无限大”,系统自动帮你换入换出,这就是透明。 覆盖技术:程序员必须深度参与内存管理,从拆分段、设计覆盖区、声明结构,到保证调用逻辑,全要手动搞定,系统只负责执行你写的规则,不会帮你做任何决策。 交换 思想 内存空间紧张时,系统将内存中某些进程暂时换出外存,把外存中某些已具备运行条件的进程换入内存(进程在内存与磁盘间动态调度) 在进程因为内存紧张被调出的时候, 进程的PCB需要留在内存(进入挂起队列), 即常驻内存, 这是因为在PCB中可以记录进程被调出到外存的具体位置 暂时换出外存等待的进程状态为挂起状态 问题 1) 应该在外存的什么位置保存被换出的进程? 在支持对换功能的操作系统中,磁盘空间会被划分为文件区和对换区两个独立部分,二者的管理逻辑完全围绕各自的核心目标设计。 文件区主要用于存放各类持久化的用户文件与程序数据,核心追求是存储空间的利用率,因此采用离散分配的方式来减少空间浪费、提升存储效率 而对换区仅占用磁盘的一小部分空间,专门用于临时存放被换出内存的进程数据,由于对换的 I/O 速度直接影响系统的整体运行效率,所以对换区的管理以换入换出速度为核心目标,通常采用连续分配的方式来减少磁盘寻道时间、提升读写效率,最终实现对换区的 I/O 速度远快于文件区,保障进程调度的高效性。 2) 什么时候应该交换 交换通常发生在许多进程运行且内存吃紧时进行, 而系统负荷降低就暂停 3) 应该换出哪些进程 可优先换出阻塞进程 换出优先级低的进程 为了防止优先级低的进程在被调入内存后很快又被换出, 有的系统还会考虑进程在内存的驻留时间(PCB常驻内存, 并不会被换出外存) 虚拟存储技术 传统存储管理方式的特征和缺点 一次性: 作业必须一次性全部装入内存后才能开始运行, 这会造成两个问题 : 作业很大时, 不能全部装入内存, 导致大作业无法运行 当大量作业要求运行时, 由于内存无法容纳所有作业, 因此只有少量作业能运行, 导致多道程序并发度下降 驻留性: 一旦有作业被装入内存, 就会一直驻留在内存中, 直至作业运行结束. 事实上, 在一个时间段内, 只需要访问作业的一小部分数据即可正常运行, 这就会到时了内存中驻留大量的, 暂时用不到的数据, 造成内存资源浪费 虚拟内存的定义和特征 定义 程序装入时,仅将很快会用到的部分装入内存,暂时用不到的部分留在外存,程序即可开始执行。 程序执行中,若访问的信息不在内存,由操作系统将所需信息从外存调入内存,再继续执行。 若内存空间不足,由操作系统将内存中暂时用不到的信息换出到外存。 在操作系统管理下,用户看来有一个比实际内存大得多的内存,这就是虚拟内存。 特征 多次性:无需在作业运行时一次性全部装入内存,允许被分成多次调入内存。 对换性:在作业运行时无需一直常驻内存,允许在作业运行过程中,将作业换入、换出。 虚拟性:从逻辑上扩充了内存的容量,使用户看到的内存容量远大于实际的容量。 如何实现虚拟内存技术 虚拟内存技术,允许一个作业分多次调入内存。如果采用连续分配方式,会不方便实现。因此,虚拟内存的实现需要建立在离散分配的内存管理方式基础上。 ...

2026年4月5日 · 3 分钟 · W1shBottle

操作系统笔记:内存 (中)

说明:本文为个人学习笔记,内容参考王道《操作系统》网课与配套讲义,按个人理解整理总结,仅用于学习交流,如有疏漏欢迎指正。 摘要 本文整理操作系统内存管理中三类经典机制与考点: 基本分页存储管理:页表、地址变换、TLB、两级页表 基本分段存储管理:段表、越界检查、分段与分页对比 段页式管理方式:分段 + 分页结合后的地址转换 一、基本分页存储管理 1. 概念 将内存空间分为一个个大小相等的分区,每个分区称为一个 “页框”(页框 = 页帧 = 内存块 = 物理块 = 物理页面)。 将进程的逻辑地址空间也分为与页框大小相等的一个个部分,每个部分称为 “页”/“页面”。 每个页面有一个编号,称为 页号(从 0 开始) 操作系统以页框为单位为进程分配内存 进程的各页面与内存页框存在映射关系 各页面不必连续存放,可装入不相邻页框中(离散分配) 为了知道进程的每个页面在内存中存放的位置,操作系统要为每个进程建立一张页表(通常存放在 PCB 中): 一个进程对应一个页表 进程的每个页面对应一个页表项 每个页表项由 “页号” 和 “块号” 组成(逻辑概念) 页表记录页号与内存块号(页框号)的映射关系 每个页表项的长度是一样的 1.1 每个页表项占多少字节? 页表项逻辑上分为页号和块号,但通常只有 块号(以及控制位) 真正占存储空间;页号可以隐含(类比数组下标)。 注意:页表记录的是 内存块号,而不是内存块的起始地址。 j 号内存块的起始地址 = j × 内存块大小 2. 地址转换 2.1 连续存储(对比理解) 当进程在内存中连续存储时,重定位寄存器记录进程在内存中的起始位置,则: 物理地址 = 逻辑地址 + 起始位置 2.2 分页存储下的地址转换 当使用分页存储时,若要访问逻辑地址 A: 确定逻辑地址 A 对应的 页号 P 查页表找到 P 号页面在内存中的起始位置(通过页框号计算) 确定逻辑地址 A 的 页内偏移量 W 因此: ...

2026年4月3日 · 2 分钟 · W1shBottle

操作系统笔记:内存 (上)

说明:本文为个人学习笔记,内容参考王道《操作系统》网课与配套讲义,按个人理解整理总结,仅用于学习交流,如有疏漏欢迎指正。 摘要 本文梳理操作系统内存管理中的几个核心概念:内存的作用、地址转换(装入与重定位)、链接方式、内存保护与连续分配策略,并对常见动态分区分配算法进行对比,理解碎片与紧凑的必要性。 内存的作用 程序在执行前需要先装入内存,CPU 才能对其进行处理。内存的核心作用之一是缓和 CPU 与硬盘之间的速度矛盾: 硬盘/外存先把即将使用的数据读取到内存; CPU 需要数据时直接访问内存,而不必反复访问硬盘; 从而显著提升整体执行效率。 地址转换(装入与重定位) 1)绝对装入(Absolute Loading) 特点: 程序装入内存之前就确定装入位置,在编译阶段就把逻辑地址直接转换为最终物理地址。 前提: 必须提前知道装入模块从哪个物理地址开始装入。 缺点: 灵活性极差:装入位置变化会导致地址全部失效。 2)静态重定位(Static Relocation) 特点:重定位过程在装入时完成。 例:若装入起始物理地址为 100,则所有与地址相关的值统一加上 100。 限制: 作业装入内存时一次性分配其所需全部空间; 运行期间不可移动(无法在内存中动态搬迁)。 3)动态重定位(Dynamic Relocation,现代 OS 常用) 特点: 编译/链接阶段仍使用逻辑地址; 装入内存后不立即把逻辑地址改写成物理地址; 运行时由硬件机制完成转换。 关键硬件支持: 重定位寄存器(Relocation Register):存放装入模块的起始物理地址(基址)。 地址转换: CPU 执行时:物理地址 = 逻辑地址 + 重定位寄存器(基址) 优势: 允许程序在内存中发生移动(更灵活,也更利于多道程序和内存紧凑)。 从写程序到程序运行(以 C 语言为例) 编写源代码:生成 *.c 编译:生成目标模块 *.o 链接:把多个目标模块 + 库函数链接成装入模块(可执行文件)*.exe 装入:把装入模块装入内存,此时确定其对应的实际物理地址范围 链接方式 1)静态链接 在运行前,把各目标模块及其所需库函数连接成一个完整可执行文件,之后不再拆分。 2)装入时动态链接 边装入边链接:装入模块进内存时再完成链接。 3)运行时动态链接 程序执行过程中,需要某个目标模块时才链接。 优点: 便于修改、更新; 便于实现对目标模块的共享(多个进程可共享同一模块)。 内存保护 1)设置上下限寄存器(Limit Registers) 上下限寄存器存放进程的地址范围(通常是物理地址上下界)。 进程访问某地址时,CPU 检查是否越界,越界则触发异常。 2)重定位寄存器 + 界地址寄存器 重定位寄存器(基址):起始物理地址 界地址寄存器(界限/长度):进程最大逻辑地址(或逻辑地址范围大小) 检查逻辑地址是否小于 界地址,通过后再做 逻辑地址 + 基址 得到物理地址。 ...

2026年3月30日 · 1 分钟 · W1shBottle