Appearance
段页式管理
2026 大纲 三(一)5 段页式管理。
两种切法各有一半好处,那就都用
到这里,分页和分段的账已经很清楚了:
分页消灭了外碎片,但它按物理尺寸一刀切,共享和保护都不好做—— 一个函数横跨三页、一页里挤着两样东西,边界对不上逻辑。 分段的边界和逻辑严丝合缝,共享保护都方便,但它段长不等、按需切分,外碎片又回来了。
两者的缺点恰好是对方的优点。所以自然会想到:能不能都要?
段页式的做法是两次划分依次施加,不是取个中间值的折中: 先按逻辑分段——拿到共享方便、保护方便、可动态链接; 再在段内分页——甩掉外碎片。
顺序不能反。先分段,共享的对象才仍然是"段"这个逻辑单位; 段内分页只是把一个段拆成若干等大的物理块去装,不产生新的语义边界。 所以段页式既有分段的共享便利,又有分页的无外碎片—— 它没有各取一半,而是把两个优点都拿全了。
代价当然有,而且要数清楚:内碎片不但还在,还比纯分页更多 (纯分页每个进程浪费半页,段页式每个段都浪费半页); 访存次数从 2 次涨到 3 次(查段表、查页表、取数据)。
读这一节盯住三处最容易记错的:段表项里存的不再是段基址(段被分页后不连续了)、 地址有三个字段但维数仍是二、以及页内偏移不做越界检查。
交互可视化
一、位数划分与段表项的推导链
段页式的每一处设计都能从"段内再分页"这一句推出来:
段内分页 ⇒ 段不再占一片连续内存 ⇒ 段基址失去意义 ⇒ 段表必须转而指向该段的页表 ⇒ 以字节计的"段长"也随之换成以页计的"页表长度"。
| 段号 | 页表长度 | 页表始址 |
|---|---|---|
| 0 | 3 | 8000 |
| 1 | 6 | 9000 |
| 2 | 2 | 10000 |
三个地址字段则必须从右往左依次定:页内偏移只由页面大小决定,最确定;段内页号由"每段最大长度 ÷ 页面大小"倒推;段号拿剩下的。反过来从段号开始猜,中间两个字段就会互相牵扯。
二、地址变换过程

图源:汤小丹《计算机操作系统》图 4-25 段页式系统中的地址变换机构,p151
图里三处值得单独指出:左上角的段表寄存器被拆成"段表始址"和"段表长度"两格,越界比较器的一个输入就来自后者;两个圆圈里的 + 分别是"段表始址 + 段号"和"页表始址 + 段内页号",说明两级查表用的是同一套"始址 + 下标"的寻址方式;最右下角物理地址由 b 与 w 直接拼接而不是相加,因为页框号左移页内偏移的位数就等于乘以页面大小。
把判断分支补全:
| 情形 | 访存次数 | 分别是什么 |
|---|---|---|
| 无快表 | 3 次 | 段表 → 页表 → 数据 |
| 有快表、命中 | 1 次 | 只访问数据(快表直接给出页框号,段表与页表都被跳过) |
| 有快表、未命中 | 3 次 | 与无快表相同,且要把查到的表项装入快表 |
一个 (S, P, W) 从位数划分算到物理地址、再判一个越界地址的完整走查(想看每一步的数怎么落、为什么乘 4 又乘 1024 时展开)
某段页式系统逻辑地址共 32 位,页面大小 1KB,规定每段最大长度为 16MB,段表项与页表项长度均为 4B。当前进程段表长度 TL = 3,段表如下(地址单位为字节):
| 段号 | 页表长度 | 页表始址 |
|---|---|---|
| 0 | 4 | 8000 |
| 1 | 6 | 9000 |
| 2 | 2 | 10000 |
1 号段的页表内容为:页号 0→页框 20、1→35、2→8、3→17、4→41、5→2。
① 位数划分
- 页内偏移:
B ⇒ W 占 10 位; - 段内页号:每段最大
B,除以页面大小得每段最大页数 ⇒ P 占 14 位; - 段号:
⇒ S 占 8 位。
于是最大段数
| 段号 S:8 位 | 段内页号 P:14 位 | 页内偏移 W:10 位 |顺手可算出:一个段的页表最多
② (1, 3, 512) 的物理地址
- 段号越界检查:
✓。先做这一步,是因为段表项要靠段号算地址,段号非法时读到的根本不是本进程的段表项。 - 查段表第 1 项 ⇒ 页表始址
,页表长度 。 - 段内页号越界检查:
✓。这一步不能提前——页表长度 6 是刚从段表项里读出来的。 - 页表项地址
,读出页框号 。乘 4 是因为页表项长度 4B,第 项相对页表始址的字节偏移是 。 - 物理地址
(十六进制 0x4600)。是乘不是加:页表里存的是页框号,乘页面大小才还原成地址;分段那里段表存的是段基址(本身就是地址),才用加法。等价写法是把 左移 10 位再与 W 拼接,这正是上面那张图右下角"b | w"的含义。
③ (1, 7, 100) 是否合法
段号
④ 访存次数
- 无快表:3 次——读段表项、读页表项(9012 那一次)、读地址 17920 处的数据;
- 快表命中:1 次——用
直接在快表里查到 ,段表与页表两次访存全部省掉; - 快表未命中:3 次,且把
这一项装入快表。
命中时是 1 次而不是 2 次,是因为快表缓存的是最终结果(页框号)而非中间结果(页表始址)。所以级数再多,命中时都只剩最后一次真正的数据访问。
三、三种管理方式对比
| 特性 | 分页 | 分段 | 段页式 | 判断依据 |
|---|---|---|---|---|
| 划分方式 | 固定大小页 | 按逻辑分段 | 先分段再分页 | 划分时看不看语义 |
| 划分者 | 系统 | 用户 | 用户分段、系统分页 | 谁提出需求 |
| 地址字段数 | 2(P, W) | 2(S, W) | 3(S, P, W) | 施加了几次划分 |
| 地址空间维数 | 一维 | 二维 | 二维 | 用户要给出几个量 |
| 表项内容 | 页框号 | 段基址 + 段长 | 页表始址 + 页表长度 | 下一层是连续区还是另一张表 |
| 物理地址合成 | 页框号 × 页面大小 + W | 段基址 + W | 页框号 × 页面大小 + W | 表里存的是块号还是地址 |
| 越界检查次数 | 1 | 2 | 2 | 有几个可变长度的上界 |
| 碎片 | 内碎片(每进程半页) | 外碎片 | 内碎片(每段半页) | 最终分配单位是否等大 |
| 共享保护 | 不方便 | 方便 | 方便(粒度是段) | 边界是否与逻辑边界重合 |
| 访存次数(无快表) | 2 次 | 2 次 | 3 次 | 查表级数 k,共 k+1 次 |
| 访存次数(快表命中) | 1 次 | 1 次 | 1 次 | 快表缓存的是最终页框号 |
考点速记
- 段页式是两次划分依次施加,不是折中:先分段拿共享与保护,再段内分页甩掉外碎片。两个优点都拿全了。
- 内碎片还在,而且比纯分页更多——纯分页每个进程浪费半页,段页式每个段都浪费半页。
- 地址结构
段号 + 段内页号 + 页内偏移 。位数从右往左定: 由页面大小定, 由每段最大长度 ÷ 页面大小倒推, 拿剩下的。三者共用同一份地址位,此消彼长。 - 字段是三个,维数还是二。判据是用户要给出几个量——用户给的仍只有段号 + 段内地址,中间那个段内页号是硬件从段内地址高位切出来的,对用户完全透明。
- 段表项存的不是段基址。段被分页后不再连续,段基址失去意义 ⇒ 段表项改存页表始址 + 页表长度;后者以页计,替代了分段里以字节计的"段长",同时充当第二次越界检查的上界。
- 两次越界检查:
(上界来自段表寄存器,单位是段的个数); 页表长度(上界来自该段的段表项,单位是页的个数)。 - 页内偏移不检查——被位数天然限死,
恰好等于页面大小,取不到越界的值。这一点与纯分页一致,与分段不同(分段的段内偏移要比段长)。 - 访存次数通式:无快表
查表级数 + 1,快表命中恒为 1 次。 分页 、分段 2、段页式 、二级页表 3、 级页表 。命中只剩 1 次,是因为快表缓存的是最终页框号而不是中间的页表始址。 - 段页式快表以 (段号, 段内页号) 为键,必须同时用
和 检索——比分页快表多一个字段,这是两者唯一的结构差别。 - 共享的粒度是段不是页:让多个进程的段表项指向同一张页表,该段所有页框随之共享。
这一节在真题里被考过的形式:
段页式至今不单独成题,本页下方因此没有练习区。
但它在大纲里(三(一)5 段式管理下的段页式),不能跳过,理由有两条:
第一,它是分页与分段对比题的第三列。 真题里的对比性选项(如"某某方式既无内碎片又无外碎片") 经常把段页式拉进来做错项,而"段页式既无内碎片又无外碎片"是错的—— 段内还要分页、末页照样填不满。这一句在内存管理基本概念 和本节都点了名,是段页式在真题里唯一稳定的露面方式。
第二,它把访存次数的通式补齐了。 分页 2 次、二级页表 3 次、段页式 3 次这些数字 本身就是大题里的常见分问(如 2013-46、2024-45 问"访问一次数据需要几次访存"), 而通式
复习优先级:读懂即可,不必手算。 三条足够——内碎片比纯分页更多、 字段三个但维数是二、段表项存的是页表始址而非段基址。 地址位数划分与地址变换的完整走查放在上面的折叠层里, 考到的可能性低于分页和分段,时间紧时可以跳过。
易错:认为段页式既无内碎片又无外碎片。段内分页、末页填不满,内碎片仍在且按段累加。
易错:认为地址有三个字段所以是三维。维数看用户要给出几个量——用户只给段号和段内地址,仍是二维。
易错:认为段页式的段表项里存段基址。段被分页后不连续,段表项存的是页表始址 + 页表长度。
易错:对页内偏移也做越界检查。它被位数天然限死,取不到越界值——这一点和分段不同。
易错:认为段页式快表和分页快表结构相同。段页式快表以 (段号, 段内页号) 为键,多一个字段。
易错:把段页式的共享粒度当成页。共享靠多个段表项指向同一张页表,粒度是段。
教材出处
- 汤小丹《计算机操作系统》4.6.4 段页式存储管理方式(基本原理、地址结构由段号/段内页号/页内地址三部分组成、段表内容改为页表始址与页表长度),p150
- 同上 4.6.4「地址变换过程」(段表寄存器存段表始址与段长 TL、两级查表、图 4-25 地址变换机构、须三次访问内存),p151
- 同上 5.5.2 分段的共享与保护(共享段表与共享进程计数、存取控制字段),p175–p176