2022年408真题操作系统篇

选择题

第23题

问题: 下列关于多道程序系统的叙述中,不正确的是( )。

A. 支持进程的并发执行

B. 不必支持虚拟存储管理

C. 需要实现对共享资源的管理

D. 进程数越多CPU利用率越高


解答:

  • A. 支持进程的并发执行 正确。 多道程序系统可以同时运行多个进程,使它们在系统中并发执行。通过调度算法,操作系统能够在不同进程之间快速切换,从而实现并发执行。
  • B. 不必支持虚拟存储管理 正确。 在早期的多道程序系统中,虚拟存储管理并不是必需的。多道程序系统通过将多个进程加载到内存中,直接在物理内存中执行,虽然虚拟存储管理有助于扩展内存容量,但它并不是所有多道程序系统的必需功能。
  • C. 需要实现对共享资源的管理 正确。 多道程序系统中的多个进程可能会共享资源(如内存、硬件设备、文件系统等),因此,操作系统需要有效管理这些共享资源,防止资源冲突或竞争。为此,操作系统通常会使用锁机制、信号量等同步机制来管理资源的访问。
  • D. 进程数越多CPU利用率越高 不正确。 虽然增加进程数可以提高系统的并发性,但进程数过多时,CPU的资源会被多进程竞争,占用更多的调度时间,这可能导致上下文切换频繁,系统的整体性能反而会下降。因此,进程数过多未必会提高CPU的利用率。

本题选D。


第24题

问题: 下列选项中,需要在操作系统进行初始化过程中创建的是( )。

A. 中断向量表

B. 文件系统的根目录

C. 硬盘分区表

D. 文件系统的索引节点表


解答:

  • A. 中断向量表 正确。 中断向量表是在操作系统初始化过程中创建的。它用于处理硬件中断和异常,并且将每种中断或异常映射到对应的处理程序地址。操作系统在启动时必须初始化中断向量表,以确保能够正确响应各类中断。
  • B. 文件系统的根目录 错误。 文件系统的根目录是在文件系统格式化过程中创建的,而不是操作系统初始化过程中创建的。操作系统初始化时,可能会加载文件系统并进行配置,但根目录本身是文件系统创建时由格式化过程完成的。
  • C. 硬盘分区表 错误。 硬盘分区表记录硬盘上的分区信息,通常是在磁盘分区或格式化过程中创建的。它与操作系统的初始化过程无关。
  • D. 文件系统的索引节点表 错误。 文件系统的索引节点表通常是在文件系统格式化过程中创建的。它存储文件的元数据(如权限、大小、存储位置等),操作系统初始化时加载并初始化索引节点表,但并不在初始化过程中创建。

本题选A。


第25题

问题: 进程P0、P1、P2和P3进入就绪队列的时刻、优先级(值越小优先权越高)及CPU执行时间如下表所示:

进程 进入就绪队列的时刻 优先级 CPU执行时间
P0 0 ms 15 100 ms
P1 10 ms 20 60 ms
P2 10 ms 10 20 ms
P3 15 ms 6 10 ms

若系统采用基于优先权的抢占式进程调度算法,则从0ms时刻开始调度,到4个进程都运行结束为止,发生进程调度的总次数为( )。

注意抢占

A. 4 B. 5 C. 6 D. 7


解答:

按时间序列进程分析:

  • 0ms时刻,只有P0进入就绪队列,开始运行P0。
  • 10ms时刻,P1、P2进入就绪队列,P0运行了10ms-0ms=10ms,剩余90ms。此时就绪队列中有P0、P1、P2。根据优先权,P2优先级最高,抢占执行。
  • 15ms时刻,P3进入就绪队列。此时P2运行了5ms,剩余15ms。此时就绪队列有P0、P1、P2、P3,P3优先级最低,抢占执行。
  • 20ms时刻,P3执行完毕,系统回收P3的资源,P2重新抢占并运行,剩余10ms。
  • 30ms时刻,P2执行完毕,P0继续执行,直到60ms时P0执行完毕。
  • 60ms时刻,P1开始执行。

所以,发生的调度次数是:P0 → P2 → P3 → P2 → P0 → P1,发生调度的总次数为 6

本题选C。


第26题

问题: 系统中有三个进程P0、P1、P2及三类资源A、B、C。若某时刻系统分配资源的情况如下表所示,则此时系统中存在的安全序列的个数为( )。

A. 1 B. 2 C. 3 D. 4

img

解答:

在这个问题中,应用银行家算法来判断系统是否安全,并确定安全序列的个数。银行家算法的基本思想是:在每次分配资源时,先判断分配后的状态是否安全,如果是,才进行分配。

根据题意,假设某时刻系统可以分配的资源满足P0的需求。通过分析,在P0完成后,系统可用资源能够满足P1和P2的需求,并且P1和P2执行完后,能够回收资源继续分配给其他进程。因此,系统存在至少两个安全序列,分别是:

  • 序列1:P0 → P1 → P2
  • 序列2:P0 → P2 → P1

通过计算,系统中存在 2 个安全序列。

本题选B。


第27题

问题: 下列关于CPU模式的叙述中,正确的是( )。

A. CPU处于用户态时只能执行特权指令 B. CPU处于内核态时只能执行特权指令 C. CPU处于用户态时只能执行非特权指令 D. CPU处于内核态时只能执行非特权指令


解答:

在计算机系统中,CPU有两种运行模式:用户态和内核态(特权态)。

  • 用户态:进程运行在受限环境下,不能直接执行对硬件或内核资源的访问。用户态下只能执行非特权指令,这些指令不涉及对系统底层资源的直接控制。
  • 内核态:操作系统内核运行在特权模式下,具有完全的控制权限,可以执行特权指令,访问硬件资源,管理内存、进程等系统资源。

根据上述定义:

  • A 错误:在用户态下,进程不能执行特权指令。
  • B 错误:内核态时,CPU可以执行特权指令,也可以执行非特权指令。
  • C 正确:在用户态下,CPU只能执行非特权指令。
  • D 错误:内核态下,CPU可以执行非特权指令和特权指令。

本题选C。


第28题

问题: 下列事件或操作中,可能导致进程P由执行态变为阻塞态的是( )。

Ⅰ. 进程P读文件 Ⅱ. 进程P的时间片用完 Ⅲ. 进程P申请外设 Ⅳ. 进程P执行信号量的wait()操作

A. 仅Ⅰ、Ⅳ B. 仅Ⅱ、Ⅲ C. 仅Ⅲ、Ⅳ D. 仅Ⅰ、Ⅲ、Ⅳ


解答:

进程从执行态转变为阻塞态的常见原因包括:进程等待某些资源(如文件、外设、信号量等)。

  • 正确:进程P在读文件时,可能需要等待文件的IO操作完成,因此进入阻塞态。
  • 错误:进程P时间片用完后,会进入就绪态,而非阻塞态,等待下一轮CPU调度。
  • 正确:进程P申请外设时,如果外设不可用,进程将被阻塞,等待外设资源的释放。
  • 正确:进程P执行信号量的wait()操作时,如果信号量值为0,表示资源不可用,进程将阻塞,直到信号量值大于0。

综上, 会导致进程P从执行态转为阻塞态。

本题选D。


第29题

问题: 某进程访问的页b不在内存中,导致产生缺页异常,该缺页异常处理过程中不一定包含的操作是( )。

A. 淘汰内存中的页 B. 建立页号与页框号的对应关系 C. 将页b从外存读入内存 D. 修改页表中页b对应的存在位


解答:

缺页异常处理过程是指在访问某个页时,发现该页不在内存中而需要从外存中调入的情况。

  • A 正确:淘汰内存中的页并不是缺页异常处理的必要步骤。淘汰页发生在内存空间不足时,为了腾出空间给新的页,可以选择淘汰一些旧的页。然而,缺页异常处理并不一定需要淘汰页,特别是在内存中有足够空间时。
  • B 错误:在缺页异常处理过程中,必须建立页号与页框号的对应关系,以便调入内存或进行其他操作。这是缺页异常处理中的关键步骤,确保页表更新以及正确映射内存。
  • C 错误:缺页异常处理的核心操作之一就是将缺失的页从外存读入内存,这是解决缺页异常的必要步骤。
  • D 错误:当缺页异常处理完成后,需要修改页表中对应页的存在位,将其设置为1,表示该页已调入内存。

本题选A。


第30题

问题: 下列选项中,不会影响系统缺页率的是( )。

A. 页面置换算法 B. 工作集的大小 C. 进程的数量 D. 页缓冲队列的长度


解答:

缺页率是指系统中页面缺失的频率。影响缺页率的因素包括内存的使用效率和页面置换的策略。

  • A 错误:页面置换算法会直接影响系统的缺页率。不同的算法(如FIFO、LRU、OPT)对缺页率有不同的影响。例如,LRU(最近最少使用)通常能有效减少缺页率。
  • B 错误:工作集的大小会影响缺页率。如果进程的工作集较大,可能导致频繁的缺页,因此工作集的大小直接影响缺页率。
  • C 错误:进程数量多时,系统内存资源被多个进程共享,可能导致更多的页面置换和竞争,从而增加缺页率。
  • D 正确:页缓冲队列的长度与缺页率无关。页缓冲队列主要用于提高磁盘访问效率,它可以缓存常用页,减少磁盘I/O操作,但它不直接影响缺页率。

本题选D。


第31题

问题: 执行系统调用的过程涉及下列操作,其中由操作系统完成的是( )。

Ⅰ. 保存断点和程序状态字 Ⅱ. 保存通用寄存器的内容 Ⅲ. 执行系统调用服务程序 Ⅳ. 将CPU模式改为内核态

A. 仅Ⅰ、Ⅲ B. 仅Ⅱ、Ⅲ C. 仅Ⅱ、Ⅳ D. 仅Ⅱ、Ⅲ、Ⅳ


解答:

系统调用是用户程序向操作系统请求服务的一种方式,涉及的操作如下:

  • 错误:保存断点和程序状态字由中断隐指令完成,而非操作系统。中断隐指令是硬件在发生中断或系统调用时自动执行的,因此不由操作系统直接控制。
  • 正确:保存通用寄存器的内容通常是由中断服务程序(操作系统的一部分)来完成的。这是为了确保在进入内核态后,能够恢复用户程序的状态。
  • 正确:执行系统调用服务程序由操作系统完成。系统调用将控制权交给操作系统,操作系统根据调用类型执行相应的服务程序。
  • 错误:将CPU模式从用户态改为内核态的操作是由硬件自动完成的。具体来说,CPU会通过特权指令切换到内核态,操作系统并不直接干预这一过程。

本题选B。


第32题

问题: 下列关于驱动程序的叙述中,不正确的是( )。

A. 驱动程序与I/O控制方式无关 B. 初始化设备是由驱动程序控制完成的 C. 进程在执行驱动程序时可能进入阻塞态 D. 读/写设备的操作是由驱动程序控制完成的


解答:

驱动程序负责操作系统与硬件设备之间的通信,涉及设备的初始化、控制和数据交换。

  • A 不正确:驱动程序与I/O控制方式是密切相关的。不同类型的硬件设备可能采用不同的I/O控制方式,如内存映射I/O、端口映射I/O、DMA等,驱动程序需要根据设备的I/O控制方式来进行适配。
  • B 正确:驱动程序负责设备的初始化工作,包括配置设备寄存器、设置工作参数、启动设备等。
  • C 正确:在执行驱动程序时,进程可能因为等待设备的响应或其他条件(如I/O操作完成)而进入阻塞态。
  • D 正确:驱动程序控制设备的读/写操作,提供对外部设备的访问接口。用户进程通过调用驱动程序提供的接口来进行数据交换。

本题选A。


文件系统

第45题解答

问题: 某文件系统的磁盘块大小为4KB,目录项由文件名和索引节点号构成,每个索引节点占256字节,其中包含直接地址项10个,一级、二级和三级间接地址项各1个,每个地址项占4字节。该文件系统中子目录stu的结构如题45(a)图所示,stu包含子目录course和文件doc,course子目录包含文件course1和course2。各文件的文件名、索引节点号、占用磁盘块的块号如题45(b)图所示。请回答下列问题。

(1) 目录文件stu中每个目录项的内容是什么?

解答:

目录项由文件名和索引节点号构成,根据题目中的信息,stu目录下有两个子项:course和doc。通过题45(b)图可以得知,

  • course 的索引节点号是 2
  • doc 的索引节点号是 10

因此,stu目录中每个目录项的内容如下:

文件名 索引节点号
course 2
doc 10

(2) 文件doc占用的磁盘块的块号 x 的值是多少?

解答:

根据题45(b)图,doccourse1 的索引节点号都是 10,这意味着它们共享相同的索引节点并指向同一个文件。因此,doc 文件和 course1 文件占用相同的磁盘块号。

查题45(b)图可知,course1 占用的磁盘块号是 30,因此 doc 的磁盘块号 x 也是 30

(3) 若目录文件course的内容已在内存,则打开文件course1并将其读入内存,需要读几个磁盘块?说明理由。

解答:

根据题目中的描述,目录文件 course 的内容已经在内存中。打开文件 course1 的步骤如下:

  1. 读取 course1 的索引节点所在的磁盘块: 根据目录文件 course 中的目录项,course1 的索引节点号是 10。需要首先读取 索引节点号为10的索引节点,该索引节点存储了该文件的数据块的地址信息。读取索引节点所需的磁盘块是 1 个

  2. 读取 course1 数据所在的磁盘块: 根据 course1 的索引节点,文件内容存储在 30 号磁盘块。读取该数据块需要 1 个 磁盘块。

因此,共需要 2 个磁盘块。这包括读取索引节点和读取文件内容。

(4) 若文件course2的大小增长到6MB,为了存取course2需要使用该文件索引节点的哪几级间接地址项?说明理由。

解答:

  1. 计算文件大小需要的磁盘块数:

    • 文件 course2 的大小为 6MB,而每个磁盘块的大小为 4KB

    • 所需磁盘块数为:

      \[ \frac{6MB}{4KB} = \frac{6 \times 1024}{4} = 1536 \text{ 个磁盘块} \]

  2. 索引节点的地址项结构: 每个索引节点包含:

    • 10 个直接地址项
    • 1 个一级间接地址项
    • 1 个二级间接地址项
    • 1 个三级间接地址项

    每个地址项占 4 字节,每个间接地址块可以存放 1024 个地址项(即每个磁盘块可以存放 1024 个地址项,因为 4KB ÷ 4B = 1024)。

    • 直接地址项可以记录 10 个磁盘块
    • 一级间接地址可以记录 1024 个磁盘块
    • 二级间接地址可以记录 1024 × 1024 = 1,048,576 个磁盘块
    • 三级间接地址可以记录 1024 × 1024 × 1024 = 1,073,741,824 个磁盘块
  3. 文件所需的间接地址项:

    • 直接地址项可以记录 10 个磁盘块
    • 一级间接地址项可以记录 1024 个磁盘块
    • 文件大小是 1536 个磁盘块,超过了直接地址项所能覆盖的磁盘块数 10 个,也超过了一级间接地址项所能覆盖的磁盘块数 1024 个
    • 因此,文件需要 一级间接地址项二级间接地址项 来完成存取。

结论: 为了存取 course2,需要使用 一级间接地址项二级间接地址项


总结:

  • (1) 目录文件 stu 中每个目录项的内容:

    文件名 索引节点号
    course 2
    doc 10
  • (2) 文件 doc 占用的磁盘块的块号 x30

  • (3) 打开文件 course1 并读入内存,需要 2 个磁盘块

  • (4) 文件 course2 需要使用 一级和二级间接地址项

信号量

第46题解答

题目要求: 有两个线程 T1T2 并发执行 ABCDEF 共六个操作,题目给出操作之间的执行顺序约束,并要求使用信号量的 wait()signal() 操作描述 T1T2 之间的同步关系,说明所用信号量的作用及其初值。

前提条件:

题目提供了六个操作的执行顺序约束:

  • CAB 完成后执行
  • DEC 完成后执行
  • FE 完成后执行

任务的前置关系:

通过分析给出的约束,可以确定以下前置关系:

操作 前置操作
A
B
C A, B
D C
E C
F E

拓扑排序:

根据前置关系的分析,得到操作的拓扑顺序为: A, B, C, D, E, F

信号量的设置:

为了满足任务的执行顺序,必须用信号量控制不同操作的执行顺序。以下是每个信号量的用途及初值:

  • S_AC: 控制 A 完成后 C 执行。初值为 0,因为 C 必须在 A 完成后执行。
  • S_BC: 控制 B 完成后 C 执行。初值为 0,因为 C 必须在 B 完成后执行。
  • S_CD: 控制 C 完成后 D 执行。初值为 0,因为 D 必须在 C 完成后执行。
  • S_CE: 控制 C 完成后 E 执行。初值为 0,因为 E 必须在 C 完成后执行。
  • S_EF: 控制 E 完成后 F 执行。初值为 0,因为 F 必须在 E 完成后执行。

T1 和 T2 之间的同步关系:

  1. 线程 T1 执行操作 A, E, 和 F
    • 执行 A 后,发出信号 signal(S_AC),使得 C 可以执行。
    • 执行 E 前,等待信号 wait(S_CE),确保 C 执行完成后,才执行 E
    • 执行 F 前,等待信号 wait(S_EF),确保 E 执行完成后,才执行 F
  2. 线程 T2 执行操作 B, C, 和 D
    • 执行 B 后,发出信号 signal(S_BC),使得 C 可以执行。
    • 执行 C 前,等待信号 wait(S_AC)wait(S_BC),确保 AB 都完成后,才执行 C
    • 执行 C 后,发出信号 signal(S_CD)signal(S_CE),使得 DE 可以执行。
    • 执行 D 前,等待信号 wait(S_CD),确保 C 执行完成后,才执行 D

信号量同步关系的代码描述:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
semaphore S_AC = 0;  // 控制操作A和C的执行顺序
semaphore S_BC = 0; // 控制操作B和C的执行顺序
semaphore S_CD = 0; // 控制操作C和D的执行顺序
semaphore S_CE = 0; // 控制操作C和E的执行顺序
semaphore S_EF = 0; // 控制操作E和F的执行顺序

cobegin
Process T1() {
// process A
完成操作A;
signal(S_AC); // 使得操作C可以执行
// process E
wait(S_CE); // 等待操作C完成后才能执行E
完成操作E;
signal(S_EF); // 使得操作F可以执行
// process F
wait(S_EF); // 等待操作E完成后才能执行F
完成操作F;
}

Process T2() {
// process B
完成操作B;
signal(S_BC); // 使得操作C可以执行
// process C
wait(S_AC); // 等待操作A完成后才能执行C
wait(S_BC); // 等待操作B完成后才能执行C
完成操作C;
signal(S_CD); // 使得操作D可以执行
signal(S_CE); // 使得操作E可以执行
// process D
wait(S_CD); // 等待操作C完成后才能执行D
完成操作D;
}
coend

信号量的初值及作用:

  • S_AC = 0: 确保 CA 完成后执行。
  • S_BC = 0: 确保 CB 完成后执行。
  • S_CD = 0: 确保 DC 完成后执行。
  • S_CE = 0: 确保 EC 完成后执行。
  • S_EF = 0: 确保 FE 完成后执行。

简化后的信号量关系:

因为 T1T2 中的同步操作是跨线程的,所以下列信号量的作用分别是:

  • S_AC 控制 AC 之间的顺序。
  • S_CE 控制 CE 之间的顺序。

所以,简化后的信号量设置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
semaphore S_AC = 0;  // 控制操作A和C的执行顺序
semaphore S_CE = 0; // 控制操作C和E的执行顺序

cobegin
Process T1() {
// process A
完成操作A;
signal(S_AC); // 使得操作C可以执行
// process E
wait(S_CE); // 等待操作C完成后才能执行E
完成操作E;
// process F
完成操作F;
}

Process T2() {
// process B
完成操作B;
// process C
wait(S_AC); // 等待操作A完成后才能执行C
完成操作C;
signal(S_CE); // 使得操作E可以执行
// process D
完成操作D;
}
coend

总结:

通过使用信号量 S_ACS_CE,可以确保 ABCDEF 操作按正确的顺序执行。wait()signal() 操作确保了各个操作之间的同步,满足了题目中给出的约束条件。