2020 年春《操作系统》期末真题

考试日期为 2020 年 6 月 4 日,满分 100 分,采用线上答卷形式。源目录中的答案署名为“2018 级《操作系统》期末 By dhy && selia”,并明确注明“以下答案不保证正确,仅供参考”,因此我将其标为源学生答案,不把它冒充官方答案。

一、存储管理 1(15 分)

一个 32 位虚拟存储系统采用两级页表,逻辑地址格式为:

第一级页表索引第二级页表索引页内偏移
10 位10 位12 位

物理地址为 32 位,其中物理页框号 20 位、页内偏移 12 位。每个页表项为 32 位,高 20 位是物理页框号,低 12 位是标志位;第 0 位是有效位,第 1 位是读写位。

  1. 进程地址空间共有多少字节?(3 分)
  2. 将答卷同学学号的最后两位记为 MN,从逻辑地址 0xMN000000 开始映射 4 MB 页表。第一级页表的逻辑地址在哪里?第一级页表中指向自身的表项逻辑地址是多少?说明理由。(6 分)
  3. 当前进程第一级页表的物理地址为 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

待判断的指令为:

  1. Load [0x00001034]
  2. Store [0x00C07665]
  3. Store [0x00C005FF]
  4. Load [0x00C03012]
  5. Load [0xFF80078F]
  6. Load [0xFFFFF00B]
查看源学生答案
  1. 32 位地址空间共有 2322^{32} 字节,即 4 GB。

  2. 令 B=0xMN000000B=\mathtt{0xMN000000}。4 MB 页表覆盖全部 2202^{20} 个虚页,每项 4 B。源答案给出:

    • 第一级页表的逻辑地址为 B+(B≫10)B+(B\mathbin{\gg}10);
    • 指向第一级页表自身的表项逻辑地址为 B+(B≫10)+(B≫20)B+(B\mathbin{\gg}10)+(B\mathbin{\gg}20)。

    原因是第一级页表位于整片页表空间的第 B≫22B\mathbin{\gg}22 个页面;先用 B≫10B\mathbin{\gg}10 找到页目录,再用 B≫20B\mathbin{\gg}20 找到其中的自映射表项。

  3. 地址翻译结果如下:

    指令一级索引 / 二级索引 / 偏移关键页表项结果
    Load [0x00001034]000 / 001 / 0340x00100007 → 0x000020670x12
    Store [0x00C07665]003 / 007 / 6650x00103007 → 0xEEFF0067OK
    Store [0x00C005FF]003 / 000 / 5FF0x00103007 → 0x11220005,只读Error
    Load [0x00C03012]003 / 003 / 0120x00103007 → 0x000000070x20
    Load [0xFF80078F]3FE / 000 / 78F0x001FE007 → 0x04150000,无效Error
    Load [0xFFFFF00B]3FF / 3FF / 00B0x001FF007 → 0x001030670xCC

源答案把第一条指令的二级页表项地址写成了 0x00100001;按每项 4 B 计算应为 0x00100004,但其读取的页表项值及最终结果不受这个笔误影响。

二、存储管理 2(10 分)

  1. 页面走向为 5、4、3、2、4、5、4、1、5、2、5、4、5、2、1。系统有 3 个初始为空的物理页,分别求 OPT、FIFO 和 LRU 的缺页次数,并写出计算过程。(6 分)
  2. 只考虑页内碎片和页表的额外内存开销。进程平均大小为 1 MB,每个页表项为 8 B,为使额外开销尽量小,页面大小应如何设置?写出推导过程。(4 分)
查看源学生答案

三种算法的缺页次数为:

算法缺页次数
OPT7
FIFO11
LRU9

以“最近位置在左侧”记录页框,源答案的过程可压缩为:

引用:  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

设进程平均大小为 SS,页表项大小为 ee,页面大小为 pp。页表大约占 Se/pSe/p 字节,最后一页的平均内碎片约为 p/2p/2 字节,因此总额外开销为

f(p)=Sep+p2.f(p)=\frac{Se}{p}+\frac{p}{2}.

令 f′(p)=0f'(p)=0,得到

p=2Se=2×220×8=4096 B=4 KB.p=\sqrt{2Se}=\sqrt{2\times 2^{20}\times 8}=4096\ \text{B}=4\ \text{KB}.

三、存储管理 3(10 分)

可变分区内存管理系统的总内存为 128 KB,初始分配情况如下:

起始地址分区大小占用情况
010 KB作业 A
10 KB10 KB空闲
20 KB12 KB作业 B
32 KB2 KB空闲
34 KB6 KB作业 C
40 KB20 KB空闲
60 KB24 KB作业 D
84 KB8 KB作业 E
92 KB18 KB空闲
110 KB5 KB作业 F
115 KB13 KB作业 G

作业 X、Y、Z 分别请求 12 KB、30 KB、9 KB 内存。事件依次为:X 到达、C 结束、D 结束、Y 到达、E 结束、Z 到达。分别使用 First Fit 和 Best Fit 分配,写出最终内存分配表。

查看源学生答案

First Fit 最终结果:

起始地址分区大小占用情况
010 KB作业 A
10 KB9 KB作业 Z
19 KB1 KB空闲
20 KB12 KB作业 B
32 KB8 KB空闲
40 KB12 KB作业 X
52 KB30 KB作业 Y
82 KB28 KB空闲
110 KB5 KB作业 F
115 KB13 KB作业 G

关键过程是:X 先进入 [40,60);C、D 释放后 [32,40) 和 [52,84) 成为空闲区;Y 进入从低地址开始遇到的 [52,84);E 结束后相邻空闲区合并为 [82,110);Z 最后进入 [10,20)。

Best Fit 最终结果:

起始地址分区大小占用情况
010 KB作业 A
10 KB9 KB作业 Z
19 KB1 KB空闲
20 KB12 KB作业 B
32 KB30 KB作业 Y
62 KB20 KB空闲
92 KB12 KB作业 X
104 KB6 KB空闲
110 KB5 KB作业 F
115 KB13 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 分)

时刻 tt 的磁盘请求柱面序列为 10、22、20、2、40、6、38。磁头初始位于 20 号柱面并向柱面号增大的方向移动,每移动一个柱面需 4 ms。磁盘共有 51 个柱面,编号为 0~50。

  1. 使用 SCAN 电梯调度算法,且每次必须扫描到柱面边界才反向。给出访问请求的顺序与寻道总时间。(5 分)
  2. 若在 t+31t+31 ms、t+70t+70 ms、t+91t+91 ms 分别新增对 50、1、10 号柱面的请求,仍使用上述算法,给出各请求的访问时刻、磁头位置、请求队列、实际访问顺序和总时间。(5 分)
查看源学生答案
  1. 访问顺序为

    20 → 22 → 38 → 40 →(扫描到边界 50)→ 10 → 6 → 2

    磁头先从 20 移到 50,再从 50 返回 2,共移动 (50−20)+(50−2)=78(50-20)+(50-2)=78 个柱面,寻道时间为 78×4=31278\times4=312 ms。

  2. 源答案给出的过程为:

    相对时刻 / ms磁头位置处理后仍待访问的请求
    02010、22、2、40、6、38
    82210、2、40、6、38
    723810、2、40、6、50、1
    804010、2、6、50、1
    1205010、2、6、1、10
    280102、6、1
    29662、1
    31221
    3161无

    因两个请求都访问 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
P101200000
P210000850
P313541002
P402320020
P500140642
可用资源0320
  1. 系统当前是否处于安全状态?是否处于死锁状态?说明依据。(6 分)
  2. 四类资源单位代价相同,如何用最小代价增加资源以避免死锁?写出过程。(4 分)
查看源学生答案

按源答案的推演:

  1. 初始可用向量为 (0,3,2,0)(0,3,2,0)。P1 可完成并释放资源,可用量变成 (0,4,4,0)(0,4,4,0);P4 随后可完成,变成 (0,6,7,2)(0,6,7,2);P5 再完成,变成 (0,6,8,6)(0,6,8,6)。此时 P2 还需 (0,8,5,0)(0,8,5,0),P3 还需 (1,0,0,2)(1,0,0,2),二者都无法继续。因此状态不安全,最终 P2、P3 会陷入死锁。
  2. 只增加一个 R1,最后的可用向量即可成为 (1,6,8,6)(1,6,8,6)。此时 P3 先完成并释放已分配资源,可用量变为 (2,9,13,10)(2,9,13,10),P2 随后也能完成。因此最小代价是增加 1 个 R1。

这里应区分两个说法:初始时 P1、P4、P5 尚能推进,并非所有进程已经僵住;源答案所称“发生死锁”,指这三个进程依次完成后,P2、P3 最终进入的状态。

八、文件系统(15 分)

一个 Unix 文件系统采用 2 KB 数据块和 4 B 数据块地址。每个 i 节点含 10 个直接索引、1 个一级间接索引和 1 个二级间接索引。

  1. 文件最大可达多少 KB?(5 分)
  2. 一半文件大小恰为 2 KB,另一半恰为 1.5 KB。只考虑存储文件数据的磁盘块,数据块为 2 KB 时空间利用率是多少?改为 1 KB 后又是多少?(6 分)
  3. 一个程序从不同大小的文件中随机读取一定量数据,读取大文件时平均性能明显下降。分析主要原因并给出改进思路。(4 分)
查看源学生答案
  1. 一个间接索引块能存 2 KB/4 B=5122\ \text{KB}/4\ \text{B}=512 个地址,因此最大文件大小为

    (10+512+5122)×2 KB=525332 KB.(10+512+512^2)\times 2\ \text{KB}=525332\ \text{KB}.

    间接索引块本身不计入文件大小。

  2. 数据块为 2 KB 时,平均每个文件保存 1.75 KB 数据却占用 2 KB,利用率为 1.75/2=87.5%1.75/2=87.5\%。改成 1 KB 后,2 KB 文件占 2 个块,1.5 KB 文件也占 2 个块,平均仍是 1.75 KB 数据占 2 KB,利用率仍为 87.5%87.5\%。

  3. 大文件更可能通过一级、二级间接索引访问,索引层级越多,需要的额外磁盘访问越多,随机读取性能因而下降。源答案建议利用局部性,把常访问部分尽量放在直接或一级索引可达区域,并使用块缓存、提前读取、磁盘碎片整理、合理分配与布局、磁盘调度或 RAID 等手段减少实际 I/O 开销。

评论