存储管理
1
以下哪种页面置换算法会受到 Belady 异常的影响?( )
解释:
- Belady 异常是指在特定场景下,增加物理内存页框数反而导致缺页中断次数增多的反直觉现象
- 该现象仅出现在 FIFO 页面置换算法中
- 其本质是 FIFO 的队列特性与工作集分布之间的矛盾
- LRU 和 Optimal 算法则不会出现这种异常
2
磁盘中的交换空间(swap space)主要用于什么?( )
3
增加计算机的 RAM 通常会提高性能,因为( )。
4
某计算机系统支持 32 位虚拟地址和 32 位物理地址。由于虚拟地址空间与物理地址空间大小相同,操作系统设计者决定完全移除虚拟内存。以下哪一项是正确的?( )
5
虚拟内存是( )。
解析:
虚拟内存本质上是操作系统提供的一种逻辑内存抽象机制,其特点包括:
- 虚拟性:并非真实存在的物理存储设备,而是通过地址映射实现的逻辑扩展
- 容量扩展:通过将磁盘空间作为后备存储,突破物理内存容量限制
- 透明性:对应用程序而言,无需感知具体物理内存分布
- 分页/分段管理:采用请求调页/调段机制实现内存与外存的数据交换
因此选项 C 准确描述了虚拟内存的本质特征,而选项 B 混淆了物理主存与虚拟内存的概念。
6
页面错误发生在什么时刻?( )
解释:
- 页面错误(Page Fault)是指当程序访问的页面不在物理内存中时触发的异常。
- 触发条件:
- 请求的页面已在虚拟地址空间中映射。
- 该页面当前未被加载到物理内存中。
- 此时操作系统会从磁盘(如交换分区或页文件)中读取所需页面并加载到内存中。
7
抖动现象发生在什么时候?( )
8
一台计算机使用 46 位虚拟地址、32 位物理地址和三级分页页表组织。页表基址寄存器存储一级表(T1)的起始地址,该表恰好占用一个页面。每个 T1 条目存储二级表(T2)页面的起始地址。每个 T2 条目存储三级表(T3)页面的起始地址。每个 T3 条目存储 32 位的页表项(PTE)。该计算机使用的处理器具有 1MB 16 路组相联、虚拟索引物理标记的缓存,缓存块大小为 64 字节。这台计算机的页面大小是多少 KB?( )
设页面大小为 $ x $ 位:
T1 表大小
$ \text{T1 大小} = 2^x $ 字节(因 T1 恰好占用一个页面)T1 条目数
$ \text{条目数} = \frac{2^x}{4} $(每个 PTE 为 32 位即 4 字节)
$\Rightarrow$ 二级页表数量 = $ \frac{2^x}{4} $二级页表总大小
$ \text{二级页表总大小} = \left( \frac{2^x}{4} \right) \times 2^x $T2 条目数与三级页表数量
$ \text{T2 条目数} = \left( \frac{2^x}{4} \right)^2 $
$\Rightarrow$ 三级页表数量 = $ \left( \frac{2^x}{4} \right)^2 $三级页表总大小
$ \text{三级页表总大小} = \left( \frac{2^x}{4} \right)^2 \times 2^x $所有三级页表中的总页数
$ \text{总页数} = \left( \frac{2^x}{4} \right)^3 = 2^{3x - 6} $虚拟内存页数
$ \text{虚拟内存页数} = \frac{2^{46}}{2^x} = 2^{46 - x} $方程求解
$$ 2^{3x - 6} = 2^{46 - x} \Rightarrow 3x - 6 = 46 - x \Rightarrow 4x = 52 \Rightarrow x = 13 $$
页面大小计算
$ 2^{13} $ 字节 = 8 KB
9
考虑以下虚拟页面引用序列:1, 2, 3, 2, 4, 1, 3, 2, 4, 1。在一个运行于主存大小为 3 个页面帧(初始为空)的按需分页虚拟内存系统中。设 OPTIMAL、LRU 和 FIFO 分别表示对应页面置换策略下的页面错误次数。则( )。
- 先进先出(FIFO):操作系统通过队列维护内存中的所有页面,队首为最老的页面。当需要替换时选择队首页面移除。
- 最佳置换(OPTIMAL):该算法替换未来最长不使用的页面。
- 最近最少使用(LRU):该算法替换最近最久未使用的页面。
解答
虚拟页面引用序列为 1, 2, 3, 2, 4, 1, 3, 2, 4, 1,主存页面帧大小为 3。
- FIFO:总页面错误数为 6
- OPTIMAL:总页面错误数为 5
- LRU:总页面错误数为 9
因此,OPTIMAL=5,FIFO=6,LRU=9,关系为 OPTIMAL < FIFO < LRU。选项(B)正确。
10
某计算机的页面错误服务时间为 10ms,平均内存访问时间为 20ns。若每 10⁶ 次内存访问会生成一次页面错误,则该内存的有效访问时间是多少?( )
解析:
设定变量:
- 页面错误率 $ P = \frac{1}{10^6} $
- 页面错误服务时间 $ T_{\text{page}} = 10 \ \text{ms} = 10 \times 10^6 \ \text{ns} $
- 内存访问时间 $ T_{\text{mem}} = 20 \ \text{ns} $
有效访问时间公式:
$$ T_{\text{effective}} = P \times T_{\text{page}} + (1 - P) \times T_{\text{mem}} $$
代入计算:
$$ T_{\text{effective}} = \left(\frac{1}{10^6}\right) \times 10 \times 10^6 + \left(1 - \frac{1}{10^6}\right) \times 20 $$
$$ = 10 + 20 \times \left(1 - \frac{1}{10^6}\right) $$
$$ \approx 10 + 20 = 30 \ \text{ns} $$
结论: 有效访问时间约为 30 ns。
11
一个系统使用 FIFO 页面置换策略。它有 4 个页面帧,初始时没有加载任何页面。系统首先按某种顺序访问 100 个不同的页面,然后以相反的顺序再次访问相同的 100 个页面。总共会发生多少次缺页中断?( )
解析:
首次访问阶段
- 系统访问 100 个全新页面,页面帧初始为空
- 每次访问均触发缺页中断(共 100 次)
逆序访问阶段
- 前 4 个页面(原序列末尾的 4 个页面)仍保留在页面帧中 → 无缺页中断
- 第 5 至第 100 个页面(共 96 次):
- 采用 FIFO 策略替换最老页面 → 每次访问均需替换 → 96 次缺页中断
总计
$100 \text{(首次)} + 96 \text{(逆序)} = 196$ 次缺页中断
12
页表中每个表项的必要内容是( )。
解析
- 页框号 是页表项必须包含的核心内容,用于建立虚拟地址与物理地址的映射关系。
- 虚拟页号 通常作为页表的索引字段,其作用是定位页表项以获取对应的 页框号。
- 其他扩展信息(如访问权限)属于附加属性,非必要组成。
- 更详细的实现原理可参考操作系统内存管理章节。
13
与单级页表相比,多级页表在将虚拟地址转换为物理地址时更受真实系统的青睐,这是因为( )。
14
一个处理器使用 36 位物理地址和 32 位虚拟地址,页面帧大小为 4 KB。每个页表项的大小为 4 字节。虚拟到物理地址的转换使用三级页表,其中虚拟地址的使用方式如下:
- 位 30-31 用于索引一级页表
- 位 21-29 用于索引二级页表
- 位 12-20 用于索引三级页表
- 位 0-11 用作页内偏移
在一级、二级和三级页表的页表项中,分别需要多少位来寻址下一级页表(或页面帧)?( )
解析
虚拟地址大小 = 32 位
物理地址大小 = 36 位
物理内存大小 = $2^{36}$ 字节
页面帧大小 = 4K 字节 = $2^{12}$ 字节
偏移量所需的位数(或访问页面帧内位置所需的位数)= 12。
访问物理内存帧所需的位数 = 36 - 12 = 24。
因此,在三级页表中,需要 24 位来访问一个条目。
虚拟地址的 9 位用于访问二级页表条目,且二级页表条目的大小为 4 字节。因此,二级页表的大小为 $(2^9)×4 = 2^{11}$ 字节。这意味着有 $(2^{36})/(2^{11})$ 个可能的位置可以存储此页表。因此,二级页表需要 25 位来寻址它。
同样地,一级页表需要 25 位来寻址它。
15
虚拟内存系统采用先进先出(FIFO)页面置换策略,并为进程分配固定数量的页框。考虑以下两个陈述:
- P:增加分配给进程的页面框数量有时会提高页面错误率。
- Q:某些程序不表现出局部性引用。
以下哪一项是正确的?( )
解释
FIFO 算法特性
先进先出(FIFO)页面置换算法:
这是最简单的页面置换算法。操作系统通过队列维护内存中的所有页面,队首页面是最旧的页面。当需要替换页面时,选择队首页面进行移除。
贝拉迪异常(Belady’s Anomaly)
FIFO 算法存在 贝拉迪异常:
该现象表明,增加页面框数量可能导致页面错误率上升。
陈述分析
陈述 P
结论:正确
依据:FIFO 算法受贝拉迪异常影响,特定引用模式下增加页框数反而导致更多缺页中断。陈述 Q
结论:正确
依据:局部性通常源于循环对数组等数据结构的索引访问。我们可编写无循环的程序,使其不具有局部性引用。
因果关系判定
尽管 P 和 Q 均正确,但 Q 并非 P 的原因。
贝拉迪异常的发生与特定的页面引用模式相关,而 Q 描述的是程序本身的特性,二者无直接因果关系。
16
一个进程被分配了 3 个页面帧。假设该进程的页面最初都不在内存中。进程产生以下页面引用序列(引用字符串):1, 2, 1, 3, 7, 4, 5, 6, 3, 1。如果使用最佳页面置换策略,上述引用字符串会产生多少次页面错误?( )
最佳页面置换策略会在发生页面错误时向前查看以确定替换哪个帧。
- 初始状态:所有页面不在内存
- 访问顺序:1 → 2 → 1 → 3 → 7 → 4 → 5 → 6 → 3 → 1
页面替换过程:
[1] [2] [3] ← 初始加载(3次页面错误)
[1] [2] [3] ← 访问1(命中)
[1] [2] [3] ← 访问3(命中)
[1] [2] [7] ← 替换3(预测3之后不再使用)→ 第4次页面错误
[1] [2] [4] ← 替换7(预测7之后不再使用)→ 第5次页面错误
[1] [5] [4] ← 替换2(预测2之后不再使用)→ 第6次页面错误
[6] [5] [4] ← 替换1(预测1之后不再使用)→ 第7次页面错误
关键逻辑:
最佳置换算法选择未来最久不会被使用的页面进行替换。最终共发生 7 次页面错误,对应选项 A。
17
考虑上题中给出的数据。
最近最少使用(LRU)页面置换策略是对最优页面置换策略的一种实用近似。对于上述引用字符串,与最优页面置换策略相比,LRU 策略会产生多少额外的页面错误?( )
LRU 置换策略:替换掉最近最久未使用的页面。
给定字符串: 1, 2, 1, 3, 7, 4, 5, 6, 3, 1
123
// 初始加载页面 1、2、3,发生 3 次页面错误173
→ 替换 7(页面 3 被移除)473
→ 替换 4(页面 1 被移除)453
→ 替换 5(页面 7 被移除)456
→ 替换 6(页面 3 被移除)356
→ 替换 3(页面 4 被移除)316
→ 替换 1(页面 5 被移除)
总计 9 次页面错误。
18
一台计算机有二十个物理页框,初始时包含编号为 101 到 120 的页面。现在一个程序按顺序访问编号为 1、2、…、100 的页面,并重复该访问序列三次。以下哪种页面置换策略与最优页面置换策略在该程序中经历的页面错误次数相同?( )
最优页面置换算法会换出其下一次使用时间最远的页面。
在本题中,计算机有 20 个页框,初始时页框中装入了编号 101 到 120 的页面。然后程序按顺序访问编号 1 到 100 的页面,并重复该访问序列三次。
- 前 20 次对页面 1 到 20 的访问必然导致页面错误。当访问第 21 个页面时,再次发生页面错误。被换出的页面是 20 号页面,因为它的下一次使用时间最远。
- 当访问第 22 个页面时,21 号页面会被换出,因为它下一次使用时间最远。
在这种情况下,上述最优页面置换算法实际上等效于最近最多使用(MRU)策略:
- 第一轮迭代(1-100):所有页面均不在页框中,前 20 个页面(1-20)依次装入 20 个页框,后续页面(21-100)每次访问都会替换第 20 个页框中的页面,因此页面错误次数为 100 次。
- 第二轮迭代(1-19)存在 | (20-99)不存在 | (100)存在:替换发生在第 19 个页框,页面错误次数为 100 - 19 - 1 = 80 次。
- 第三轮迭代(1-18)存在 | (19-98)不存在 | (99-100)存在:替换发生在第 18 个页框,页面错误次数为 100 - 18 - 2 = 80 次。
- 第四轮迭代(1-17)存在 | (17-97)不存在 | (98-100)存在:替换发生在第 17 个页框,页面错误次数为 100 - 17 - 3 = 80 次。
- 总页面错误次数:100 + 80 + 80 + 80 = 340 次。
- 同时,最近最多使用(MRU)策略也会在相同位置进行页面替换,因此产生的页面错误次数与最优算法相同。(假设给定的 101-120 页面无效或为空)
后进先出(LIFO)置换策略的行为与最优算法不同:
- 它会产生 343 次页面错误。从第 21 个页面开始,所有页面都替换到第 20 个页框中,因此每轮迭代的命中次数从第二轮开始减少到 19 次。
- 总页面错误次数:100 + 81 + 81 + 81 = 343 次。
19
考虑一个带有 TLB 的分页硬件。假设整个页表和所有页面都在物理内存中。搜索 TLB 需要 10 ms,访问物理内存需要 80 ms。如果 TLB 命中率为 0.6,则有效内存访问时间(以 ms 为单位)是( )。
解释
TLB 基础概念
- TLB(Translation Lookaside Buffer) 是页表的高速缓存,用于加速虚拟地址到物理地址的转换。
- 页表 存储在物理内存中,记录虚拟地址与物理地址的映射关系。
TLB 命中与未命中场景
场景 | 时间组成 |
---|---|
TLB 命中 | TLB_search_time + memory_access_time |
TLB 未命中 | TLB_search_time + 2 × memory_access_time |
有效访问时间(EAT)计算公式
EAT = 命中率 × (TLB 访问时间 + 内存访问时间) + (1 - 命中率) × (TLB 访问时间 + 2 × 内存访问时间)
具体数值代入
已知条件:
- TLB 搜索时间 = 10 ms
- 内存访问时间 = 80 ms
- TLB 命中率 = 0.6
计算过程:
$$ \begin{align*} \text{T}_{\text{eff}} &= 0.6 \times (10 + 80) + 0.4 \times (10 + 2 \times 80) \\ &= 0.6 \times 90 + 0.4 \times 170 \\ &= 54 + 68 \\ &= 122 \ \text{ms} \end{align*} $$
结论
因此,有效内存访问时间为 122 ms,对应选项 B。
20
当缓存命中时,读操作的内存访问时间为 1 ns,缓存未命中时为 5 ns;写操作命中缓存时为 2 ns,未命中时为 10 ns。执行一条指令序列包含 100 次指令获取操作、60 次内存操作数读取和 40 次内存操作数写入。缓存命中率为 0.9。执行该指令序列的平均内存访问时间(单位:ns)是( )。
问题要求计算以下总时间除以总指令数:
- 100 次获取操作
- 60 次操作数读取
- 40 次内存操作数写入
总指令数 = 100 + 60 + 40 = 200
100 次获取操作耗时(获取=读取)
= 100 × ((0.9 × 1) + (0.1 × 5))
// 1 表示缓存命中时的读取时间
= 140 ns
// 0.9 为缓存命中率
60 次读取操作耗时 = 60 × ((0.9 × 1) + (0.1 × 5)) = 84 ns
40 次写入操作耗时 = 40 × ((0.9 × 2) + (0.1 × 10)) = 112 ns
// 2 和 10 分别表示缓存命中/未命中时的写入时间
200 次操作总耗时 = 140 + 84 + 112 = 336 ns
平均耗时 = 总耗时 ÷ 操作数 = 336 ÷ 200 = 1.68 ns
21
一个 CPU 生成 32 位虚拟地址。页面大小为 4 KB。处理器有一个可容纳 128 个页表项的转换后备缓冲器(TLB),并且是 4 路组相联的。TLB 标记的最小尺寸是( )。
虚拟内存如果每次都需要通过在内存中查找关联物理页来翻译地址,效率会很低。解决方案是将最近的翻译缓存在一个转换后备缓冲器(TLB)中。TLB 包含固定数量的插槽,这些插槽包含页表项,用于将虚拟地址映射到物理地址。
解答
- 页面大小 = 4KB = 2¹² → 偏移量需要 12 位
- CPU 生成 32 位虚拟地址 → 页框所需总位数 = 32 - 12 = 20 位
- TLB 是 4 路组相联,总容量 128 个页表项(2⁷)→ 组数 = 2⁷ / 4 = 2⁵ → 需 5 位 寻址组
- 标记位数 = 20 - 5 = 15 位
选项 (C) 是正确答案。
22
在虚拟内存环境中,运行进程必须分配的最小页框数由以下哪项决定?( )
虚拟内存管理包含两个核心任务:
- 页面替换策略:决定哪些页框被替换
- 页框分配策略:确定进程应分配的最小页框数
最小页框数的确定逻辑:
进程必须分配的绝对最小页框数取决于系统架构特性,具体体现为:
单条(机器)指令可能访问的页面数量决定了所需页框的下限结论:
因此,影响最小页框数的关键因素是指令集架构,选项 (A) 为正确答案
23
考虑一个采用两级分页机制的系统,常规内存访问耗时 150 ns,处理页面错误需 8 ms。平均指令需要 100 ns 的 CPU 时间和两次内存访问。TLB 命中率为 90%,页面错误率为每 10000 条指令发生一次。求有效平均指令执行时间( )?
请注意题目中页面错误率是每 10000 条指令发生一次页面错误。由于每条指令需要两次内存访问,因此计算平均指令执行时间时需要双倍的地址转换时间。当 TLB 未命中时,需要访问两次页表。假设 TLB 访问时间为 0。
因此:
计算公式分解:
平均 CPU 执行时间
= 100 ns
地址转换时间
- TLB 命中(90%):无需访问页表 →
0
- TLB 未命中(10%):需访问两级页表 →
2 × 150 ns = 300 ns
- 单次内存访问的地址转换时间:
0.9 × 0 + 0.1 × 300 = 30 ns
- 两次内存访问总地址转换时间:
2 × 30 = 60 ns
- TLB 命中(90%):无需访问页表 →
内存获取时间
- 每次内存访问耗时
150 ns
- 两次内存访问总时间:
2 × 150 = 300 ns
- 每次内存访问耗时
页面错误时间
- 页面错误概率:
1/10000
- 页面错误处理时间:
8 ms = 8,000,000 ns
- 平均页面错误时间:
(1/10000) × 8,000,000 = 800 ns
- 页面错误概率:
最终计算:
总时间 = 100 (CPU) + 60 (地址转换) + 300 (内存访问) + 800 (页面错误)
= 1260 ns
24
在一个具有 32 位虚拟地址和 1 KB 页面大小的系统中,使用单级页表进行虚拟地址到物理地址的转换是不切实际的,因为( )。
- 关键分析:
- 32 位地址空间意味着虚拟地址范围为 $2^{32}$ 字节(4 GB)。
- 每个页面大小为 1 KB($2^{10}$ 字节),因此页表项数量为 $2^{32} / 2^{10} = 2^{22}$ 个。
- 假设每个页表项占用 4 字节,则总页表大小为 $2^{22} \times 4 = 16,777,216$ 字节(约 16 MB)。
- 单级页表需一次性分配如此大内存,对系统资源造成显著压力,导致内存开销过大。
- 对比其他选项:
- A/B 与页表设计无关,碎片问题主要由进程管理引起。
- D 中地址转换计算复杂度与页表层级无关,硬件可高效处理。
- 结论:单级页表因内存消耗过高而不适用于大地址空间场景。
25
与使用静态链接库相比,以下哪项不是使用共享动态链接库的优势( )?
C
参考静态库与动态库的差异:
- 静态库在编译时完成链接,生成的可执行文件包含完整的库代码
- 动态库在运行时按需加载,具有以下特点:
- 可执行文件体积更小(多个程序共享同一库)
- 支持库版本热更新(无需重新链接程序)
- 可能增加系统缺页率(因延迟加载机制)
程序启动速度方面,静态库由于已预先链接,通常比动态库稍快。因此选项 C 不属于动态库优势。
26
某处理器使用两级页表进行虚拟地址到物理地址的转换。两级页表均存储在主存中。虚拟地址和物理地址均为 32 位宽,内存按字节寻址。在虚拟地址到物理地址的转换中,虚拟地址的最高 10 位用作一级页表的索引,接下来的 10 位用作二级页表的索引,最低 12 位作为页内偏移。假设两级页表的页表项均为 4 字节宽。此外,处理器具有一个命中率为 96% 的转译后备缓冲器(TLB),用于缓存最近使用的虚拟页号和对应的物理页号。处理器还具有一个命中率为 90% 的物理地址缓存。主存访问时间为 10 ns,缓存访问时间为 1 ns,TLB 访问时间也为 1 ns。
假设不发生缺页中断,访问一个虚拟地址的平均时间大约为(保留小数点后一位):( )
可能的情况包括:
- TLB 命中 & 缓存命中
- TLB 访问时间 (1 ns) + 缓存访问时间 (1 ns) = 2 ns
- TLB 命中 & 缓存未命中
- TLB 访问时间 (1 ns) + 主存访问时间 (10 ns) = 11 ns
- TLB 未命中 & 缓存命中
- TLB 访问时间 (1 ns) + 两级页表访问 (2×10 ns) + 缓存访问时间 (1 ns) = 22 ns
- TLB 未命中 & 缓存未命中
- TLB 访问时间 (1 ns) + 两级页表访问 (2×10 ns) + 主存访问时间 (10 ns) = 31 ns
计算公式:
= 0.96 × 0.9 × 2 (TLB 命中 & 缓存命中)
+ 0.96 × 0.1 × 11 (TLB 命中 & 缓存未命中)
+ 0.04 × 0.9 × 22 (TLB 未命中 & 缓存命中)
+ 0.04 × 0.1 × 31 (TLB 未命中 & 缓存未命中)
= 3.8 ns ≈ 4 ns
为什么是 22 和 31?
- 22 ns:当 TLB 未命中时需访问 TLB (1 ns),通过两级页表获取物理地址(2 次主存访问 × 10 ns),再从缓存中读取数据 (1 ns),总计 $1 + 2 \times 10 + 1 = 22$ ns。
- 31 ns:当 TLB 未命中且缓存未命中时,需访问 TLB (1 ns),通过两级页表获取物理地址(2 次主存访问 × 10 ns),再从主存读取数据 (10 ns),总计 $1 + 2 \times 10 + 10 = 31$ ns。
27
一个处理器使用两级页表进行虚拟地址到物理地址的转换。两级页表均存储在主存中。虚拟地址和物理地址均为 32 位宽,内存按字节寻址。在地址转换时,虚拟地址的最高 10 位作为一级页表索引,接下来的 10 位作为二级页表索引,最低 12 位作为页内偏移。假设两级页表的页表项均为 4 字节宽。此外,处理器具有命中率为 96% 的转译后备缓冲器(TLB),缓存最近使用的虚拟页号与对应物理页号。处理器还具有命中率为 90% 的物理地址缓存。主存访问时间为 10ns,缓存访问时间为 1ns,TLB 访问时间也为 1ns。
假设某个进程的虚拟地址空间仅包含以下页面:从虚拟地址 0x00000000 开始的两个连续代码页,从虚拟地址 0x00400000 开始的两个连续数据页,以及从虚拟地址 0xFFFFF000 开始的一个栈页。该进程所需的页表存储空间大小为( ):
给定地址的二进制分解如下:
- 32 位被分解为
10 位 (L2) | 10 位 (L1) | 12 位(偏移)
各页面起始地址的二进制表示:
第一个代码页:
0x00000000 = 0000 0000 00 | 00 0000 0000 | 0000 0000 0000
下一个代码页起始于
0x00001000 = 0000 0000 00 | 00 0000 0001 | 0000 0000 0000
第一个数据页:
0x00400000 = 0000 0000 01 | 00 0000 0000 | 0000 0000 0000
下一个数据页起始于
0x00401000 = 0000 0000 01 | 00 0000 0001 | 0000 0000 0000
唯一栈页:
0xFFFFF000 = 1111 1111 11 | 11 1111 1111 | 0000 0000 0000
页表结构分析:
二级页表:只需 1 个页表,包含以下 3 个不同条目:
0000 0000 00
0000 0000 01
1111 1111 11
一级页表:每个二级页表条目需对应 1 个一级页表,因此共需 3 个一级页表
总计:4 个页表(1 个二级 + 3 个一级)
页表存储空间计算:
- 每个页表大小 =
2^10 * 4B = 4KB
(因为 L1/L2 索引各占 10 位) - 总存储空间 =
4 个页表 × 4KB = 16KB
28
以下哪项 不是 一种存储形式?( )
选项解析:
- 指令缓存 - 用于存储频繁使用的指令
- 指令寄存器 - CPU 控制单元的一部分,用于存储当前正在执行的指令
- 指令操作码 - 它是机器语言指令中指定要执行操作的部分
- TLB - 用于存储虚拟内存到物理地址的最近转换,以加快访问速度
结论说明:
除了“指令操作码”以外,其余选项都是存储形式。因此,C 是正确答案。
29
最佳页面置换算法会选择( )的页面。
最佳页面置换算法会选择未来最久才被访问的页面进行替换。例如,当需要换出页面时,如果有两个可选页面:
- 一个将在 5 秒后被使用
- 另一个将在 10 秒后被使用
则算法会优先换出 10 秒后才会被使用的页面。因此选项 B 正确。
30
动态链接可能导致安全问题的原因是( )。
动态链接 和 动态库 不需要复制代码,只需在二进制文件中放置库的名称即可。实际链接发生在程序运行时,此时二进制文件和库都在内存中。动态库(运行时链接的库)的示例包括 Linux 中的 .so
和 Windows 中的 .dll
。
在动态链接中,直到运行时才知道搜索动态库的路径。
31
以下哪项陈述是错误的?( )
解析:
- 虚拟内存 不会直接减少 上下文切换的开销
- 上下文切换的开销主要与以下操作相关:
- 保存和恢复进程状态(如寄存器、页表等)
- 虚拟内存通过分页/分段机制 可能增加 这部分操作的复杂性
- 因此该选项描述 错误
32
将程序各部分分配加载地址并调整代码和数据以反映所分配地址的过程称为( )
重定位是链接器 - 加载器在将程序从外部存储复制到主存时执行的过程。其核心操作包括:
- 链接器通过搜索文件和库
- 用实际可用的内存地址替换库的符号引用
因此,选项 (C) 是正确答案。若发现上述内容存在疏漏或错误,欢迎在下方评论区指正。
33
考虑一台具有 64MB 物理内存和 32 位虚拟地址空间的机器。如果页面大小为 4KB,页表的大致大小是多少?( )
依次计算如下指标:
- 物理地址空间 = 64MB = $2^{26}$ B
- 虚拟地址 = 32 位,因此虚拟地址空间 = $2^{32}$ B
- 页面大小 = 4KB = $2^{12}$ B
- 页数 = $\frac{2^{32}}{2^{12}} = 2^{20}$ 页
- 帧数 = $\frac{2^{26}}{2^{12}} = 2^{14}$ 帧
页表大小由页表项数量与每项大小决定:
$$ \text{页表大小} = 2^{20} \times 14\text{位} \approx 2^{20} \times 16\text{位} = 2^{20} \times 2\text{B} = 2\text{MB} $$
关键点:页表项需记录帧号(14 位)及控制位(如有效/无效标志),实际存储需向上取整至 16 位(即 2 字节)。最终页表大小为 $2^{20} \times 2\text{B} = 2\text{MB}$。
34
假设页面错误的平均服务时间为 10 ms,而内存访问需要 1 ms。那么 99.99% 的命中率会导致平均内存访问时间为多少?( )
当发生页面请求时:
- 命中情况:若页面存在于内存中,仅需执行一次内存访问(1 ms)。
- 未命中情况:若页面不在内存中,需先经历页面错误服务时间(10 ms),再执行内存访问(1 ms)。
设:
- 命中率 $ p = 99.99% $
- 内存访问时间 $ t_1 = 1 \ \mu s $
- 页面错误服务时间 $ t_2 = 10 \ ms = 10{,}000 \ \mu s $
平均内存访问时间公式为:
$$ \text{平均时间} = p \cdot t_1 + (1 - p) \cdot (t_2 + t_1) $$
代入数值计算:
$$ = 0.9999 \cdot 1 + 0.0001 \cdot (10{,}000 + 1) \ = 0.9999 + 1.0001 \ = 1.9999 \ \mu s $$
35
考虑六个大小分别为 200 KB、400 KB、600 KB、500 KB、300 KB 和 250 KB 的内存分区(KB 表示千字节)。这些分区需要按顺序分配给四个大小分别为 357 KB、210 KB、468 KB 和 491 KB 的进程。如果使用最佳适配算法,哪些分区未被分配给任何进程?( )
最佳适应 算法会为新进程在足够大的分区中选择最小的块进行分配。因此内存块的分配顺序如下:
- 357 KB → 选择 400 KB 分区
- 210 KB → 选择 250 KB 分区
- 468 KB → 选择 500 KB 分区
- 491 KB → 选择 600 KB 分区
最终未被分配的分区为 200 KB 和 300 KB。
36
一个计算机系统实现 8 KB 的页面和 32 位的物理地址空间。每个页表项包含一个有效位、一个脏位、三个权限位以及翻译信息。如果进程的页表最大尺寸为 24 兆字节,则系统支持的虚拟地址长度是( )位。
最大虚拟地址长度可通过计算页表项的最大数量来确定:
页表项大小计算
- 物理地址空间:32 位
- 页面大小:8 KB → 需 13 位偏移量($2^{13} = 8192$)
- 物理帧号位数:$32 - 13 = 19$ 位
- 页表项总位数:1(有效位)+ 1(脏位)+ 3(权限位)+ 19(物理地址)= 24 位
页表项数量计算
- 页表最大尺寸:24 MB = $24 \times 2^{20}$ 字节
- 每个页表项大小:24 位 = 3 字节
- 页表项总数:$\frac{24 \times 2^{20}}{3} = 8 \times 2^{20} = 2^{23}$ 个
虚拟地址空间计算
- 虚拟地址空间 = 页表项数量 × 页面大小
- $2^{23} \times 8\text{KB} = 2^{23} \times 2^{13} = 2^{36}$ 字节
- 因此虚拟地址长度为 36 位
37
以下哪一项 不是 同一进程的线程所共享的?( )
38
考虑一个全相联缓存,共有 8 个缓存块(编号 0-7),并有以下内存块请求序列:
4, 3, 25, 8, 19, 6, 25, 8, 16, 35, 45, 22, 8, 3, 16, 25, 7
如果使用 LRU 替换策略,内存块 7 最终会存储在哪个缓存块中?( )
缓存块数量 = 8。给定请求序列:4, 3, 25, 8, 19, 6, 25, 8, 16, 35, 45, 22, 8, 3, 16, 25, 7
。
初始状态
缓存块从 0 到 7 依次为:4 3 25 8 19 6 16 35
(注:25 和 8 是最久未使用的,因此后续 16 和 35 进入缓存块)处理过程
45
替换最久未使用的19
→45 3 25 8 19 6 16 35
22
替换最久未使用的25
→45 22 25 8 19 6 16 35
3
已存在,更新使用时间 →45 22 25 8 3 6 16 35
16
和25
已存在,更新使用时间
最终状态
处理完所有请求后:45 22 25 8 3 7 16 35
内存块7
位于第 5 个缓存块(索引从 0 开始计数)
因此,答案是 B
39
在某个特定的 Unix 操作系统中,每个数据块大小为 1024 字节。每个节点包含 10 个直接数据块地址和三个额外地址:一个用于单级间接块,一个用于双级间接块,一个用于三级间接块。此外,每个块可以容纳 128 个块的地址。以下哪一项最接近该文件系统的最大文件大小?( )
解析:
基本参数
- 数据块大小 = 1024 字节
- 单个块可存储地址数 = 128
各类型地址对应容量
直接地址:10 × 1024 B 单级间接:128 × 1024 B 双级间接:128² × 1024 B 三级间接:128³ × 1024 B
总容量计算
总容量 = (10 + 128 + 128² + 128³) × 1024
= (10 + 128 + 16384 + 2097152) × 1024
= 2113674 × 1024 B
≈ 2.0157 GB ≈ 2 GB
- 结论
最接近的选项为 2GB
40
一个磁盘有 200 个磁道(编号 0 到 199)。在某一时刻,它正在处理从第 120 号磁道读取数据的请求,而上一次服务的请求是针对第 90 号磁道。当前待处理的请求(按到达顺序)为:
30、70、115、130、110、80、20、25。
对于磁盘调度策略 SSTF(最短寻道时间优先)和 FCFS(先来先服务),磁头将改变方向多少次?( )
SSTF 算法分析
- 调度路径:90→120→115→110→130→80→70→30→25→20
- 方向变化:
- 120→115(下降)
- 110→130(上升)
- 130→80(下降)
FCFS 算法分析
- 调度路径:90→120→30→70→115→130→110→80→20→25
- 方向变化:
- 120→30(下降)
- 30→70(上升)
- 130→110(下降)
- 20→25(上升)
因此,SSTF 有 3 次方向变化,FCFS 有 4 次方向变化,最终答案为 C。
41
在一个虚拟内存系统中,虚拟地址大小为 32 位,物理地址大小为 30 位,页面大小为 4 KB,每个页表项的大小为 32 位。主存按字节寻址。以下哪一项是每个页表项中可用于存储保护和其他信息的最大位数?( )
- 虚拟地址空间:2³² 字节
- 物理地址空间:2³⁰ 字节
- 页面/帧大小:4 KB = 2¹² 字节
- 物理帧数量:2³⁰ ÷ 2¹² = 2¹⁸ → 需 18 位表示帧号
- 页表项结构:32 位总长度 = 帧号 (18 位) + 其他信息 (14 位)
因此,页表项中最多可分配 14 位 用于存储保护标志等附加信息。
42
考虑一个具有 4 组、总共 8 个高速缓存块(编号 0-7)的 2 路组相联高速缓存,主内存有 128 个块(编号 0-127)。如果采用 LRU(最近最少使用)策略进行高速缓存块替换,且初始时高速缓存中没有当前任务的任何内存块,请问在以下内存块引用序列后,高速缓存中会包含哪些内存块?
引用序列为:0 5 3 9 7 0 16 55
这是一个 2 路组相联高速缓存,即 K=2。
高速缓存中的组数为 4(S=4,编号 0-3),总共有 8 个块(N=8,编号 0-7),每组包含 2 个块。
主内存有 128 个块(M=128,编号 0-127)。当引用主内存块 X 时,它会被放置到高速缓存中编号为 (X mod S) 的组内。该组内的任意位置均可存放,但如果组已满,则需根据替换策略(此处为 LRU)替换掉最久未使用的块。具体过程如下:
替换步骤解析
引用块与对应组的关系(X→组号=X mod 4)
- 0→0:组 0 有两个空位,块 0 可放入任一位置。
- 5→1:组 1 有两个空位,块 5 可放入任一位置。
- 3→3:组 3 有两个空位,块 3 可放入任一位置。
- 9→1:组 1 剩余一个空位,块 9 放入该位置 → 组 1 已满(块 5 成为 LRU 候选)。
- 7→3:组 3 剩余一个空位,块 7 放入该位置 → 组 3 已满(块 3 成为 LRU 候选)。
- 0→0:块 0 已在高速缓存中(组 0),无需操作。
- 16→0:组 0 已满 → 根据 LRU 策略替换最久未使用的块 0 → 新增块 16。
- 55→3:组 3 已满(块 3 和 7)→ 根据 LRU 策略替换最久未使用的块 3 → 新增块 55。
最终状态
高速缓存中保留的主内存块为:
0, 5, 7, 9, 16, 55
(注:块 3 被块 55 替换,因此不在最终结果中)
43
考虑一个具有 40 位虚拟地址和 16KB 页面大小的计算机系统。如果该系统为每个进程使用一级页表,且每个页表项需要 48 位,则每个进程的页表大小为( )MB。
- 虚拟地址空间大小:$2^{40}$ 字节
- 页面大小:$16\text{KB} = 2^{14}$ 字节
- 页表项数量:$\frac{2^{40}}{2^{14}} = 2^{26}$ 个
- 单个页表项大小:$\frac{48}{8} = 6$ 字节
- 总页表大小:$2^{26} \times 6$ 字节
- 转换为兆字节(MB): $$ \frac{2^{26} \times 6}{2^{20}} = 6 \times 2^6 = 6 \times 64 = 384\text{MB} $$
因此,选项 A 是正确答案。
44
考虑一个具有十个物理页框的计算机系统。该系统提供了一个访问序列(a₁, a₂, …, a₂₀, a₁, a₂, …, a₂₀),其中每个 aᵢ 为数字。最后进先出(LIFO)页面置换策略与最佳(Optimal)页面置换策略在缺页中断次数上的差值是( )。
LIFO 策略分析:
- 第一轮访问 a₁-a₁₀:由于初始无缓存,全部产生缺页中断,共 10 次。
- 第二轮访问 a₁₁-a₂₀:每次访问均替换最新加载的页框(遵循 LIFO 原则),因此 a₁₁-a₂₀ 再次产生 10 次缺页中断。
- 第三轮访问 a₁-a₉:这些页已存在于物理页框中,无需中断。
- 第四轮访问 a₁₀-a₂₀:从 a₁₀ 开始逐个替换栈顶页框,直到 a₂₀,共产生 11 次缺页中断。
总缺页中断次数:10 + 10 + 11 = 31
Optimal 策略分析:
- 第一轮访问 a₁-a₁₀:同样产生 10 次缺页中断。
- 第二轮访问 a₁₁-a₂₀:每次选择未来最久未使用的页框进行替换(a₁₀-a₁₉ 各自后续不再被使用),因此 a₁₁-a₂₀ 产生 10 次缺页中断。
- 第三轮访问 a₁-a₉:页已存在,无需中断。
- 第四轮访问 a₁₀-a₁₉:每次替换未来最久未使用的页框(如 a₁ 替换 a₁₀),共产生 10 次缺页中断。
- 最终访问 a₂₀:页已存在,无需中断。
总缺页中断次数:10 + 10 + 10 = 30
差值计算:
LIFO 缺页中断数 (31) - Optimal 缺页中断数 (30) = 1
45
下列左侧列出了一些操作系统抽象概念,右侧列出了它们所抽象的硬件组件或机制。以下哪一组配对是正确的?( )
A. 线程 | 1. 中断 |
B. 虚拟地址空间 | 2. 内存 |
C. 文件系统 | 3. CPU |
D. 信号 | 4. 磁盘 |
- 线程:由 CPU 调度执行的基本单元
- 虚拟地址空间:通过内存管理机制实现的进程地址映射
- 文件系统:提供对磁盘存储设备的逻辑访问接口
- 信号:属于中断机制的一种软件级实现形式
各选项对应关系如下:
A-3(线程→CPU)
B-2(虚拟地址空间→内存)
C-4(文件系统→磁盘)
D-1(信号→中断)
46
分页系统使用了一个转换后备缓冲器(TLB)。TLB 访问需要 10 ns,主存访问需要 50 ns。如果 TLB 命中率为 90%,且没有页面故障,那么有效访问时间(以 ns 为单位)是多少?( )
有效访问时间 = 命中率 × 命中时的时间 + 未命中率 × 未命中时的时间
参数定义
- TLB 访问时间:10 ns
- 主存访问时间:50 ns
- TLB 命中率:90%
计算逻辑
- 命中场景(90% 概率):
需要访问 TLB(10 ns) + 访问主存(50 ns) → 总耗时10 + 50 = 60 ns
- 未命中场景(10% 概率):
访问 TLB(10 ns) + 访问主存(50 ns) + 再次访问主存(50 ns) → 总耗时10 + 50 + 50 = 110 ns
- 命中场景(90% 概率):
最终公式代入
$$ \text{有效访问时间} = 0.90 \times 60\text{ns} + 0.10 \times 110\text{ns} = 65\text{ns} $$
47
假设主存初始为空,仅包含 4 个页面,每个页面大小为 16 字节。CPU 生成以下虚拟地址序列,并采用 最近最少使用(LRU)页面置换策略:0, 4, 8, 20, 24, 36, 44, 12, 68, 72, 80, 84, 28, 32, 88, 92
该序列会导致多少次页面错误?最终主存中保留的页面编号是什么?( )
页面划分
每个页面大小为 16 字节,因此虚拟地址对应的页面号为地址 // 16
。- 地址序列转换为页面号:
- 0 → 0
- 4 → 0
- 8 → 0
- 20 → 1
- 24 → 1
- 36 → 2
- 44 → 2
- 12 → 0
- 68 → 4
- 72 → 4
- 80 → 5
- 84 → 5
- 28 → 1
- 32 → 2
- 88 → 5
- 92 → 5
- 地址序列转换为页面号:
模拟过程(主存容量为 4 页,采用 LRU 策略):
- 初始状态:空
- 访问 0(页面 0)→ 缺页(当前页面:[0])
- 访问 4(页面 0)→ 命中
- 访问 8(页面 0)→ 命中
- 访问 20(页面 1)→ 缺页([0,1])
- 访问 24(页面 1)→ 命中
- 访问 36(页面 2)→ 缺页([0,1,2])
- 访问 44(页面 2)→ 命中
- 访问 12(页面 0)→ 命中
- 访问 68(页面 4)→ 缺页([0,1,2,4])
- 访问 72(页面 4)→ 命中
- 访问 80(页面 5)→ 缺页(替换最久未使用的页面 0 → [1,2,4,5])
- 访问 84(页面 5)→ 命中
- 访问 28(页面 1)→ 命中
- 访问 32(页面 2)→ 命中
- 访问 88(页面 5)→ 命中
- 访问 92(页面 5)→ 命中
统计结果
共发生 7 次页面错误,最终主存中的页面为 1, 2, 4, 5。
48
将以下左侧虚拟内存管理中使用的标志位与下表右侧的不同用途进行匹配( )。
位名称 | 功能 |
---|---|
I. Dirty | a. 标记页面是否有效 |
II. R/W | b. 写回策略 |
III. Reference | c. 页面保护 |
IV. Valid | d. 页面替换策略 |
解析
各标志位功能说明
脏位
标记页面是否被修改过。当需要替换页面时,若该位为 1 则需写回磁盘(用于写回策略)。读/写位(R/W)
控制页面访问权限,决定是否允许写入操作(用于页面保护)。引用位
记录页面是否被访问过,辅助页面置换算法判断哪些页面最近未被使用(用于页面置换策略)。有效位
标识页面是否已加载到主存。若为 0 表示页面不在内存中,触发缺页中断(即页面初始化过程)。
正确答案依据
选项 D 的匹配关系(I-b, II-c, III-d, IV-a)准确反映了上述标志位与功能的对应逻辑。
49
假设我在虚拟内存中实现了新的页面置换算法叫做 Geek 算法,该算法的工作策略如下:
- 内存中的每个页面维护一个计数器,当页面被引用且未发生缺页中断时,该计数器递增。
- 如果发生缺页中断,则用新页面替换物理页面中计数为零或最小的页面;若存在多个计数为零或最小的页面,则使用 FIFO 策略进行替换。
请计算使用该算法处理以下参考字符串时发生的缺页中断次数(假设初始有三个空闲的物理页框):A B C D A B E A B C D E B A D
根据算法规则逐步分析参考字符串:
A → 缺页(0 次命中)
当前页框:[A]
计数器:{A:1}B → 缺页
页框:[A,B]
计数器:{A:1, B:1}C → 缺页
页框:[A,B,C]
计数器:{A:1, B:1, C:1}D → 缺页(页框已满)
- 替换条件:计数最小的页面(A/B/C 均计数 1)
- FIFO 策略:替换最早加入的 A
页框:[D,B,C]
计数器:{D:1, B:1, C:1}
A → 缺页
- 替换条件:D/B/C 均计数 1
- FIFO 策略:替换 D
页框:[A,B,C]
计数器:{A:1, B:1, C:1}
B → 命中
- B 计数 +1 → {A:1, B:2, C:1}
E → 缺页
- 替换条件:A/C 均计数 1
- FIFO 策略:替换 A
页框:[E,B,C]
计数器:{E:1, B:2, C:1}
A → 缺页
- 替换条件:E/C 均计数 1
- FIFO 策略:替换 E
页框:[A,B,C]
计数器:{A:1, B:2, C:1}
B → 命中
- B 计数 +1 → {A:1, B:3, C:1}
C → 命中
- C 计数 +1 → {A:1, B:3, C:2}
D → 缺页
- 替换条件:A 计数 1
页框:[D,B,C]
计数器:{D:1, B:3, C:2}
- 替换条件:A 计数 1
E → 缺页
- 替换条件:D 计数 1
页框:[E,B,C]
计数器:{E:1, B:3, C:2}
- 替换条件:D 计数 1
B → 命中
- B 计数 +1 → {E:1, B:4, C:2}
A → 缺页
- 替换条件:E 计数 1
页框:[A,B,C]
计数器:{A:1, B:4, C:2}
- 替换条件:E 计数 1
D → 缺页
- 替换条件:A 计数 1
页框:[D,B,C]
计数器:{D:1, B:4, C:2}
- 替换条件:A 计数 1
总计发生 11 次缺页中断,对应选项 C。
50
无法在不支持以下功能的硬件上实现多用户、多处理操作系统( ):
a) 地址转换
b) 磁盘传输的直接内存存取(DMA)
c) 至少两种 CPU 执行模式(特权和非特权)
d) 请求分页
正确答案应为 (a) 和 (c),因为:
- 地址转换是多道程序设计所必需的,以确保进程不能访问其他进程的内存。
- CPU 执行模式至少需要两种(特权和非特权),以便特权模式能够控制非特权模式用户的资源分配。
DMA 和请求分页虽然提高了操作系统的性能,但并非多道程序设计的必要条件。由于选项中未单独列出 (a) 和 (c),因此最佳选择是包含这两项的选项 (C)。
所以,选项 (C) 是正确的。
51
以下哪些选项是虚拟内存的优势( )?
a) 平均而言,内存访问速度更快。
b) 可以为进程提供受保护的地址空间。
c) 链接器可以分配与程序在物理内存中加载位置无关的地址。
d) 可以运行大于物理内存大小的程序。
解析:
- A 选项错误:页面交换会增加时间开销,而虚拟内存的概念相比直接访问物理内存会减慢执行速度。
- B 选项正确:没有虚拟内存时,进程直接访问物理内存,难以实现受保护的地址空间。
- C 选项错误:可以通过其他方法独立于程序加载位置分配地址。
- D 选项正确:虚拟内存允许进程使用比物理内存地址空间更大的虚拟地址空间,并在物理内存满时在物理内存和虚拟内存之间交换页面。
结论:
(b) 和 (d) 是正确的陈述。
52
可以使用自由链表或位图来跟踪磁盘空闲空间。磁盘地址需要 $d$ 位。对于一个包含 13 个块的磁盘,其中有 $F$ 个是空闲的,请说明在什么条件下自由链表占用的空间比位图更少( )?
53
局部性原理意味着进程所进行的页面引用( )。
B
解释:
- 局部性原理包含 时间局部性 和 空间局部性 两种形式
- 时间局部性 表明程序倾向于重复访问最近访问过的数据或指令(如循环结构)
- 空间局部性 表明程序倾向于访问相邻的存储位置(如数组遍历)
- 因此,选项 B 正确描述了这种概率性的访问模式
- 其他选项均存在绝对化表述(如“始终”),与局部性原理的实际特性不符
54
抖动(Thrashing)带来的结果是( )。
解析
- 抖动是指进程频繁地进行页面置换操作的现象
- 当系统发生抖动时,进程的页面频繁调入调出内存
- 这会导致大量的页面 I/O 操作,显著降低系统效率
- 因此"意味着过多的页面 I/O"是抖动最直接的表现特征
55
页表中某页面的脏位的功能是( )。
- 功能说明:脏位用于判断当某个页面被修改后需要替换时,是否需要执行写回操作
- 工作原理:通过脏位可以确定是否需要将修改后的数据写回磁盘或保留原状
- 结论:因此,页表中页面的脏位能够避免在分页设备上进行不必要的写入操作
56
以下哪个选项是错误的?( )
解析
- 外部碎片:指系统中存在足够分散的小空闲内存区域,但它们无法满足当前请求的连续内存需求(即空间不连续)
- 内部碎片:指已分配内存块中未被使用的部分,通常由于分配单元大于实际需求所致
- 分页机制特性:
- 不会产生外部碎片(通过固定大小页框实现)
- 可能存在内部碎片(最后一页可能未填满)
- 分段机制特性:
- 可能产生外部碎片(各段大小不一导致空闲区难以利用)
选项 A 的描述将内外碎片定义完全颠倒,因此是错误的。
57
考虑一个在按需分配内存页面的操作系统上运行的进程。如果对应的内存页在内存中可用,系统的平均内存访问时间为 M 单位;如果内存访问导致页面错误,则平均时间为 D 单位。实验测量显示该进程的平均内存访问时间为 X 单位。以下哪一个是该进程经历的页面错误率的正确表达式?
平均内存访问时间 = (1 - 页面错误率) × 内存无页面错误时的访问时间 + 页面错误率 × 内存有页面错误时的访问时间。公式推导:
$$X = (1 - p)M + pD$$
$$X = M + p(D - M)$$
$$p = \frac{X - M}{D - M}$$
58
以下哪项关于虚拟内存的说法是不正确的( )?
选项分析:
- A: 正确。虚拟内存允许程序使用比物理内存更大的地址空间,从而支持编写大型程序。
- B: 错误。虚拟内存通过分页机制减少不必要的 I/O 操作,而非增加。此选项描述与实际相反。
- C: 正确。虚拟内存技术扩展了可用的可寻址内存空间。
- D: 正确。页面置换算法优化了进程切换效率,使交换过程更高效。
结论:
因此,选项 B 的说法不正确,正确答案为 B。
59
一个内存管理系统有 64 个页面,每个页面大小为 512 字节。物理内存包含 32 个页框。逻辑地址和物理地址分别需要多少位?( )
虚拟地址计算
虚拟内存空间 = 页面数量 × 页面大小 = 64 × 512 B = $2^6 \times 2^9$ B = $2^{15}$ B
需要 15 位表示逻辑地址物理地址计算
物理内存空间 = 页框数量 × 页框大小 = 32 × 512 B = $2^5 \times 2^9$ B = $2^{14}$ B
需要 14 位表示物理地址
因此,逻辑地址需 15 位,物理地址需 14 位,选项 C 正确。
60
在分段方案中考虑以下段表:
SegmentID | Base | Limit |
---|---|---|
0 | 200 | 200 |
1 | 500 | 12510 |
2 | 1527 | 498 |
3 | 2500 | 50 |
当请求的逻辑地址为段号 2 且偏移量为 1000 时会发生什么?( )
解析:
- 段 2 的基地址 = 1527
- 段 2 的限长 = 498
- 可访问的有效地址范围:1527 至 1527 + 498 = 2025
- 请求的偏移量 1000 对应的物理地址:1527 + 1000 = 2527
- 由于 2527 > 2025,该访问超出了段 2 的合法范围
- 因此操作系统会触发 分段错误陷阱(Segmentation Fault Trap)
61
使用下图所示的页表,将物理地址 25 转换为虚拟地址。地址长度为 16 位,页面大小为 2048 字,物理内存大小为四个页框。
Page | Present(1-In 0-out) | Frame |
---|---|---|
0 | 1 | 3 |
1 | 1 | 2 |
2 | 1 | 0 |
3 | 0 | - |
已知虚拟地址长度为 16 位,页面大小为 2¹¹字节。因此:
- 页面数量 = 2¹⁶ / 2¹¹ = 2⁵
- 物理地址 = (页框数) × (每个页框大小) = 4 × 2¹¹ = 2¹³
物理地址 25₁₀ = 13 位二进制表示为 (0000000011001)₂
其中前两位表示页框号,后 11 位表示页内偏移量:(00 00000011001)₂
根据页表:
- 帧号 00 映射到页号 2
- 页号 2 = (00010)₂
- 页内偏移量 = (00000011001)₂
因此,16 位虚拟地址 = (00010 00000011001)₂ = 4121₁₀
选项 D 正确。
62
一台计算机有 16 页的虚拟地址空间,但主存大小只有 4 个帧。初始时内存为空。一个程序按顺序引用虚拟页面 0、2、4、5、2、4、3、11、2、10。如果使用 LRU 页面置换算法,会发生多少次页面错误?( )
解析:
初始状态
内存为空,可用帧数 4 个。页面引用序列分析
按顺序处理每个页面请求,记录内存状态及页面错误:步骤 访问页面 内存状态(当前帧) 是否页面错误 替换页面 1 0 [0] 是 - 2 2 [0, 2] 是 - 3 4 [0, 2, 4] 是 - 4 5 [0, 2, 4, 5] 是 - 5 2 [0, 2, 4, 5] 否 - 6 4 [0, 2, 4, 5] 否 - 7 3 [0, 2, 3, 5] 是 4(LRU) 8 11 [0, 2, 3, 11] 是 5(LRU) 9 2 [0, 2, 3, 11] 否 - 10 10 [0, 2, 3, 10] 是 11(LRU) 关键逻辑
- 页面错误条件:目标页面不在内存中。
- LRU 策略:当内存满时,移除最近最久未被访问的页面。
- 替换规则:每次页面错误后,选择时间戳最早的页面替换。
统计结果
共发生 7 次页面错误(步骤 1-4、7-8、10)。
63
以下哪项/哪些可能是导致系统抖动的原因( )?
当多道程序度持续增加时,由于每个进程的内存空间不足,会导致缺页次数增加,而进程执行几乎无法推进。这种情况称为抖动。
- 结论:选项 (B) 是正确答案
- 解析:
抖动现象主要由内存资源过度分配引发。当系统中运行的程序过多(选项 B),每个进程可分配的物理页数减少,导致频繁的页面置换和缺页中断,最终形成"抖动"。
页面大小过小(选项 A)虽然会增加页表开销,但不会直接导致抖动;LRU/FIFO(选项 C/D)是常见的页面置换算法,其选择与抖动无直接因果关系。
64
考虑一个由 8 页组成、每页 1024 字的逻辑地址空间,映射到有 32 帧的物理内存。物理地址和逻辑地址各有多少位?( )
逻辑地址计算
- 页号字段位数:$\log_2 8 = 3$ 位
- 偏移量位数:$\log_2 1024 = 10$ 位
- 总位数:3 + 10 = 13 位
物理地址计算
- 帧号字段位数:$\log_2 32 = 5$ 位
- 偏移量位数:$\log_2 1024 = 10$ 位
- 总位数:5 + 10 = 15 位
选项 C 正确。
65
设 Pi 和 Pj 是两个进程,R 表示从内存中读取的变量集合,W 表示写入内存的变量集合。对于这两个进程的并发执行,以下哪项条件 不成立?( )
- 关键分析:
- 当两个进程同时读取同一变量(R(Pi) ∩ R(Pj) ≠ Ф)时,并发执行不会导致冲突。
- 因此选项 C 的条件“R(Pi) ∩ R(Pj) = Ф”并非必须满足的条件。
- 其他选项(A、B、D)描述的互斥关系是保证并发安全性的必要条件。
66
如果在 32 位机器中页面大小为 4K 字节,则页表的大小是( )
解析过程:
- 物理地址大小:32 位
- 逻辑地址大小:32 位
- 页面大小:4KB = $2^{12}$ B
步骤 1:计算页面数量
$$ \text{页面数量} = \frac{\text{逻辑地址空间}}{\text{页面大小}} = \frac{2^{32}}{2^{12}} = 2^{20} $$
步骤 2:计算页表大小
- 页表项大小:32 位系统中每个页表项占 4 字节($2^2$ B) $$ \text{页表大小} = \text{页面数量} \times \text{页表项大小} = 2^{20} \times 2^2 = 2^{22} \ \text{B} = 4 \ \text{MB} $$
结论:选项 (C) 正确。
67
考虑一个使用四级页表的 32 位机器。如果 TLB 命中率为 98%,搜索 TLB 需要 20 ns,访问主存需要 100 ns,那么有效内存访问时间是多少 ns( )?
对于四级页表方案,有效内存访问时间(EAT)计算公式为:
$$ \text{EAT} = H_{\text{TLB}} \times T_{\text{TLB}} + (1 - H_{\text{TLB}})[T_{\text{TLB}} + 4 \times T_m] + T_m $$
其中:
- $ H_{\text{TLB}} $:TLB 命中率
- $ T_{\text{TLB}} $:TLB 搜索时间
- $ T_m $:内存访问时间
计算步骤:
代入已知参数:
- $ H_{\text{TLB}} = 0.98 $
- $ T_{\text{TLB}} = 20 \ \text{ns} $
- $ T_m = 100 \ \text{ns} $
代入公式计算: $$ \begin{align*} \text{EAT} &= (0.98 \times 20) + 0.02(20 + 4 \times 100) + 100 \\ &= 19.6 + 0.02(20 + 400) + 100 \\ &= 19.6 + 8.4 + 100 \\ &= 128 \ \text{ns} \end{align*} $$
选项 (B) 正确。
68
下面关于页面错误(Page Fault)的说法正确的是( )
触发机制:
- 当在缓存中找不到目标页面时,系统会查询主存
- 若主存中同样缺失该页面,则触发页面错误
处理流程:
- 执行页面错误服务例程
- 从磁盘调入所需页面至内存
- 更新页表以反映最新映射关系
因此,选项 (D) 正确。
69
临界区是一个程序段( )
- 关键概念:临界区是指在并发编程中需要被保护的代码区域
- 核心作用:用于管理对共享资源的互斥访问
- 技术原理:
- 多线程/进程环境下,共享资源的并发访问可能引发数据竞争
- 通过同步机制(如信号量)确保同一时刻只有一个执行流进入临界区
- 典型应用场景包括文件操作、内存共享等需要原子性保障的场景
因此,选项 C 正确。
70
考虑一个小型的 2 路组相联高速缓存,包含四个块。在选择替换块时,使用最近最少使用(LRU)策略。对于以下块地址序列 8、12、0、12、8,缓存未命中的次数是( ):
解析:
- 初始状态:缓存为空。
- 访问块 8:未命中,缓存中加入块 8。
- 访问块 12:未命中,缓存中加入块 12。
- 访问块 0:未命中,缓存已满,根据 LRU 策略替换最早使用的块 8,缓存更新为 [0, 12]。
- 再次访问块 12:命中,更新 LRU 状态(12 变为最近使用的块)。
- 再次访问块 8:未命中,缓存中无块 8,根据 LRU 策略替换最早使用的块 0,缓存更新为 [8, 12]。
总结:
未命中发生在第 1、2、3、5 次访问,共 4 次未命中。
71
在分页内存中,页面命中率为 0.40。访问辅存中页面所需时间为 120 ns,访问主存中页面所需时间为 15 ns。访问页面所需的平均时间是( )。
计算公式
平均访问时间 = 命中率 × 主存访问时间 + (1 - 命中率) × 辅存访问时间代入数值
$$ \text{平均访问时间} = 0.4 \times 15 + 0.6 \times 120 $$
分步计算
$$ = 6 + 72 $$
最终结果 $$ = 78\ \text{ns} $$
因此,选项 D 正确。
72
以下哪些陈述是正确的?( )
(a) 当有足够的总内存空间满足请求但可用空间 不连续 时,存在外部碎片。
(b) 内存碎片可以是内部的也可以是外部的。
(c) 解决外部碎片的一种方法是压缩(compaction)。
Code:
- 关于 (a):该陈述描述的是外部碎片的定义本身。当系统有足够总内存但无法找到连续可用空间时,必然存在外部碎片。因此 (a) 的表述是错误的,因为它将外部碎片的存在条件与结果混淆了。
- 关于 (b):内存碎片确实分为内部碎片(分配单元未被完全利用)和外部碎片(分散的小空闲区),因此 (b) 正确。
- 关于 (c):通过压缩技术(如移动进程位置)可以合并外部碎片,这是解决外部碎片的有效方法之一,因此 (c) 正确。
综上,正确答案为 仅 (b) 和 (c),对应选项 (C)。
73
内存中的页面信息也称为页表。页表中每个条目的基本内容是( )。
解析
页表的核心功能是实现虚拟地址到物理地址的映射。每个页表项存储的是页框号(Page Frame Number, PFN),用于与虚拟页号组合形成完整的物理地址。
页表项通常包含以下字段:
- 有效位(Valid Bit):标记该页是否已加载到内存
- 页框号(Page Frame Number):物理内存中对应页框的编号
- 访问权限(Protection Bits):控制读/写/执行权限
- 修改位(Dirty Bit):记录页面是否被修改过
- 引用位(Reference Bit):记录页面是否被访问过
因此,页表中每个条目的基本内容是页框号,其他信息属于附加属性而非核心内容。
74
考虑为新进程分配内存。假设内存中现有的所有碎片都无法完全满足该进程的内存需求。因此,无论在哪个现有碎片中进行分配,都会产生一个更小的新碎片。以下哪一项陈述是正确的?( )
- A 如果首次适应分区的大小小于下次适应分区的大小,可能不成立。
- B 如果最差适应和首次适应位于同一分区,可能不成立。
- C 始终正确,因为最佳适应算法始终产生最小的碎片。
- D 完全错误。
75
考虑一个使用一级页表的分页系统,该页表驻留在主存中,并通过 TLB(转换后备缓冲器)进行地址转换。每次主存访问需要 100 ns(ns),TLB 查找需要 20 ns。每次页面在磁盘与主存之间的传输需要 5000 ns。假设 TLB 命中率为 95%,缺页率是 10%。假设在所有缺页中,有 20% 的情况需要先将脏页写回磁盘,然后再从磁盘读取所需页面。忽略 TLB 更新时间。
平均内存访问时间(单位:ns,四舍五入到小数点后一位)是多少?( )
已知以下信息:
M = 100 ns
T = 20 ns
D = 5000 ns
h = 0.95
p = 0.1
d = 0.2
计算公式推导
平均内存访问时间由三部分组成:
- TLB 命中时:直接访问 TLB(20ns) + 主存访问(100ns)
- TLB 未命中但无缺页:需两次主存访问(页表查询 + 数据访问)
- TLB 未命中且发生缺页:
- 80% 情况:仅读取页面(5000ns + 100ns)
- 20% 情况:先写回脏页(5000ns)再读取(5000ns + 100ns)
完整公式如下:
$$ \begin{align*} &= h \times (T + M) \\ &\quad + (1 - h)\left[(1 - p) \times 2M \right.\\ &\quad\quad\quad\quad + p\left((1 - d)(D + M) + d(2D + M)\right)\\ &\quad\quad\quad\quad \left. + T\right] \end{align*} $$
数值代入计算
$$ \begin{align*} &= 0.95 \times (20 + 100) \\ &\quad + 0.05\left[0.9 \times 200 \right.\\ &\quad\quad\quad\quad + 0.1\left(0.8 \times 5100 + 0.2 \times 10100\right)\\ &\quad\quad\quad\quad \left. + 20\right] \\ &= 154.5 \text{ ns} \end{align*} $$
选项 A 正确。
76
在操作系统中,以下关于分页的陈述哪些是正确的?( )
解析
- 正确(A):分页通过将物理内存划分为固定大小的页框,避免了不同进程之间因大小不一导致的外部碎片问题。
- 错误(B):页面大小直接影响内部碎片程度。页面越大,未被利用的空间比例越高;页面越小,内部碎片总量可能增加但单个碎片比例降低。
- 错误(C):分页需要维护页表等数据结构,这会占用额外内存空间。
- 错误(D):多级分页的主要目的是减少页表占用的连续内存空间,而非支持不同大小的页面。
77
以下哪项最能描述使用内存映射 I/O 的计算机?( )
解析:
- 内存映射 I/O 的核心特征是 统一地址空间,即内存和 I/O 设备共享同一地址范围
- 通过 地址映射机制,I/O 设备的寄存器被绑定到特定地址值
- CPU 访问地址时,根据地址范围自动判断目标是物理内存还是 I/O 设备
- 选项 (B) 准确描述了这种 “I/O 端口像内存地址一样被访问” 的特性
其他选项对比:
选项 | 错误原因 |
---|---|
A | 描述的是独立 I/O 模式(如 x86 的 IN/OUT 指令) |
C | 属于通道 I/O 的工作方式 |
D | 与内存管理单元无关 |
78
一个使用 300 GB 磁盘的文件系统,其文件描述符包含 8 个直接块地址、1 个间接块地址和 1 个双重间接块地址。每个磁盘块的大小为 128 字节,每个磁盘块地址的大小为 8 字节。该文件系统中文件的最大可能大小是( ):
解析:
直接块总大小
- 直接块数量 × 每个磁盘块大小 = 8 × 128 B = 1024 B
一级间接块容量
- 单个磁盘块可存储地址数 = 128 B / 8 B = 16 个地址
- 一级间接块总容量 = 16 个地址 × 128 B = 2048 B
二级间接块容量
- 第一层间接块地址数 = 16 个
- 第二层间接块地址数 = 16 个 × 16 个 = 256 个地址
- 二级间接块总容量 = 256 个地址 × 128 B = 32768 B
最大文件总大小
- 总容量 = 1024 B + 2048 B + 32768 B = 35840 B
- 转换为 Kbytes:35840 B ÷ 1024 B/KiB ≈ 35 KiB
79
在 Unix 文件系统中,非常大的文件的数据块是通过以下哪种方式分配的?( )
Unix 文件系统使用了索引分配的扩展形式。其特点包括:
多级索引结构
- 直接块(Direct Blocks)
- 单间接块(Single Indirect Block)
- 双间接块(Double Indirect Block)
- 三间接块(Triple Indirect Block)
扩展性设计
通过多级间接块的嵌套组合,可支持超大文件存储,同时避免传统索引分配中固定大小索引表的限制。
80
一个类 Unix 风格的 i 节点包含 10 个直接指针、1 个单级间接指针、1 个双级间接指针和 1 个三级间接指针。磁盘块大小为 1 Kbyte,磁盘块地址为 32 位,但使用 48 位整数进行寻址。最大可能的文件大小是多少?( )
解析:
磁盘块参数
- 磁盘块大小 = 1Kbyte(1024 字节)
- 地址长度 = 48 位(6 字节),而非 32 位
- 每块可存储地址数 = 1024 / 6 ≈ 170.66 → 取近似值 2⁸
最大文件大小计算
总块数 = 直接指针 + 单级间接 + 双级间接 + 三级间接 = 10 + 2⁸ + (2⁸ × 2⁸) + (2⁸ × 2⁸ × 2⁸) ≈ 2²⁴ 块
最终文件大小
- 每块大小 = 2¹⁰ 字节(1Kbyte)
- 总大小 = 2²⁴ × 2¹⁰ = 2³⁴ 字节