操作系统段页式存储
段页式存储管理是结合了分段和分页优点的离散内存管理方式,本文介绍其逻辑地址结构、两级映射表(段表与页表)的工作原理、地址转换过程及优缺点。
一、定义与本质
段页式存储管理是一种离散分配的内存管理方式,它结合了段式存储的逻辑可读性和页式存储的物理易管理性,将用户作业先按逻辑意义划分为若干段,再将每一段划分为固定大小的页,分配时以页框为单位离散装入内存。
段页式存储的核心思想是取其精华,去其糟粕,用分段满足用户编程、共享、保护的需求,用分页解决分段带来的外部碎片和内存分配复杂的问题。逻辑上,用户看到的仍是二维的段式地址空间;物理上,内存管理以页框为单位进行离散分配。
段页式可视为“在段式基础上套了一层页式”,等价于“两次映射”:先将逻辑段映射到段内的虚拟页,再将虚拟页映射到物理页框。
二、核心概念与结构
1. 段、页与页框
| 术语 | 所属空间 | 说明 |
|---|---|---|
| 段 | 逻辑地址空间 | 按逻辑意义划分,长度可变,但必须是页大小的整数倍 |
| 页 | 逻辑段内部 | 每段被划分为固定大小的页面,从0开始编号 |
| 页框 | 物理地址空间 | 内存被划分的等大单元,大小与页相等 |
| 段内页号 | 逻辑地址中间层 | 标识数据在某段内的第几页 |
| 页内偏移 | 地址低位 | 表示数据在该页内的具体位置 |
页面大小通常为2的整数次幂(如4KB),所有段的页大小相同,但不同段的长度(页数)可以不同。
2. 逻辑地址结构
段页式的逻辑地址是三维分解、二维感知的:
用户视角的逻辑地址:(段号S, 段内地址W)
系统内部将段内地址W再分解为:(段内页号P, 页内偏移D)
完整逻辑地址格式:
虽然系统内部处理时使用三个字段,但用户编程时只感知到(段号, 段内地址),段内分页对用户是透明的。
3. 段表与页表
段页式存储需要两级映射表:
| 表名 | 作用 | 表项内容 |
|---|---|---|
| 段表 | 定位段的页表位置 | 页表长度、页表基址、存取权限等 |
| 页表 | 定位页对应的页框 | 页框号、状态位、访问位、修改位等 |
每个进程拥有一个段表,每个段拥有一个独立的页表。段表本身不存储段的物理位置,而是存储指向该段页表的指针。
| 段表项字段 | 含义 |
|---|---|
| 段号 | 逻辑段的编号(隐含) |
| 页表长度 | 该段包含的页数 |
| 页表基址 | 该段页表在内存中的起始地址 |
| 存取控制 | 该段的读/写/执行权限 |
| 页表项字段 | 含义 |
|---|---|
| 页号 | 段内页的编号(隐含) |
| 页框号 | 该页装入的物理页框编号 |
4. 地址映射过程
段页式地址转换需要两次查表,由MMU硬件完成:
逻辑地址 = (段号S, 段内页号P, 页内偏移D)
转换步骤:
1. 以段号S为索引查段表,获取该段页表的基址B_pt
2. 以段内页号P为索引查该段的页表,获取对应页框号F
3. 若 P ≥ 页表长度,触发越界中断
4. 物理地址 = F × 页面大小 + D
段页式地址转换可以类比“找写字楼里的某间办公室”,段号是写字楼编号(定位哪栋楼),段内页号是楼层号(定位第几层),页内偏移是房间号(定位具体房间)。先找到楼栋(段表),再找到楼层(页表),最后确定房间(页框)。
5. 快表的作用
段页式存储每次访问数据理论上需要三次访存:
- 第一次:查段表,获取页表基址
- 第二次:查页表,获取页框号
- 第三次:取数据
效率仅为无映射时的1/3。因此段页式系统必须依赖快表(TLB)来提升性能。快表中缓存的是一项完整的映射信息:(段号S, 页号P) → 页框号F。
若快表命中,只需一次访存即可取到数据;未命中时则经历完整的三次访存过程。
有效访存时间计算:
EAT = 命中率 × (快表时间 + 一次访存时间)
+ (1-命中率) × (快表时间 + 三次访存时间)
三、与纯分段、纯分页的对比
| 比较维度 | 页式存储 | 段式存储 | 段页式存储 |
|---|---|---|---|
| 划分依据 | 物理等长 | 逻辑意义 | 先逻辑分段,再物理分页 |
| 地址维度 | 一维(用户透明) | 二维(用户可见) | 二维(用户视角)+内部三维 |
| 外部碎片 | 无 | 有 | 无 |
| 内部碎片 | 有(末页平均浪费半页) | 无 | 有(每段末页平均浪费半页) |
| 共享与保护 | 困难(粒度不匹配) | 方便(段级粒度) | 方便(段级粒度) |
| 动态链接 | 困难 | 支持 | 支持 |
| 内存利用率 | 较高 | 较低(外部碎片) | 高 |
| 地址转换开销 | 较小(1次查表) | 较小(1次查表) | 较大(2次查表) |
| 管理复杂度 | 简单 | 复杂(可变分区) | 较复杂(两级映射) |
段页式存储试图兼取两者之长:既获得分段的逻辑优点(便于共享、保护、动态链接),又获得分页的物理优点(消除外部碎片、简化内存分配)。代价是增加了地址映射的复杂度和访存次数。
四、优缺点分析
| 优点 | 缺点 |
|---|---|
| 兼具分段与分页:逻辑清晰且无外部碎片 | 地址转换开销大:两次查表,三次访存(无快表时) |
| 便于共享与保护:以段为单位设置权限,粒度适中 | 硬件支持要求高:需要MMU支持两级地址转换 |
| 支持动态链接与增长:段可动态扩展,以段为单位链接 | 管理复杂度增加:需同时维护段表和每段的页表 |
| 内存利用率高:页框等大分配,消除外部碎片 | 存在内部碎片:每段的最后一页仍有平均半页浪费 |
| 段长不受内存连续性限制:离散分页使段可跨越碎片 | 内存占用更多:段表+多张页表占用额外存储空间 |
五、练习
题目1:在段页式存储管理系统中,逻辑地址由( )三部分组成。
A. 段号、页框号、页内偏移
B. 段号、段内页号、页内偏移
C. 页目录号、页表索引、页内偏移
D. 段号、页号、页框号
答案:B
解析:段页式逻辑地址由段号S、段内页号P、页内偏移D三部分组成。A中的“页框号”是物理地址成分;C描述的是两级页表;D中的“页框号”也是物理概念。注意区分逻辑地址与物理地址的组成。
题目2:段页式存储管理中,每访问一个数据,快表未命中时需要访问内存( )次。
A. 1
B. 2
C. 3
D. 4
答案:C
解析:段页式需要先查段表(第1次访存),再查页表(第2次访存),最后取数据(第3次访存),共3次访存。若快表命中,则快表中直接存储了段号+页号到页框号的映射,跳过前两次访存,只需1次访存取数据。
题目3:在段页式存储管理中,用于实现地址映射的数据结构是( )。
A. 每个进程一个段表,每个段一个页表
B. 每个进程一个页表,每个段一个段表
C. 每个进程一个段表和一个页表
D. 整个系统一个段表,每个进程一个页表
答案:A
解析:段页式系统中,每个进程拥有一个独立的段表(记录各段的页表位置),每个段拥有一个独立的页表(记录该段各页的页框号)。B颠倒了关系;C每个进程只有一个页表是纯分页;D整个系统一个段表是错误的,段表是进程私有的。
题目4:段页式存储管理相较于纯分页管理,主要的优势是( )。
A. 地址转换速度更快
B. 消除了内部碎片
C. 便于实现段的共享与保护
D. 管理数据结构更简单
答案:C
解析:段页式保留了分段的逻辑特性,可以以段为单位设置共享权限和存取控制,这是纯分页难以做到的(分页的物理页框与程序逻辑无关)。A错误,段页式地址转换更慢(两次查表);B错误,段页式仍有内部碎片;D错误,段页式管理更复杂。
题目5:下列关于段页式存储管理的说法,正确的是( )。
A. 段页式管理中,段的大小必须是页大小的整数倍
B. 段页式管理既消除了内部碎片,又消除了外部碎片
C. 段页式管理中的段表项直接存储该段在内存中的起始物理地址
D. 段页式管理无法支持段的动态增长
答案:A
解析:
A正确,由于段被划分为整数个页,段长必须是页面大小的整数倍。
B错误,段页式无外部碎片(因为物理分配以页框为单位),但每段最后一页仍有内部碎片。
C错误,段表项存储的是该段页表的基址和长度,而非段的物理基址(段的物理位置由页表分散指向)。
D错误,段页式支持动态增长,当段需要扩展时,可新增页表项映射新的页框。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)