内存的分页分段介绍
操作系统内存管理通过分页和分段将进程的逻辑地址映射到物理地址,提高内存利用率和保护性: - 分页:将内存分为固定大小的页面(Page),实现离散分配,解决外部碎片。 - 分段:将内存按逻辑模块(如代码、数据)分段,支持动态大小,符合程序结构。
1. 分页(Paging)
是什么
分页将逻辑地址和物理内存分成固定大小的块(通常 4KB),逻辑块称页面(Page),物理块称页面框架(Frame)。通过页表映射页面到框架。
工作原理
- 地址结构:
- 逻辑地址 = 页号(Page Number)+ 页内偏移(Offset)。
- 示例:32 位地址,页大小 4KB(2¹²),页号 20 位,偏移 12 位。
- 页表:
- 记录页号到物理框架的映射。
- 由操作系统维护,硬件(如 MMU)查询。
- 转换过程:
- CPU 产生逻辑地址。
- MMU 用页号查页表,获取框架号。
- 框架号 + 偏移 = 物理地址。
示例
- 逻辑地址:
0x00001000
(页号 1,偏移 0)。 - 页表:页 1 -> 框架 5(物理基址
0x5000
)。 - 物理地址:
0x5000
。
特点
- 优点:
- 无外部碎片,固定大小便于分配。
- 支持虚拟内存(页面换入换出)。
- 缺点:
- 内部碎片:页面未用满浪费。
- 页表开销:大内存需多级页表。
2. 分段(Segmentation)
是什么
分段将进程按逻辑单位(如代码段、数据段)划分成大小可变的段(Segment),每个段有独立基址和长度,通过段表映射到物理内存。
工作原理
- 地址结构:
- 逻辑地址 = 段号(Segment Number)+ 段内偏移(Offset)。
- 段表:
- 记录段号到物理基址和段长度的映射。
- 检查偏移是否超限。
- 转换过程:
- CPU 产生逻辑地址。
- MMU 用段号查段表,获取基址和长度。
- 若偏移 < 长度,基址 + 偏移 = 物理地址。
示例
- 逻辑地址:段 0,偏移 100。
- 段表:段 0 -> 基址
0x2000
,长度 500。 - 物理地址:
0x2000 + 100 = 0x2064
。
特点
- 优点:
- 符合程序逻辑(如代码、栈分离)。
- 支持动态增长(段长可变)。
- 缺点:
- 外部碎片:段大小不一,分配后留空隙。
- 管理复杂:需段表和边界检查。
3. 分页 vs 分段
维度 | 分页 | 分段 |
---|---|---|
划分单位 | 固定大小页面(如 4KB) | 可变大小段(逻辑模块) |
地址结构 | 页号 + 偏移 | 段号 + 偏移 |
映射表 | 页表 | 段表 |
碎片 | 内部碎片 | 外部碎片 |
分配方式 | 离散分配 | 连续分配 |
逻辑性 | 无逻辑意义 | 反映程序结构 |
应用 | 虚拟内存、现代 OS | 早期 OS 或混合使用 |
综合示例
- 分页:进程占用页面 1、3、5(物理框架 2、4、6)。
- 分段:进程分代码段(0x1000-0x1500)、数据段(0x2000-0x2500)。
4. 分段分页结合
是什么
现代操作系统(如 Linux)常结合使用分段分页: - 分段:逻辑划分(如代码、数据)。 - 分页:段内再分页,映射到物理内存。
实现
- 逻辑地址:段号 + 页号 + 偏移。
- 过程:
- 段表 -> 段基址(页面起始)。
- 页表 -> 物理框架。
- 框架 + 偏移 -> 物理地址。
示例(Linux)
- 段:用户代码段(
0x08048000
)。 - 页面:4KB 分页,映射到物理内存。
延伸与面试角度
- 分页优化:
- 多级页表:减少页表内存。
- TLB:缓存页表,提升速度。
- 分段问题:
- 碎片整理:移动段或分页解决。
- 实际应用:
- 分页:Windows、Linux 虚拟内存。
- 分段:x86 早期模式。
- 面试点:
- 问“区别”时,提碎片和逻辑。
- 问“结合”时,提 Linux 实现。
总结
分页用固定页面管理内存,无外部碎片,适合虚拟内存;分段按逻辑分块,灵活但有外部碎片。两者结合兼顾效率和结构。面试时,可画地址转换图或提 TLB,展示理解深度。