Skip to content

段页式管理

2026 大纲 三(一)5 段页式管理

两种切法各有一半好处,那就都用

到这里,分页和分段的账已经很清楚了:

分页消灭了外碎片,但它按物理尺寸一刀切,共享和保护都不好做—— 一个函数横跨三页、一页里挤着两样东西,边界对不上逻辑。 分段的边界和逻辑严丝合缝,共享保护都方便,但它段长不等、按需切分,外碎片又回来了

两者的缺点恰好是对方的优点。所以自然会想到:能不能都要?

段页式的做法是两次划分依次施加,不是取个中间值的折中: 先按逻辑分段——拿到共享方便、保护方便、可动态链接; 再在段内分页——甩掉外碎片。

顺序不能反。先分段,共享的对象才仍然是"段"这个逻辑单位; 段内分页只是把一个段拆成若干等大的物理块去装,不产生新的语义边界。 所以段页式既有分段的共享便利,又有分页的无外碎片—— 它没有各取一半,而是把两个优点都拿全了

代价当然有,而且要数清楚:内碎片不但还在,还比纯分页更多 (纯分页每个进程浪费半页,段页式每个都浪费半页); 访存次数从 2 次涨到 3 次(查段表、查页表、取数据)。

读这一节盯住三处最容易记错的:段表项里存的不再是段基址(段被分页后不连续了)、 地址有三个字段但维数仍是二、以及页内偏移不做越界检查

交互可视化

加载可视化中...

一、位数划分与段表项的推导链

段页式的每一处设计都能从"段内再分页"这一句推出来:

段内分页 ⇒ 段不再占一片连续内存 ⇒ 段基址失去意义 ⇒ 段表必须转而指向该段的页表 ⇒ 以字节计的"段长"也随之换成以页计的"页表长度"。

段号页表长度页表始址
038000
169000
2210000

三个地址字段则必须从右往左依次定:页内偏移只由页面大小决定,最确定;段内页号由"每段最大长度 ÷ 页面大小"倒推;段号拿剩下的。反过来从段号开始猜,中间两个字段就会互相牵扯。

二、地址变换过程

段页式地址变换:段表寄存器给出段表始址与长度,段号先做越界比较,再经两级查表得到页框号 b,最后与页内地址 w 拼接成物理地址

图源:汤小丹《计算机操作系统》图 4-25 段页式系统中的地址变换机构,p151

图里三处值得单独指出:左上角的段表寄存器被拆成"段表始址"和"段表长度"两格,越界比较器的一个输入就来自后者;两个圆圈里的 分别是"段表始址 + 段号"和"页表始址 + 段内页号",说明两级查表用的是同一套"始址 + 下标"的寻址方式;最右下角物理地址由 bw 直接拼接而不是相加,因为页框号左移页内偏移的位数就等于乘以页面大小。

把判断分支补全:

情形访存次数分别是什么
无快表3 次段表 → 页表 → 数据
有快表、命中1 次只访问数据(快表直接给出页框号,段表与页表都被跳过)
有快表、未命中3 次与无快表相同,且要把查到的表项装入快表
一个 (S, P, W) 从位数划分算到物理地址、再判一个越界地址的完整走查(想看每一步的数怎么落、为什么乘 4 又乘 1024 时展开)

某段页式系统逻辑地址共 32 位,页面大小 1KB,规定每段最大长度为 16MB,段表项与页表项长度均为 4B。当前进程段表长度 TL = 3,段表如下(地址单位为字节):

段号页表长度页表始址
048000
169000
2210000

1 号段的页表内容为:页号 0→页框 20、1→35、2→8、3→17、4→41、5→2。

① 位数划分

  • 页内偏移:1KB=210B ⇒ W 占 10 位
  • 段内页号:每段最大 16MB=224B,除以页面大小得每段最大页数 224/210=214P 占 14 位
  • 段号:321014=8S 占 8 位

于是最大段数 =28=256 个;每段最大页数 =214=16384 页;每段最大长度 =16384×1KB=16MB(与题给条件自洽)。

| 段号 S:8 位 | 段内页号 P:14 位 | 页内偏移 W:10 位 |

顺手可算出:一个段的页表最多 214×4B=64KB,占 64 个页框——所以段页式系统里页表本身通常也要再分页。

② (1, 3, 512) 的物理地址

  1. 段号越界检查:S=1<TL=3 ✓。先做这一步,是因为段表项要靠段号算地址,段号非法时读到的根本不是本进程的段表项。
  2. 查段表第 1 项 ⇒ 页表始址 =9000,页表长度 =6
  3. 段内页号越界检查:P=3<6 ✓。这一步不能提前——页表长度 6 是刚从段表项里读出来的。
  4. 页表项地址 =9000+3×4=9012,读出页框号 b=17。乘 4 是因为页表项长度 4B,第 P 项相对页表始址的字节偏移是 P×4
  5. 物理地址 =17×1024+512=17408+512=17920(十六进制 0x4600)。是乘不是加:页表里存的是页框号,乘页面大小才还原成地址;分段那里段表存的是段基址(本身就是地址),才用加法。等价写法是把 b 左移 10 位再与 W 拼接,这正是上面那张图右下角"b | w"的含义。

③ (1, 7, 100) 是否合法

段号 1<3 ✓;但 P=7 而 1 号段的页表长度为 6,合法页号是 0~5,76越界中断,变换终止。页表长度以"页的个数"计、从 0 开始编号,最大合法页号 = 页表长度 − 1;段号那一侧同理,TL=3 意味着合法段号是 0~2。

④ 访存次数

  • 无快表:3 次——读段表项、读页表项(9012 那一次)、读地址 17920 处的数据;
  • 快表命中:1 次——用 (S,P)=(1,3) 直接在快表里查到 b=17,段表与页表两次访存全部省掉;
  • 快表未命中:3 次,且把 (1,3)17 这一项装入快表。

命中时是 1 次而不是 2 次,是因为快表缓存的是最终结果(页框号)而非中间结果(页表始址)。所以级数再多,命中时都只剩最后一次真正的数据访问。

三、三种管理方式对比

特性分页分段段页式判断依据
划分方式固定大小页按逻辑分段先分段再分页划分时看不看语义
划分者系统用户用户分段、系统分页谁提出需求
地址字段数2(P, W)2(S, W)3(S, P, W)施加了几次划分
地址空间维数一维二维二维用户要给出几个量
表项内容页框号段基址 + 段长页表始址 + 页表长度下一层是连续区还是另一张表
物理地址合成页框号 × 页面大小 + W段基址 + W页框号 × 页面大小 + W表里存的是块号还是地址
越界检查次数122有几个可变长度的上界
碎片内碎片(每进程半页)外碎片内碎片(每段半页)最终分配单位是否等大
共享保护不方便方便方便(粒度是段)边界是否与逻辑边界重合
访存次数(无快表)2 次2 次3 次查表级数 k,共 k+1 次
访存次数(快表命中)1 次1 次1 次快表缓存的是最终页框号

考点速记

  1. 段页式是两次划分依次施加,不是折中:先分段拿共享与保护,再段内分页甩掉外碎片。两个优点都拿全了。
  2. 内碎片还在,而且比纯分页更多——纯分页每个进程浪费半页,段页式每个都浪费半页。
  3. 地址结构 = 段号 S + 段内页号 P + 页内偏移 W。位数从右往左定:w页面大小定,p每段最大长度 ÷ 页面大小倒推,s 拿剩下的。三者共用同一份地址位,此消彼长。
  4. 字段是三个,维数还是二。判据是用户要给出几个量——用户给的仍只有段号 + 段内地址,中间那个段内页号是硬件从段内地址高位切出来的,对用户完全透明。
  5. 段表项存的不是段基址。段被分页后不再连续,段基址失去意义 ⇒ 段表项改存页表始址 + 页表长度;后者以计,替代了分段里以字节计的"段长",同时充当第二次越界检查的上界。
  6. 两次越界检查S<TL(上界来自段表寄存器,单位是段的个数);P< 页表长度(上界来自该段的段表项,单位是页的个数)。
  7. 页内偏移不检查——被位数天然限死,2w 恰好等于页面大小,取不到越界的值。这一点与纯分页一致,与分段不同(分段的段内偏移要比段长)。
  8. 访存次数通式:无快表 = 查表级数 k + 1,快表命中恒为 1 次。 分页 1+1=2、分段 2、段页式 2+1=3、二级页表 3、n 级页表 n+1。命中只剩 1 次,是因为快表缓存的是最终页框号而不是中间的页表始址。
  9. 段页式快表以 (段号, 段内页号) 为键,必须同时用 SP 检索——比分页快表多一个字段,这是两者唯一的结构差别。
  10. 共享的粒度是段不是页:让多个进程的段表项指向同一张页表,该段所有页框随之共享。

这一节在真题里被考过的形式

段页式至今不单独成题,本页下方因此没有练习区。

但它在大纲里(三(一)5 段式管理下的段页式),不能跳过,理由有两条:

第一,它是分页与分段对比题的第三列。 真题里的对比性选项(如"某某方式既无内碎片又无外碎片") 经常把段页式拉进来做错项,而"段页式既无内碎片又无外碎片"是错的—— 段内还要分页、末页照样填不满。这一句在内存管理基本概念 和本节都点了名,是段页式在真题里唯一稳定的露面方式。

第二,它把访存次数的通式补齐了。 分页 2 次、二级页表 3 次、段页式 3 次这些数字 本身就是大题里的常见分问(如 2013-46、2024-45 问"访问一次数据需要几次访存"), 而通式 k+1、命中恒为 1 只有把段页式放进来才看得出规律。

复习优先级读懂即可,不必手算。 三条足够——内碎片比纯分页更多字段三个但维数是二段表项存的是页表始址而非段基址。 地址位数划分与地址变换的完整走查放在上面的折叠层里, 考到的可能性低于分页和分段,时间紧时可以跳过。

易错:认为段页式既无内碎片又无外碎片。段内分页、末页填不满,内碎片仍在且按段累加

易错:认为地址有三个字段所以是三维。维数看用户要给出几个量——用户只给段号和段内地址,仍是二维。

易错:认为段页式的段表项里存段基址。段被分页后不连续,段表项存的是页表始址 + 页表长度

易错:对页内偏移也做越界检查。它被位数天然限死,取不到越界值——这一点和分段不同。

易错:认为段页式快表和分页快表结构相同。段页式快表以 (段号, 段内页号) 为键,多一个字段。

易错:把段页式的共享粒度当成页。共享靠多个段表项指向同一张页表,粒度是

教材出处
  • 汤小丹《计算机操作系统》4.6.4 段页式存储管理方式(基本原理、地址结构由段号/段内页号/页内地址三部分组成、段表内容改为页表始址与页表长度),p150
  • 同上 4.6.4「地址变换过程」(段表寄存器存段表始址与段长 TL、两级查表、图 4-25 地址变换机构、须三次访问内存),p151
  • 同上 5.5.2 分段的共享与保护(共享段表与共享进程计数、存取控制字段),p175–p176

相关知识

基本分段基本分页(地址变换)虚拟内存基本概念