第三章 内存
第三章 内存
内存基础知识
内存管理概念
内存保护
内存映像
覆盖与交换
内存分配(连续分配方式)
内存分配(动态分配方式)
分页存储管理
- 进程的逻辑地址空间——页表——内存块——内存的关系
1. 进程拥有独立的进程空间,每一个进程空间也是“页管理”
2. 页表:页号(隐含)+块号。块既对应逻辑空间的页,也对应物理空间的页(内存块)
3. 内存块:在物理空间的“页框”
三者的“页”(最小管理单元)对应,但是大小可能不同。页表更倾向于一种记录型的映射结构注意:页表项并不是和内存块一一对应的
如何实现地址转换
2的整数次幂使得在计算页号和偏移量时更快
逻辑地址转换为物理地址的四件事:
1. 由 逻辑地址 获得页号、页内偏移量
2. 通过 页表 获得 页块
3. 计算 物理地址 = 页块 * 页大小 + 页内偏移量
注意:由于 乘法 的效率很低,所以当使用 2 的整数次幂时,会发现,在 32 位计算机中,页大小为 4KB = 2的12次方,因此,32位的前20位为整数位(页号),后12位为余数位(页内偏移量)的二进制表示。因此可以更快的拆分出 页号 + 页内偏移量
页表寄存器:存储 页表 的 页表起始地址 和 页表长度(一种基于内存的地址变换机构)
页表项大小的进一步探讨:
具有快表的地址变换结构:(基于 cpu高速缓存)
访存:访问内存(查询慢表、目标内存单元速度相同)
两级页表
这里其实说的是:页表结构也需要存在内存中,每一个页表很大,一个页表项一般为4kb,一般页表大小为2的20次方个页表项。一个内存块就是一个页面但是:如果整个页表都存在内存中,就需要一段很大的连续内存,而且可能产生页内碎片。这与我们离散型存储的思想相悖。所以我们对页表页进行离散式的存储。设置二级页表,用于记录 页表号、内存块号。根据页表号找到对应的内存块。然后就是典型的单级页表的查询方式了。这样情况下,原先的地址,比如32位:前10位为 页表号,中间10位为 页号,后面11位 为页内偏移量
总结:
分段存储管理
分段和分页的对比
段页式管理方式
虚拟内存
请求分页管理方式
页面置换算法
目的:选择换出哪个页面。尽量降低缺页率。
缺页率 = 缺页次数 / 整体请求页数量
最佳置换算法(opt)
简单的说,就是换出长时间不会被访问的页面。(理想化:因为不能预知之后要使用的页面序列)
性能最好(条件:可预知)
先进先出置换算法(FIFO)
算法性能最差
最近最久未使用置换算法(LRU)
时钟置换算法(CLOCK)
页面分配策略
何时调入?
何处调入?
工作集:为了解决抖动(颠簸)现象
抖动(颠簸)现象:页面频繁换入换出的现象。主要原因:分配给进程的物理块不够
内存映射文件
操作系统内存管理总结
一、内存管理概述
- 核心目标:高效、安全地分配和管理内存资源,提升内存利用率,保障多进程间内存隔离与数据安全。
- 关键功能:内存分配与回收、内存保护、地址映射、内存扩充(虚拟内存技术)。
二、内存管理基本技术
(一)连续分配管理方式
- 单一连续分配
- 特点:内存分为系统区和用户区,仅允许单个用户进程运行。
- 优缺点:实现简单,但内存利用率极低,仅适用于单道程序环境。
- 固定分区分配
- 特点:将内存划分为若干固定大小的分区,每个分区可装入一个进程。
- 优缺点:支持多道程序,存在内部碎片(分区内未被利用空间),分区大小固定导致大进程无法装入。
- 动态分区分配(可变分区分配)
- 特点:根据进程实际需求动态划分内存分区,分区大小随进程变化。
- 内存分配算法
- 首次适应算法:从低地址开始查找第一个足够大的空闲分区,简单高效,易产生碎片。
- 最佳适应算法:选择与进程大小最接近的空闲分区,易产生大量微小碎片。
- 最坏适应算法:选择最大的空闲分区,减少碎片但可能导致大分区被分割。
- 优缺点:无内部碎片,但存在外部碎片(分散的小空闲分区),需紧凑技术(内存移动合并碎片)辅助。
(二)非连续分配管理方式
- 分页存储管理
- 基本思想:将内存和进程划分为大小相等的页(内存物理块)和页框,通过页表实现逻辑地址到物理地址的映射。
- 关键概念
- 页号:逻辑地址高位,对应页表索引。
- 页内偏移量:逻辑地址低位,确定页内具体位置。
- 页表:记录页号与物理块号的映射关系,存于内存,查询需一次访存。
- 优缺点:无外部碎片,内存利用率高,支持虚拟内存;存在页内碎片(每页最后部分可能未被利用),地址转换开销较大。
- 分段存储管理
- 基本思想:按程序逻辑结构(如代码段、数据段、栈段)划分为若干段,每段有独立段名和长度,通过段表映射逻辑段到物理内存。
- 关键概念
- 段号:逻辑地址高位,标识段类型和功能。
- 段内偏移量:逻辑地址低位,确定段内具体位置。
- 段表:记录段号、段长和基址,检查偏移量是否越界(段内偏移量≤段长)。
- 优缺点:便于程序模块化设计和共享,支持动态链接;存在外部碎片,地址转换需两次访存。
- 段页式存储管理
- 基本思想:结合分段和分页,先将进程分为若干段,每段再划分为若干页,通过段表和页表实现两级地址映射。
- 地址转换过程:逻辑地址→段表(查段对应的页表基址)→页表(查页对应的物理块号)→物理地址,需三次访存(引入快表可加速)。
- 优缺点:兼具分段和分页优势,减少碎片,支持动态链接和共享;结构复杂,地址转换开销大。
三、虚拟内存技术
(一)核心思想
- 基于局部性原理(进程在一段时间内集中访问部分区域),允许进程仅装入部分页面 / 段到内存,其余数据存于外存,运行时按需调入(请求调页 / 段),实现 “内存不足时运行大程序” 的效果。
(二)关键技术
-
请求分页存储管理
-
与分页的区别:页表增加状态位(是否在内存)、访问位(记录访问频率)、修改位(是否被修改),支持缺页中断(进程访问不在内存的页时触发,调入页面)。
-
页面置换算法
:当内存无空闲块时,选择淘汰页面的策略。
- 最佳置换算法(OPT):理论上最优,淘汰最远将来才使用的页,无法实现,用于性能对比。
- 先进先出算法(FIFO):淘汰最早进入内存的页,可能产生 “Belady 现象”(增加物理块数反而使缺页率上升)。
- 最近最久未使用算法(LRU):淘汰最长时间未访问的页,需记录页访问时间,硬件成本高(可用寄存器或栈实现近似算法)。
- Clock 算法(最近未使用算法,NRU):通过访问位标记页是否被访问,淘汰未被访问的页,简单高效。
-
-
请求分段存储管理:类似请求分页,增加段的状态位和缺段中断,支持段的动态增长和共享。
(三)内存扩充效果
- 逻辑地址空间远大于物理内存空间,提升多道程序并发度,但需注意缺页 / 段率过高导致的 “抖动”(频繁内外存交换,系统性能急剧下降)。
四、内存保护机制
- 目的:防止进程越权访问或破坏其他进程 / 系统内存数据。
- 实现方式
- 界限寄存器:设置上下界寄存器,检查进程访问地址是否在合法范围内。
- 存储键与访问权字节:内存块分配存储键,进程持访问权字节(密钥),匹配则允许访问。
- 与地址映射结合:在地址转换过程中同步检查访问权限,确保安全。
五、总结对比
管理方式 | 连续 / 非连续 | 主要碎片类型 | 典型应用场景 |
---|---|---|---|
单一连续分配 | 连续 | 无(仅单进程) | 早期单用户系统(如 DOS 雏形) |
固定分区分配 | 连续 | 内部碎片 | 简单多道程序系统(如早期批处理系统) |
动态分区分配 | 连续 | 外部碎片 | 需动态适应进程大小的系统(需紧凑技术) |
分页管理 | 非连续 | 页内碎片(内部) | 现代操作系统基础(如 Linux 内存管理基础) |
分段管理 | 非连续 | 外部碎片 | 支持程序模块化的系统(如早期 UNIX) |
段页式管理 | 非连续 | 页内碎片 | 复杂系统(如 Windows 早期版本) |
虚拟内存(请求分页 / 段) | 非连续 | 页内碎片 + 外部碎片(通过置换算法缓解) | 多任务、大程序运行的现代系统(如 Linux、Windows) |
重点总结:内存管理围绕 “高效分配、安全隔离、虚拟扩充” 展开,连续分配简单但碎片问题严重,非连续分配(分页 / 分段)是主流,虚拟内存技术突破物理内存限制,保护机制确保系统稳定。不同场景需权衡碎片、性能和实现复杂度选择合适方案。