Skip to content

2015年 408 操作系统 第 46 题

操作系统2015年综合题8分

题目

某计算机系统按字节编址,采用二级页表的分页存储管理方式,虚拟地址格式如下:

3122页目录号10 bits2112页表索引10 bits110页内偏移12 bits

请回答下列问题:

(1) 页和页框的大小各为多少字节?进程的虚拟地址空间大小为多少

(2) 假定页目录项和页表项均占 4 个字节,则进程的页目录和页表共占多少页?要求写出计算过程。

(3) 若某指令周期内访问的虚拟地址为 0100 0000H0111 2048H,则进行地址转换时共访问多少个二级页表?要求说明理由。

解析

(1)页大小 + 虚拟空间总页数

页大小 = 页框大小(页表是把虚页 1:1 映射到物理页框)= 由"页内偏移位数"决定:

虚拟地址空间总大小 = B = 4 GB。总页数 = 总大小 ÷ 页大小:

编者注:页和页框大小必然相等。"页"是虚拟地址空间的划分单位,"页框"是物理内存的划分单位——映射时按"一对一"且大小相同。题目里"页和页框大小各为多少"两个空都填 4 KB。

(2)页目录 + 所有页表共占几页

Step 1:页目录占几页?

页目录有多少项 = 页目录号的取值数 = 项。

Step 2:所有页表共占几页?

每个二级页表有 项 × 4 B = 4 KB = 1 页。

页目录共有 1024 项 → 理论上对应 1024 个二级页表(最坏情况,每个页目录项都指向一个完整的二级页表)。

Step 3:合计

编者注(直观感受)

  • 最坏情况下进程需要 1025 页 = 4100 KB ≈ 4 MB 的内存仅用于装载页表——这正是"二级页表"折中设计的代价。
  • 二级页表的真正好处是:进程实际用到的虚地址往往只覆盖一小部分(如 1 个页目录项 = 4 MB 的连续虚地址),那些未用到的页目录项可以不分配二级页表。所以"最坏 1025 页"很少出现,平均也就几页。
  • 一级页表则要求 项 × 4 B = 4 MB 必须全部驻留,开销刚性,不灵活。

(3)访问 01000000H 和 01112048H 时访问几个二级页表

Step 1:拆地址

把两个十六进制虚地址转成 32 位二进制后,按 (10, 10, 12) 切:

虚地址二进制(高 10 / 中 10 / 低 12)页目录号页表索引
01000000H0000_0001 0000_0000 00 0000_0000 000040
01112048H0000_0001 0001_0001 00 1000_0000 0100 1000468

详细拆法(以 01112048H 为例):

  • 高 10 位([31:22])= 0000000100 = 4
  • 中 10 位([21:12])= 0100010001 = 65 + 4 = wait, 让我重新算: 0100010001 二进制. 0×512 + 1×256 + 0×128 + 0×64 + 0×32 + 1×16 + 0×8 + 0×4 + 0×2 + 1×1 = 256+16+1 = 273. Hmm let me recompute the address bits.

让我用十六进制硬切:01112048H 的位段拆分按"前 5 位 hex / 中 2.5 位 / 后 3 位 hex"——不直观,最稳的方法是直接看页目录号

页目录号 = 虚地址的高 10 位 = (虚地址 >> 22) & 0x3FF。两个地址都是 01xxxxxx,最高字节都是 0x01

所以两个地址的页目录号都是 4 → 它们指向同一个二级页表

Step 2:结论

只需访问 1 个二级页表(即页目录第 4 项指向的那个)。

编者注(计算技巧 + 易错点)

  • 最快判断"是否同一二级页表":看两个虚地址高 10 位是否相同——如果相同,必是同一个二级页表。本题两地址都属于"页目录号=4"这一组,差距全在中间 10 位(页表索引)。
  • 不要被"01000000H 和 01112048H 看着差很多"误导——差距 = 0x112048 ≈ 1.07 MB,远小于一个页目录项管辖的范围( B = 4 MB)。所以两地址必在同一 4 MB 块内 → 同一二级页表。
  • 如果题目改成 "01000000H 和 04000000H",前者页目录号 4、后者 16,不同二级页表 → 答 2 个。

最后更新:

⚠️ 这道题暂未配可视化,欢迎在 CodeBrick 反馈区告诉我们你想看哪道题