

好的,我们来详细解析这道2009年的虚拟内存管理统考真题。这道题是该领域的集大成者,将 TLB、页表、缺页中断、页面置换算法等核心知识点串联在一起,通过一个完整的访问序列来考察,是理解虚拟内存工作流程的绝佳范例。
第一步:重述题目原文
【2009 统考真题】在请求分页管理系统中,假设某进程的页表内容如下表所示:
| 页号 | 页框号 (Page Frame) | 有效位 (存在位) |
|---|---|---|
| 0 | 101H | 1 |
| 1 | — | 0 |
| 2 | 254H | 1 |
系统参数:
页面大小为 4KB。一次内存的访问时间是 100ns。一次快表 (TLB) 的访问时间是 10ns。处理一次缺页的平均时间为 10⁸ns (已含更新 TLB 和页表的时间)。进程的驻留集大小固定为 2。采用最近最少使用 (LRU) 置换算法和局部淘汰策略。
假设:
TLB 初始为空。地址转换时先访问 TLB,若 TLB 未命中,再访问页表 (忽略访问页表后的 TLB 更新时间)。有效位为 0 表示页面不在内存,产生缺页中断,缺页中断处理后,返回到产生缺页中断的指令处重新执行。
问题:
设有虚地址访问序列 ,
2362H,
1565H。
25A5H
依次访问上述三个虚拟地址,各需多少时间?给出计算过程。基于上述访问序列,虚地址 的物理地址是多少?请说明理由。
1565H
第二步:知识体系是什么?
这道题考察的是现代操作系统核心的 虚拟内存管理机制,它是一个为了在有限的物理内存上运行大型程序而设计的多层体系。
分页与地址转换:这是基础。CPU发出的虚拟地址被分为 页号 和 页内偏移。系统通过 页表 将虚拟页号翻译成物理 页框号,然后与页内偏移拼接成最终的物理地址。
TLB (快表):页表本身存放在内存中,这意味着每次内存访问都需要两次访存(一次查页表,一次取数据),效率太低。TLB 是设在 CPU 内部的一个高速缓存,专门用于缓存最近用过的页表项。
TLB命中:直接从 TLB 获得页框号,速度极快。TLB未命中:需要老老实实去内存中查页表,并将查到的页表项放入 TLB,以备后续使用。
缺页中断 (Page Fault):当查询页表发现 有效位为0 时,说明该页面不在物理内存中。CPU会产生一个“缺页中断”异常,将控制权交给操作系统。
页面置换:操作系统响应缺页中断后,需要从磁盘中把缺失的页面调入内存。如果内存已满(如此题中驻留集大小固定为2),就需要选择一个已在内存中的页面将其换出。
LRU (最近最少使用) 算法:是一种经典的页面置换算法。其核心思想是:当需要淘汰一个页面时,选择那个在过去最长时间内未被访问过的页面。
第三步:解题套路是什么?
解决这类问题,关键在于状态追踪。你需要像一个CPU一样,一步一步、严格按照规则来模拟整个地址转换和状态更新的过程。
套路一:预处理
解析地址结构:根据页大小确定页内偏移的位数。
页大小 = 。所以,页内偏移占 12位。12位二进制等于3位十六进制。因此,对于一个十六进制虚拟地址,后3位是偏移,前面的是页号。
4KB = 2¹² B
分解地址序列:将所有给定的虚拟地址预先分解好。
-> 页号
2362H, 偏移
2
362H -> 页号
1565H, 偏移
1
565H -> 页号
25A5H, 偏移
2
5A5H
建立状态表:在草稿纸上画出需要追踪的状态。
TLB 内容:(页号 -> 页框号)驻留集 (内存中的页):{页号, …}LRU 访问次序:用一个队列或栈来记录,队头/栈顶是最近访问的。
套路二:按序列逐步模拟
对序列中的每一个地址,严格执行以下流程,并计算时间:
查 TLB:时间 +。
10ns
命中? -> 成功。总时间 = 。转到步骤4。未命中? -> 失败。继续。
10ns (TLB) + 100ns (访存)
查页表 (需要访问内存):时间 +。
100ns
有效位为1?(在内存) -> 成功。总时间 = 。将该页表项装入TLB。转到步骤4。有效位为0?(缺页) -> 失败。继续。
10ns (TLB miss) + 100ns (查页表) + 100ns (访存)
处理缺页中断:
时间 +。执行页面置换:根据LRU算法,在驻留集中找到要被淘汰的页,用新页替换它。更新页表。重新执行指令:回到步骤1,对当前地址重新发起访问。
10⁸ns
更新状态:
更新LRU次序:将当前访问的页置为“最近使用的”。
第四步:为什么是这样?(深度剖析)
为什么要重新执行指令? 缺页中断对用户进程是透明的。当操作系统处理完中断后,必须让被中断的指令重新执行,就好像什么都没发生过一样。所以一次缺页的总时间,包含了首次访问失败、中断处理和第二次访问成功的全过程。LRU的精髓:LRU体现了程序的局部性原理。它假设最近被访问的页面,在将来也很有可能被再次访问,所以应该保留在内存中。而很久没被访问的页面,则可以被优先淘汰。
第五步:考试怎么解决?(实战指南)
问1:依次访问的时间计算
初始状态:
TLB: (空)驻留集:
{}LRU次序: (假设页2比页0更新,记为
{页0, 页2}:
(MRU -> LRU))
(2, 0)
1. 访问 (页号 2, 偏移 362H)
2362H
查TLB: 未命中 (TLB为空)。 耗时: 10ns查页表: 页号2的有效位为1,页框号为。 耗时: 100ns访问内存: 根据页框号
254H和偏移
254H访问数据。 耗时: 100ns总时间:
362H状态更新:
10ns + 100ns + 100ns = 210ns
TLB: LRU次序: 页2被访问,成为最近使用的。
{(2 -> 254H)}
(2, 0)
2. 访问 (页号 1, 偏移 565H)
1565H
查TLB: 未命中 (TLB中只有页2)。 耗时: 10ns查页表: 页号1的有效位为0。 缺页中断! 耗时: 100ns处理缺页中断:
执行LRU置换: 当前驻留集为,LRU次序为
{0, 2}。页0是最近最少使用的,淘汰页0。调入页面: 将页1调入原属于页0的页框
(2, 0)。更新页表: 页1的页表项变为(页框
101H, 有效位1),页0的页表项变为(有效位0)。中断处理总耗时: 10⁸ns
101H
重新执行指令 (访问 ):
1565H
查TLB: 未命中 (因为是重新执行,TLB中依然没有页1)。 耗时: 10ns查页表: 此时页1的有效位为1,页框号为。 耗时: 100ns访问内存: 耗时: 100ns
101H
总时间: 。状态更新:
10(TLB miss) + 100(查页表) + 10⁸(缺页) + 10(重试TLB miss) + 100(重试查页表) + 100(访存) = 100,000,220 ns
TLB: 驻留集:
{(2 -> 254H), (1 -> 101H)}LRU次序: 页1被访问,成为最近使用的。
{1, 2}
(1, 2)
3. 访问 (页号 2, 偏移 5A5H)
25A5H
查TLB: 命中! (TLB中有的映射)。 耗时: 10ns访问内存: 耗时: 100ns总时间:
(2 -> 254H)状态更新:
10ns + 100ns = 110ns
LRU次序: 页2被访问,成为最近使用的。
(2, 1)
问2:虚地址
1565H 的物理地址
1565H
理由:
在处理对虚地址 (页号1) 的访问时,发生了缺页中断。根据LRU算法,系统需要从驻留集
1565H 中淘汰最近最少使用的页面。在此之前,访问序列是
{0, 2} (访问了页2),所以页2是最近使用的,页0是最近最少使用的。因此,页0被淘汰。页0原先占用的物理页框是
2362H。缺失的 页1 被调入到刚刚被释放的页框
101H 中。
101H
计算:
物理地址由 页框号 和 页内偏移 拼接而成。页1对应的页框号为 。虚地址
101H 的页内偏移为
1565H。拼接得到物理地址为
565H。
101565H