2020 年春《操作系统》期末真题
考试日期为 2020 年 6 月 4 日,满分 100 分,采用线上答卷形式。源目录中的答案署名为“2018 级《操作系统》期末 By dhy && selia”,并明确注明“以下答案不保证正确,仅供参考”,因此我将其标为源学生答案,不把它冒充官方答案。
一、存储管理 1(15 分)
一个 32 位虚拟存储系统采用两级页表,逻辑地址格式为:
| 第一级页表索引 | 第二级页表索引 | 页内偏移 |
|---|---|---|
| 10 位 | 10 位 | 12 位 |
物理地址为 32 位,其中物理页框号 20 位、页内偏移 12 位。每个页表项为 32 位,高 20 位是物理页框号,低 12 位是标志位;第 0 位是有效位,第 1 位是读写位。
- 进程地址空间共有多少字节?(3 分)
- 将答卷同学学号的最后两位记为
MN,从逻辑地址0xMN000000开始映射 4 MB 页表。第一级页表的逻辑地址在哪里?第一级页表中指向自身的表项逻辑地址是多少?说明理由。(6 分) - 当前进程第一级页表的物理地址为
0x00200000。物理内存采用大端存储,相关内存转储如下。判断六条指令的执行结果:Load成功时写出读入的一个字节,失败时写Error;Store成功时写OK,失败时写Error。(6 分)
Address +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
00000000 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D
00000010 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D
...
00001010 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
00001020 40 03 41 01 30 01 31 03 00 03 00 00 00 00 00 00
00001030 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
00001040 10 01 11 03 31 03 13 00 14 01 05 03 16 01 17 00
...
00002030 10 01 11 00 12 03 67 03 11 03 00 00 00 00 00 00
00002040 02 20 03 30 04 40 05 50 01 60 03 70 08 80 09 90
00002050 10 00 31 01 10 03 31 01 12 03 30 00 10 00 10 01
...
00004000 30 00 31 01 11 01 33 03 34 01 35 00 43 38 32 79
00004010 50 28 84 19 71 69 39 93 75 10 58 20 97 49 44 59
00004020 23 03 20 03 00 01 62 08 99 86 28 03 48 25 34 21
...
00100000 00 00 10 65 00 00 20 67 00 00 30 00 00 00 40 07
00100010 00 00 50 03 00 00 00 00 00 00 00 00 00 00 00 00
...
00103000 11 22 00 05 55 66 77 88 99 AA BB CC 00 00 00 07
00103010 22 33 44 55 66 77 88 99 AA BB CC DD EE FF 00 67
...
001FE000 04 15 00 00 48 59 70 7B 8C 9D AE BF D0 E1 F2 03
001FE010 10 15 00 67 10 15 10 67 10 15 20 67 10 15 30 67
...
001FF000 00 00 00 00 00 00 00 65 00 00 10 67 00 00 00 00
001FF010 00 00 20 67 00 00 30 67 00 00 40 67 00 00 50 07
...
001FFFF0 00 00 00 00 00 00 00 00 10 00 00 67 00 10 30 67
...
00200000 00 10 00 07 00 10 10 07 00 10 20 07 00 10 30 07
00200010 00 10 40 07 00 10 50 07 00 10 60 07 00 10 70 07
00200020 00 10 00 07 00 00 00 00 00 00 00 00 00 00 00 00
...
00200FF0 00 00 00 00 00 00 00 00 00 1F E0 07 00 1F F0 07
待判断的指令为:
Load [0x00001034]Store [0x00C07665]Store [0x00C005FF]Load [0x00C03012]Load [0xFF80078F]Load [0xFFFFF00B]
查看源学生答案
-
32 位地址空间共有 字节,即 4 GB。
-
令 。4 MB 页表覆盖全部 个虚页,每项 4 B。源答案给出:
- 第一级页表的逻辑地址为 ;
- 指向第一级页表自身的表项逻辑地址为 。
原因是第一级页表位于整片页表空间的第 个页面;先用 找到页目录,再用 找到其中的自映射表项。
-
地址翻译结果如下:
指令 一级索引 / 二级索引 / 偏移 关键页表项 结果 Load [0x00001034]000 / 001 / 0340x00100007→0x000020670x12Store [0x00C07665]003 / 007 / 6650x00103007→0xEEFF0067OKStore [0x00C005FF]003 / 000 / 5FF0x00103007→0x11220005,只读ErrorLoad [0x00C03012]003 / 003 / 0120x00103007→0x000000070x20Load [0xFF80078F]3FE / 000 / 78F0x001FE007→0x04150000,无效ErrorLoad [0xFFFFF00B]3FF / 3FF / 00B0x001FF007→0x001030670xCC
源答案把第一条指令的二级页表项地址写成了 0x00100001;按每项 4 B 计算应为 0x00100004,但其读取的页表项值及最终结果不受这个笔误影响。
二、存储管理 2(10 分)
- 页面走向为 5、4、3、2、4、5、4、1、5、2、5、4、5、2、1。系统有 3 个初始为空的物理页,分别求 OPT、FIFO 和 LRU 的缺页次数,并写出计算过程。(6 分)
- 只考虑页内碎片和页表的额外内存开销。进程平均大小为 1 MB,每个页表项为 8 B,为使额外开销尽量小,页面大小应如何设置?写出推导过程。(4 分)
查看源学生答案
三种算法的缺页次数为:
| 算法 | 缺页次数 |
|---|---|
| OPT | 7 |
| FIFO | 11 |
| LRU | 9 |
以“最近位置在左侧”记录页框,源答案的过程可压缩为:
引用: 5 4 3 2 4 5 4 1 5 2 5 4 5 2 1
OPT : M M M M H H H M H H H M H H M
FIFO: M M M M H M M M H M M M H H M
LRU : M M M M H M H M H M H M H H M
设进程平均大小为 ,页表项大小为 ,页面大小为 。页表大约占 字节,最后一页的平均内碎片约为 字节,因此总额外开销为
令 ,得到
三、存储管理 3(10 分)
可变分区内存管理系统的总内存为 128 KB,初始分配情况如下:
| 起始地址 | 分区大小 | 占用情况 |
|---|---|---|
| 0 | 10 KB | 作业 A |
| 10 KB | 10 KB | 空闲 |
| 20 KB | 12 KB | 作业 B |
| 32 KB | 2 KB | 空闲 |
| 34 KB | 6 KB | 作业 C |
| 40 KB | 20 KB | 空闲 |
| 60 KB | 24 KB | 作业 D |
| 84 KB | 8 KB | 作业 E |
| 92 KB | 18 KB | 空闲 |
| 110 KB | 5 KB | 作业 F |
| 115 KB | 13 KB | 作业 G |
作业 X、Y、Z 分别请求 12 KB、30 KB、9 KB 内存。事件依次为:X 到达、C 结束、D 结束、Y 到达、E 结束、Z 到达。分别使用 First Fit 和 Best Fit 分配,写出最终内存分配表。
查看源学生答案
First Fit 最终结果:
| 起始地址 | 分区大小 | 占用情况 |
|---|---|---|
| 0 | 10 KB | 作业 A |
| 10 KB | 9 KB | 作业 Z |
| 19 KB | 1 KB | 空闲 |
| 20 KB | 12 KB | 作业 B |
| 32 KB | 8 KB | 空闲 |
| 40 KB | 12 KB | 作业 X |
| 52 KB | 30 KB | 作业 Y |
| 82 KB | 28 KB | 空闲 |
| 110 KB | 5 KB | 作业 F |
| 115 KB | 13 KB | 作业 G |
关键过程是:X 先进入 [40,60);C、D 释放后 [32,40) 和 [52,84) 成为空闲区;Y 进入从低地址开始遇到的 [52,84);E 结束后相邻空闲区合并为 [82,110);Z 最后进入 [10,20)。
Best Fit 最终结果:
| 起始地址 | 分区大小 | 占用情况 |
|---|---|---|
| 0 | 10 KB | 作业 A |
| 10 KB | 9 KB | 作业 Z |
| 19 KB | 1 KB | 空闲 |
| 20 KB | 12 KB | 作业 B |
| 32 KB | 30 KB | 作业 Y |
| 62 KB | 20 KB | 空闲 |
| 92 KB | 12 KB | 作业 X |
| 104 KB | 6 KB | 空闲 |
| 110 KB | 5 KB | 作业 F |
| 115 KB | 13 KB | 作业 G |
这里 X 先进入与 12 KB 最接近的 [92,110);C、D 释放后形成 [32,84),Y 再从中取得 30 KB;E 结束后 [62,92) 合并为 30 KB 空闲区;Z 仍进入 10 KB 的 [10,20)。
四、磁盘管理(10 分)
时刻 的磁盘请求柱面序列为 10、22、20、2、40、6、38。磁头初始位于 20 号柱面并向柱面号增大的方向移动,每移动一个柱面需 4 ms。磁盘共有 51 个柱面,编号为 0~50。
- 使用 SCAN 电梯调度算法,且每次必须扫描到柱面边界才反向。给出访问请求的顺序与寻道总时间。(5 分)
- 若在 ms、 ms、 ms 分别新增对 50、1、10 号柱面的请求,仍使用上述算法,给出各请求的访问时刻、磁头位置、请求队列、实际访问顺序和总时间。(5 分)
查看源学生答案
-
访问顺序为
20 → 22 → 38 → 40 →(扫描到边界 50)→ 10 → 6 → 2磁头先从 20 移到 50,再从 50 返回 2,共移动 个柱面,寻道时间为 ms。
-
源答案给出的过程为:
相对时刻 / ms 磁头位置 处理后仍待访问的请求 0 20 10、22、2、40、6、38 8 22 10、2、40、6、38 72 38 10、2、40、6、50、1 80 40 10、2、6、50、1 120 50 10、2、6、1、10 280 10 2、6、1 296 6 2、1 312 2 1 316 1 无 因两个请求都访问 10 号柱面,磁头到达 10 时可一并处理。实际顺序为
20 → 22 → 38 → 40 → 50 → 10 → 6 → 2 → 1总寻道时间为 316 ms。
五、进程同步与互斥 1(15 分)
一个仓库最多容纳 50 件产品,不区分产品类型,每次只允许一个产品进出。甲、乙两个车间分别生产 A、B 两类产品并共用仓库;仓库满时不能继续生产。有 5 个需要 A 产品的客户和 5 个需要 B 产品的客户,分别从仓库提取对应产品。
请用 P、V 操作实现两个车间与两类客户之间的同步、互斥关系,给出伪代码,并说明信号量和主要代码的含义。
查看源学生答案
源答案设置:
empty = 50:仓库剩余空位;itemA = 0、itemB = 0:仓库内 A、B 产品数量;mutex = 1:互斥保护一次产品入库或出库操作。
ProducerA() {
while (true) {
P(empty);
ProductA a = produceA();
P(mutex);
put(a);
V(mutex);
V(itemA);
}
}
ProducerB() {
while (true) {
P(empty);
ProductB b = produceB();
P(mutex);
put(b);
V(mutex);
V(itemB);
}
}
ConsumerA() {
while (true) {
P(itemA);
P(mutex);
ProductA a = takeA();
V(mutex);
consume(a);
V(empty);
}
}
ConsumerB() {
while (true) {
P(itemB);
P(mutex);
ProductB b = takeB();
V(mutex);
consume(b);
V(empty);
}
}
源答案的 ConsumerB 原写作 P(itemA),但 B 类客户必须等待 B 产品,且其余代码也使用 itemB 计数;上面已把这个明显笔误更正为 P(itemB)。
六、进程同步与互斥 2(15 分)
乘客在站点等待校车。校车到达时,所有正在等待的乘客调用 boardBus() 上车;一旦开始上车,新到达的乘客必须等下一辆车。校车容量为 50 人,超出 50 人的乘客也等下一辆。当前应上车的乘客全部上车后,校车调用 depart();若到站时无人等待,则立即离开。
请用 P、V 操作编写校车进程和乘客进程,满足上述约束,并解释信号量及主要代码。
查看源学生答案
源答案列出四种写法,下面保留其中标为 Version 2 的完整方案:
int waiting = 0;
Semaphore mutex = 1;
Semaphore bus = 0;
Semaphore boarded = 0;
Bus() {
P(mutex);
int n = min(waiting, 50);
for (int i = 0; i < n; i++) {
V(bus);
P(boarded);
}
waiting = max(waiting - 50, 0);
V(mutex);
depart();
}
Passenger() {
P(mutex);
waiting++;
V(mutex);
P(bus);
boardBus();
V(boarded);
}
mutex 不只保护计数,还让校车在确定本轮人数后一直持有互斥量,因而新乘客不能加入本轮;bus 逐个放行本轮乘客,boarded 让校车逐个确认上车完成。若 n=0,循环不执行,校车直接离开。
七、死锁(10 分)
系统有 5 个进程和 4 类资源,当前状态如下:
| 进程 | 已分配 R1 | 已分配 R2 | 已分配 R3 | 已分配 R4 | 还需 R1 | 还需 R2 | 还需 R3 | 还需 R4 |
|---|---|---|---|---|---|---|---|---|
| P1 | 0 | 1 | 2 | 0 | 0 | 0 | 0 | 0 |
| P2 | 1 | 0 | 0 | 0 | 0 | 8 | 5 | 0 |
| P3 | 1 | 3 | 5 | 4 | 1 | 0 | 0 | 2 |
| P4 | 0 | 2 | 3 | 2 | 0 | 0 | 2 | 0 |
| P5 | 0 | 0 | 1 | 4 | 0 | 6 | 4 | 2 |
| 可用资源 | 0 | 3 | 2 | 0 |
- 系统当前是否处于安全状态?是否处于死锁状态?说明依据。(6 分)
- 四类资源单位代价相同,如何用最小代价增加资源以避免死锁?写出过程。(4 分)
查看源学生答案
按源答案的推演:
- 初始可用向量为 。P1 可完成并释放资源,可用量变成 ;P4 随后可完成,变成 ;P5 再完成,变成 。此时 P2 还需 ,P3 还需 ,二者都无法继续。因此状态不安全,最终 P2、P3 会陷入死锁。
- 只增加一个 R1,最后的可用向量即可成为 。此时 P3 先完成并释放已分配资源,可用量变为 ,P2 随后也能完成。因此最小代价是增加 1 个 R1。
这里应区分两个说法:初始时 P1、P4、P5 尚能推进,并非所有进程已经僵住;源答案所称“发生死锁”,指这三个进程依次完成后,P2、P3 最终进入的状态。
八、文件系统(15 分)
一个 Unix 文件系统采用 2 KB 数据块和 4 B 数据块地址。每个 i 节点含 10 个直接索引、1 个一级间接索引和 1 个二级间接索引。
- 文件最大可达多少 KB?(5 分)
- 一半文件大小恰为 2 KB,另一半恰为 1.5 KB。只考虑存储文件数据的磁盘块,数据块为 2 KB 时空间利用率是多少?改为 1 KB 后又是多少?(6 分)
- 一个程序从不同大小的文件中随机读取一定量数据,读取大文件时平均性能明显下降。分析主要原因并给出改进思路。(4 分)
查看源学生答案
-
一个间接索引块能存 个地址,因此最大文件大小为
间接索引块本身不计入文件大小。
-
数据块为 2 KB 时,平均每个文件保存 1.75 KB 数据却占用 2 KB,利用率为 。改成 1 KB 后,2 KB 文件占 2 个块,1.5 KB 文件也占 2 个块,平均仍是 1.75 KB 数据占 2 KB,利用率仍为 。
-
大文件更可能通过一级、二级间接索引访问,索引层级越多,需要的额外磁盘访问越多,随机读取性能因而下降。源答案建议利用局部性,把常访问部分尽量放在直接或一级索引可达区域,并使用块缓存、提前读取、磁盘碎片整理、合理分配与布局、磁盘调度或 RAID 等手段减少实际 I/O 开销。