内存管理概念
1. 内存管理的基本功能
内存管理是操作系统核心模块,需实现以下功能:
- 分配与回收:管理内存空闲空间,为进程分配内存,回收终止进程的内存。
- 地址转换:将程序的逻辑地址映射为内存的物理地址(重定位)。
- 内存扩充:通过虚拟存储技术(如分页/分段)从逻辑上扩充内存。
- 内存共享:允许多进程访问同一内存区域(如共享库代码)。
- 存储保护:确保进程仅访问自己的内存空间,防止越界和干扰。
2. 逻辑地址与物理地址
类型 | 定义 | 特点 |
逻辑地址 | 程序编译/链接后生成的地址(从0开始),进程运行时使用。 | 进程私有,允许不同进程地址重叠(独立空间)。 |
物理地址 | 内存中实际存储单元的地址(硬件地址)。 | 全局唯一,是CPU访问内存的最终地址。 |
地址重定位:将逻辑地址转换为物理地址的过程,分为:
- 静态重定位:装入时一次性完成(程序运行时不可移动)。
- 动态重定位:执行时通过重定位寄存器动态转换(程序可移动,支持非连续分配)。
3. 程序的装入与链接
将用户源程序变为可在内存中执行的程序,通常需要以下几个步骤:
- 编译。由编译程序将用户源代码编译成若干目标模块。
- 链接。由链接程序将编译后形成的一组目标模块,以及它们所需的库函数链接在一起,形成一个完整的装入模块。
- 装入。由装入程序将装入模块装入内存运行。
(1)装入方式
方式 | 时机 | 特点 |
绝对装入 | 单道程序环境,编译时确定物理地址。 | 逻辑地址=物理地址,仅适用于静态内存分配。 |
静态重定位 | 装入时完成地址转换。 | 需分配连续内存,运行中不可移动、不可扩存。 |
动态重定位 | 执行指令时动态转换地址。 | 支持非连续分配、动态扩存,需硬件(重定位寄存器)支持。 |
(2)链接方式
方式 | 时机 | 优点 |
静态链接 | 程序运行前,链接为完整模块。 | 运行时无需再链接,速度快。 |
装入时动态链接 | 装入内存时边装边链。 | 便于修改模块、共享目标代码。 |
运行时动态链接 | 程序执行中需调用模块时链接。 | 节省内存(未用模块不装入),加快启动速度。 |
4. 进程的内存映像
进程在内存中的布局(从低地址到高地址):
- 代码段(.text):只读的可执行指令,可共享(如共享库)。
- 数据段(.data/.bss):全局变量和静态变量(.data初始化,.bss未初始化/初始化为0)。
- 堆:动态分配空间(如
malloc
),从低地址向高地址增长。 - 栈:函数调用栈(局部变量、返回地址),从高地址向低地址增长。
- PCB:进程控制块,存放于系统区(内核空间)。
5. 内存保护机制
确保进程互不干扰,核心是越界检查,两种实现方式:
- 上下限寄存器:存放进程内存的最小/最大物理地址,访问地址需在范围内。
- 基址+限长寄存器:
- 基址寄存器(重定位寄存器):存放进程起始物理地址(逻辑地址+基址=物理地址)。
- 限长寄存器:存放进程最大逻辑地址(逻辑地址>限长则越界)。
特权控制:基址/限长寄存器仅能由内核通过特权指令修改,防止用户进程篡改。
6. 内存共享
- 共享对象:只读区域(如可重入代码、共享库),多进程可共享同一份物理内存。
- 实现方式:
- 分页系统:各进程页表中对应共享页的页表项指向同一物理页。
- 分段系统:共享段在各进程段表中对应段表项指向同一物理段(更灵活)。
- 优势:节省内存(如40个用户共享160KB文本编辑器代码,仅需1份副本)。
7. 内存分配方式演变
随OS发展,分配方式从简单到复杂:
- 单一连续分配:单道程序,内存分为系统区和用户区(利用率低)。
- 固定分区分配:多道程序,内存划分为固定大小分区(内部碎片)。
- 动态分区分配:根据进程需求动态划分分区(外部碎片)。
- 离散分配:分页/分段存储管理,将进程分散装入内存(无连续内存要求,利用率高)。
核心考点
- 逻辑地址vs物理地址:逻辑地址是进程视角,物理地址是硬件视角,通过重定位转换。
- 动态重定位:需重定位寄存器,支持程序移动和非连续分配,是现代OS的基础。
- 内存保护:基址+限长寄存器实现越界检查,确保进程隔离。
- 内存共享:仅只读区域可共享(如代码段),通过页表/段表指向同一物理内存实现。
总结
内存管理核心功能与机制 内存管理负责分配/回收内存、地址转换(逻辑→物理)、虚拟扩充及共享保护。逻辑地址为进程私有,物理地址全局唯一,通过静态或动态重定位转换。程序需经编译、链接(静态/动态)和装入(绝对/重定位)加载到内存,进程映像包含代码段、数据段、堆栈等。内存保护通过基址+限长寄存器实现越界检查,共享仅限只读区域(如代码段)。分配方式从单一连续到离散(分页/分段),动态重定位和离散分配提升利用率。核心在于地址转换、空间分配及保护共享,离散分配为现代OS高效管理关键
✨ 一句话记忆:内存管理核心是“地址转换(逻辑→物理)、空间分配(连续/离散)、保护共享(隔离与复用)”,动态重定位和离散分配是现代OS高效利用内存的关键! ✨