考点频率 :★★★★☆(选择题常考,与页式存储对比出现)
难度 :⭐⭐⭐
建议:重点掌握段式与页式的核心区别,理解段页式如何结合两者优点
1️⃣ 为什么页式存储还不够?
页式存储解决了外部碎片问题,但它有一个明显的不足:页与程序的逻辑结构无关。一个程序被机械地切分成固定大小的页,导致:
- 代码段、数据段、堆栈段可能混杂在不同页中
- 多个进程共享同一段代码(如共享库)变得困难
- 无法实现不同段的独立保护(如代码段只读、数据段读写)
为了解决这些问题,出现了段式存储管理 ,以及综合两者优点的段页式存储管理。
段式存储可以理解为:程序是一个"文档",文档有章节(段),每个章节有标题和正文(段内内容),段之间不要求连续存放。段页式则是:先把文档按章节分成章,再把每章的内容按固定大小的页码分页印刷。
2️⃣ 段式存储管理
2.1 核心思想
将程序按逻辑结构 划分为若干个段(Segment),如:
| 段名 | 内容 |
|---|---|
| 代码段(Code Segment) | 存放程序的指令,只读 |
| 数据段(Data Segment) | 存放全局变量、静态变量 |
| 堆栈段(Stack Segment) | 存放函数调用栈、局部变量 |
| 共享段 | 可被多个进程共享的代码或数据(如动态链接库) |
每个段是一个完整的逻辑单元,大小可变,从程序逻辑角度自然划分,不受固定大小的限制。
地址结构:逻辑地址 = 段号 + 段内偏移
段表:每个段在段表中记录:
- 基址:该段在物理内存中的起始地址
- 段长(限长):该段的长度(用于越界检查)
2.2 地址转换流程
程序给出逻辑地址(段号 + 偏移)
↓
根据段号查找段表 → 得到该段的基址和段长
↓
检查偏移是否 < 段长(越界检查)
↓
合法 → 物理地址 = 基址 + 偏移
↓
非法 → 触发越界中断
2.3 优缺点
| 优点 | 缺点 |
|---|---|
| 反映程序逻辑结构,便于理解和维护 | 产生外部碎片(段长度不等,分配和释放后留下零散空隙) |
| 便于共享和保护(按段设置读写权限) | 内存分配算法复杂(需寻找合适大小的连续空间) |
| 段内连续,段间可以不连续 | 段表占用存储空间 |
3️⃣ 段页式存储管理
3.1 为什么需要段页式?
段式和页式各有优缺点:
| 存储方式 | 优点 | 缺点 |
|---|---|---|
| 页式 | 无外部碎片,内存利用率高 | 不反映逻辑结构,共享/保护困难 |
| 段式 | 反映逻辑结构,便于共享/保护 | 有外部碎片,分配算法复杂 |
段页式就是结合两者优点:先按逻辑结构分段,再将每个段按页划分。
3.2 核心思想
- 将程序按逻辑结构划分为若干个段(如代码段、数据段等)
- 将每个段再划分为固定大小的页
- 物理内存按页框管理(与页式相同)
地址结构:逻辑地址 = 段号 + 段内页号 + 页内偏移
3.3 数据结构
段页式需要两级表:
| 表 | 作用 |
|---|---|
| 段表 | 记录每个段的页表起始地址 和页表长度 |
| 页表 | 记录段内每个页对应的物理页框号(每个段有自己的页表) |
关键区别:段式存储的段表指向的是物理内存基址 ;段页式存储的段表指向的是页表基址,页表再指向物理页框。
3.4 地址转换流程(两次查表)
程序给出逻辑地址(段号 + 段内页号 + 偏移)
↓
根据段号查找段表 → 得到该段的页表起始地址和页表长度
↓
检查段内页号是否 < 页表长度(越界检查)
↓
用段内页号查找页表 → 得到物理页框号
↓
物理地址 = 页框号 × 页大小 + 页内偏移
3.5 优缺点
| 优点 | 缺点 |
|---|---|
| 同时具有段式的逻辑性和页式的无外碎片 | 两次查表,地址转换速度较慢(两次内存访问) |
| 便于共享和保护(在段级设置) | 增加了页表,存储开销较大 |
| 无外部碎片 | 数据结构更复杂,管理难度高 |
4️⃣ 三种存储方式对比表(重点)
| 对比项 | 页式存储 | 段式存储 | 段页式存储 |
|---|---|---|---|
| 划分依据 | 固定大小(机械划分) | 逻辑结构(代码/数据/堆栈) | 先逻辑分段,再固定分页 |
| 地址结构 | 页号 + 偏移 | 段号 + 偏移 | 段号 + 页号 + 偏移 |
| 用户视角 | 一维地址空间 | 二维地址空间 | 二维地址空间 |
| 表结构 | 页表(页号→页框号) | 段表(段号→基址+段长) | 段表 + 每个段有页表 |
| 内部碎片 | 有(最后一页) | 无 | 有(段内最后一页) |
| 外部碎片 | 无 | 有 | 无 |
| 共享与保护 | 困难 | 容易(段级) | 容易(段级) |
| 地址转换速度 | 快(一次查表) | 较快(一次查表+越界检查) | 慢(两次查表) |
| 典型应用 | 现代OS(如Linux) | 早期OS | 某些Unix变种(如Intel x86) |
5️⃣ 经典例题
例题1:在段页式存储管理中,逻辑地址由( )三部分组成。
A. 段号、页号、偏移量
B. 页号、段号、偏移量
C. 段号、页框号、偏移量
D. 段号、页表起始地址、偏移量
解析 :段页式的逻辑地址结构为:段号 + 段内页号 + 页内偏移。选 A。
例题2:以下关于段式存储管理的叙述中,正确的是( )。
A. 段式存储不会产生外部碎片
B. 段式存储的地址转换不需要检查越界
C. 段式存储便于程序段的共享和保护
D. 段式存储的段大小固定不变
解析 :A错误(段式有外部碎片);B错误(需要检查偏移是否超过段长);D错误(段大小可变)。选 C。
例题3:某系统采用段页式存储管理,一个程序的段表项指向的是( )。
A. 物理页框号
B. 该段在内存中的基址
C. 该段的页表起始地址
D. 该段的长度
解析 :段页式中,段表项指向的是该段的页表起始地址 (不是物理基址)。页表才记录页框号。选 C。
6️⃣ 易错点
| 易错点 | 正确理解 |
|---|---|
| 段页式不需要段表 | 段页式需要段表(指向页表),也需要页表(指向页框) |
| 段页式的地址转换比页式快 | 段页式需要两次查表,比页式慢(除非有快表) |
| 段式存储没有越界检查 | 段式存储需要越界检查(偏移必须小于段长) |
| 页式存储反映程序逻辑 | 页式不反映逻辑,段式才反映逻辑 |
7️⃣ 记忆口诀
页式机械分页框,段式逻辑分章节。
段页结合两表查,逻辑共享+无外碎。
段式基址+段长,段页段表指页表。
8️⃣ 小测验(评论区对答案)
以下关于存储管理方式的叙述中,错误的是( )。
A. 页式存储管理会产生内部碎片,但不会产生外部碎片
B. 段式存储管理会产生外部碎片,但不会产生内部碎片
C. 段页式存储管理会产生内部碎片,但不会产生外部碎片
D. 段页式存储管理的地址转换只需要一次查表
🔔 本专栏日更2篇,点击头像 → 专栏《软考中级高频考点》订阅,第一时间接收新内容
#软考中级 #软件设计师 #段式存储 #段页式存储 #存储管理 #操作系统