段式存储、页式存储、段页式存储:三种内存管理策略的演进与权衡
段式存储、页式存储、段页式存储:三种内存管理策略的演进与权衡
在现代操作系统与计算机体系结构中,内存管理单元(MMU)通过“段”“页”两种粒度把逻辑地址映射到物理地址。段式、页式、段页式三种机制决定了地址转换效率、内存碎片、共享与保护能力,是操作系统、编译器、虚拟化、嵌入式系统设计的核心基础。
一、三种机制总览
维度 | 段式存储 | 页式存储 | 段页式存储 |
---|---|---|---|
逻辑划分单位 | 段(Segment) | 页(Page) | 先分段再分页 |
物理划分单位 | 连续物理块 | 固定大小页框 | 段内再分页 |
地址结构 | 段号+段内偏移 | 页号+页内偏移 | 段号+页号+页内偏移 |
碎片类型 | 外部碎片 | 内部碎片 | 外部+内部(可控) |
共享粒度 | 段级共享 | 页级共享 | 段级共享+页级映射 |
硬件支持 | 段表寄存器、界限寄存器 | TLB、页表寄存器 | 段表+页表+TLB |
典型系统 | 早期 80286、Unix System V | x86 32/64 位、ARMv8 | x86 保护模式、Linux 用户态 |
二、知识点详解
2.1 段式存储(Segmentation)
段式存储把程序按逻辑意义划分为若干“段”,如代码段、数据段、堆段、栈段。每个段在内存中占据一段连续区域,由操作系统维护一张段表(Segment Table),表项包含:
- 段基址(Base):段在物理内存的起始地址
- 段界限(Limit):段的最大长度
- 保护位:读/写/执行权限
- 存在位、有效位等
地址转换过程:
逻辑地址 = 段号 + 段内偏移
若偏移 ≤ Limit,则物理地址 = Base + 偏移;否则触发段越界异常。
优点
- 逻辑与物理视图一致,便于共享、保护、动态扩展。
- 支持可变长段,无内部碎片。
缺点
- 段长可变,频繁分配/释放导致外部碎片严重。
- 需要连续物理区域,内存利用率随运行时间下降。
2.2 页式存储(Paging)
页式存储把逻辑地址空间与物理地址空间都划分为固定大小的块,分别称为“页”与“页框”(Frame)。操作系统维护页表(Page Table),页表项(PTE)包含:
- 页框号(Frame Number)
- 有效位、脏位、访问位
- 保护位、缓存禁用位等
地址转换过程:
逻辑地址 = 页号 + 页内偏移
页号作为索引查页表得页框号,再拼接页内偏移即得物理地址。现代 CPU 通过 TLB(快表)缓存近期 PTE,加速转换。
优点
- 固定大小分配,无外部碎片。
- 支持离散分配,提高内存利用率。
- 易于实现共享、写时复制、按需调页(Demand Paging)。
缺点
- 存在内部碎片:平均浪费半页。
- 页表本身占用内存;多级页表、反向页表、哈希页表等结构增加复杂度。
2.3 段页式存储(Segmented Paging)
段页式存储是前两者的折中:先按逻辑意义分段,再把每个段内部按固定大小分页。逻辑地址被划分为:
段号 | 页号 | 页内偏移
硬件需维护两级结构:
- 段表:记录每个段的页表起始地址与页表长度。
- 页表:记录段内各页对应的页框号。
地址转换流程:
段号 → 查段表得页表基址 → 页号 → 查页表得页框号 → 拼接页内偏移 → 物理地址。
优点
- 兼具段的逻辑可管理性与页的无外部碎片优势。
- 支持段级保护、共享,同时允许段内离散分配。
- 可通过多级页表、TLB 进一步优化。
缺点
- 地址转换需两次查表(段表+页表),增加延迟;需硬件 TLB 缓解。
- 实现复杂,需要操作系统与 MMU 协同维护两级表结构。
三、总结与对比
比较维度 | 段式 | 页式 | 段页式 |
---|---|---|---|
碎片 | 外部碎片 | 内部碎片 | 内部碎片(可控) |
连续需求 | 必须连续 | 离散 | 段内离散 |
共享粒度 | 段级 | 页级 | 段级+页级 |
地址转换 | 一次加法 | 一次查表 | 两次查表 |
硬件支持 | 段寄存器+界限 | TLB+页表寄存器 | 段表+页表+TLB |
典型应用 | 早期 80286、嵌入式 RTOS | 现代通用 OS | x86 保护模式、Linux 用户态 |
架构师洞见
- 在 64 位系统与虚拟化场景下,纯段式已退出历史舞台,但“段”概念仍用于权限隔离(x86 FS/GS 段、ARMv8 TBI)。
- 页式是现代操作系统与硬件的默认选择,TLB 命中率与页表级数直接影响性能;大页(HugePage)、五级页表、IOMMU 是演进方向。
- 段页式在需要逻辑隔离与离散分配并存的场景(如微内核、可信执行环境)仍有价值,未来或将以“域-页”两级映射形式回归。