Skip to content

内存的分页分段介绍

操作系统内存管理通过分页分段将进程的逻辑地址映射到物理地址,提高内存利用率和保护性: - 分页:将内存分为固定大小的页面(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,展示理解深度。