二、综合应用题

2026 旧版 · 非 2027 主源 · 原书检索 · 文字用于定位,公式与图表请回原页核验 · 本次导入快照

25. 【2021统考真题】下表给出了整型信号量S的wait()和signal()操作的功能描述,以及采用开/关中断指令实现信号量操作互斥的两种方法。

[tbl-33.md](tbl-33.md)

请回答下列问题。


<!-- page: 137 -->

1)为什么在 wait()和 signal()操作中对信号量 S 的访问必须互斥执行?
2)分别说明方法1和方法2是否正确。若不正确,请说明理由。
3)用户程序能否使用开/关中断指令实现临界区互斥?为什么?

26. 【2022 统考真题】某进程的两个线程 T1 和 T2 并发执行 A、B、C、D、E 和 F 共 6 个操作,其中 T1 执行 A、E 和 F,T2 执行 B、C 和 D。下图表示上述 6 个操作的执行顺序所必须满足的约束:C 在 A 和 B 完成后执行,D 和 E 在 C 完成后执行,F 在 E 完成后执行。请使用信号量的 wait()、signal() 操作描述 T1 和 T2 之间的同步关系,并说明所用信号量的作用及其初值。


27. 【2023 统考真题】现要求学生使用 swap 指令和布尔型变量 lock 实现临界区互斥。lock 为线程间共享的变量,当 lock 的值为 TRUE 时线程不能进入临界区,为 FALSE 时线程能够进入临界区。某同学编写的实现临界区互斥的伪代码如下图所示。

[tbl-34.md](tbl-34.md)

(a)

[tbl-35.md](tbl-35.md)

(b)

请回答下列问题。公众号:小兔网盘兔费分享无水印PDF

1)图(a)的伪代码中哪些语句存在错误?将其改为正确的语句(不增加语句的条数)。
2)图(b)给出了交换两个变量值的函数 newSwap()的代码,是否可以用函数调用语句 "newSwap(&amp;key, &amp;lock)" 代替指令 "swap key, lock" 以实现临界区互斥?为什么?

28. 【2024 统考真题】计算机系统中的进程之间往往需要相互协作来完成一个任务。在某网络系统中,缓冲区 B 用于存放一个数据分组,对 B 的操作有 $C_1$、$C_2$ 和 $C_3$。$C_1$ 将一个数据分组写入 B,$C_2$ 从 B 中读出一个数据分组,$C_3$ 对 B 中的数据分组进行修改。要求 B 为空时才能执行 $C_1$,B 非空时才能执行 $C_2$ 和 $C_3$。请回答下列问题。

1)假设进程 $P_1$ 和 $P_2$ 均需要执行 $C_1$,实现 $C_3$ 的代码是否为临界区?为什么?
2)假设 B 初始为空,进程 $P_1$ 执行 $C_1$ 一次,进程 $P_2$ 执行 $C_2$ 一次。请定义尽可能少的信号量,并用 wait()、signal() 操作描述进程 $P_1$ 和 $P_2$ 之间的同步或互斥关系,说明所用信号量的作用及其初值。
3)设 B 初始不为空,进程 $P_1$ 和 $P_2$ 各执行 $C_3$ 一次。定义尽可能少的信号量,并用 wait()、signal() 操作描述进程 $P_1$ 和 $P_2$ 之间的同步或互斥关系,说明所用信号量的作用及其初值。

## 2.3.9 答案与解析

### 一、单项选择题

01. D


<!-- page: 138 -->

多个进程可以共享系统中的资源,一次仅允许一个进程使用的资源称为临界资源。访问临界资源的那段代码称为临界区。

02. D

在多道程序技术中,信号量机制是一种有效实现进程同步和互斥的工具。进程执行的前趋关系实质上是指进程的同步关系。除此之外,只有进程的并发执行不需要信号量来控制,因此正确答案为选项 D。

03. A

信号量是一个特殊的整型变量,只有初始化和 PV 操作才能改变其值。通常,信号量分为互斥量和资源量,互斥量的初值一般为 1,表示临界区只允许一个进程进入,从而实现互斥。当互斥量等于 0 时,表示临界区已有一个进程进入,临界区外尚无进程等待;当互斥量小于 0 时,表示临界区中有一个进程,互斥量的绝对值表示在临界区外等待进入的进程数。同理,资源信号量的初值可以是任意整数,表示可用的资源数,当资源量小于 0 时,表示所有资源已全部用完,而且还有进程正在等待使用该资源,等待的进程数就是资源量的绝对值。

04. C

进程进入临界区必须满足互斥条件,当进程进入临界区但尚未离开时就被迫进入阻塞是可以的,系统中经常出现这样的情形。在此状态下,只要其他进程在运行过程中不寻求进入该进程的临界区,就应允许其运行,即分配 CPU。该进程所锁定的临界区是不允许其他进程访问的,其他进程若要访问,必定会在临界区的“锁”上阻塞,期待该进程下次运行时可以离开并将临界区交给它。所以正确答案为选项 C。

05. C

一张飞机票不能售给不同的旅客,因此飞机票是互斥资源,其他因素只是为完成飞机票订票的中间过程,与互斥资源无关。

06. D

所谓临界区,并不是指临界资源,如共享的数据、代码或硬件设备等,而是指访问临界资源的那段代码程序,如 P/V 操作、加减锁等。操作系统访问临界资源时,关心的是临界区的操作过程,具体对临界资源做何操作是应用程序的事情,操作系统并不关心。

07. D

同步机制的 4 个准则是空闲让进、忙则等待、让权等待和有限等待。

08. B

临界资源是互斥共享资源,非共享数据不属于临界资源。打印机、共享变量和共享缓冲区都只允许一次供一个进程使用。

09. B

临界资源与共享资源的区别在于,在一段时间内能否允许被多个进程访问(并发使用),显然磁盘属于共享设备。公用队列可供多个进程使用,但一次只可供一个进程使用,试想若多个进程同时使用公用队列,势必造成队列中的数据混乱而无法使用。私用数据仅供一个进程使用,不存在临界区问题,可重入的程序代码一次可供多个进程使用。

10. C

同步是指为了完成某项任务而建立的多个进程的相互合作关系,由于并发进程的执行是异步的(按各自独立的、不可预知的速度向前推进),需要保证进程之间操作的先后次序的约束。例如,读进程和写进程对同一段缓冲区的读和写就需要进行同步,以保证正确的执行顺序。

11. C


<!-- page: 139 -->

并发进程因为共享资源而产生相互之间的制约关系,可以分为两类:①互斥关系,指进程之间因相互竞争使用独占型资源(互斥资源)所产生的制约关系;②同步关系,指进程之间为协同工作需要交换信息、相互等待而产生的制约关系。本题中两个进程之间的制约关系是同步关系,进程B必须在进程A将数据放入缓冲区后才能从缓冲区中读出数据。此外,共享的缓冲区一定是互斥访问的,所以它们也具有互斥关系。

12. D

P、V操作是一种低级的进程通信原语,它是不能被中断的。

13. C

P 操作即 wait 操作,表示等待某种资源直到可用。若这种资源暂时不可用,则进程进入阻塞态。注意,执行 P 操作时的进程处于运行态。

14. D

原语(Primitive/Atomic Action),顾名思义,就是原子性的、不可分割的操作。其严格定义为:由若干机器指令构成的完成某种特定功能的一段程序,其执行必须是连续的,在执行过程中不允许被中断。

15. A

管程定义了一个数据结构和能为并发进程所执行(在该数据结构上)的一组操作,这组操作能同步进程并改变管程中的数据。

16. C

只有就绪进程能获得处理器资源,被唤醒的进程并不能直接转换为运行态。

17. B

互斥信号量的初值设置为1,P操作成功则将其减1,禁止其他进程进入;V操作成功则将其加1,允许等待队列中的一个进程进入。

18. D

与互斥信号量初值一般置1不同,用P,V操作实现进程同步时,信号量的初值应根据具体情况来确定。若期望的消息尚未产生,则对应的初值应设为0;若期望的消息已存在,则信号量的初值应设为一个非0的正整数。

19. C

若代码可被多个进程在任意时刻共享,则要求任意一个进程在调用此段代码时都以同样的方式运行;而且进程在运行过程中被中断后再继续执行,其执行结果不受影响。这必然要求代码不能被任何进程修改,否则无法满足共享的要求。这样的代码就是可重入代码,也称纯代码,即允许多个进程同时访问的代码。

20. D

共享程序段可能同时被多个进程使用,所以必须可重入编码,否则无法实现共享的功能。

21. D

互斥锁可用于多线程或多进程之间,但只有对它加锁的线程或进程才能解锁它。若一个线程或进程试图解锁一个不属于它(加锁)的互斥锁,则返回错误码。

22. C

若两个线程分别对两个不同的互斥锁先后加锁,但顺序相反,则可能导致死锁,这是典型的循环等待现象。例如,线程1先对互斥锁A加锁,然后尝试对互斥锁B加锁;同时,线程2先对B加锁,然后尝试对A加锁,两个线程都在等待对方释放资源,从而无法继续推进。

23. D


<!-- page: 140 -->

P 操作和 V 操作都属于原语操作,不可被中断。

24. B

mutex 的初值为 1,表示允许一个进程进入临界区,当有一个进程进入临界区且没有进程等待进入时,mutex 减 1,变为 0。|mutex| 为等待进入的进程数。因此选择选项 B。

25. C

当有一个进程进入临界区且有另一个进程等待进入临界区时,mutex = -1。当 mutex 小于 0 时,其绝对值等于等待进入临界区的进程数。

26. D

由题意可知,系统原来存在等待进入临界区的进程,mutex 小于或等于 -1,因此在执行 V(mutex) 操作后,mutex 的值小于或等于 0。

27. C

这里的临界区是指访问临界资源 A 的那段代码(临界区的定义)。那么 5 个并发进程共有 5 个操作共享变量 A 的代码段。

28. C

管程由局限于管程的共享变量说明、对管程内的数据结构进行操作的一组过程及对局限于管程的数据设置初始值的语句组成。

29. C

管程的 signal 操作与信号量机制中的 V 操作不同,信号量机制中的 V 操作一定会改变信号量的值 $S = S + 1$。而管程中的 signal 操作是针对某个条件变量的,若不存在因该条件而阻塞的进程,则 signal 不会产生任何影响。

30. A

参见记录型信号量的解析。此处极易出 S value 的物理概念题,现在总结如下:

① S.value &gt; 0,表示某类可用资源的数量。每次 P 操作,意味着请求分配一个单位的资源。

② S.value ≤ 0,表示某类资源已经没有,或者说还有因请求该资源而被阻塞的进程,S.value 的绝对值表示等待进程数量。

一定要看清题目中的陈述是执行 P 操作前还是执行 P 操作后。

31. ①C ②B

① 系统中有 $n$ 个进程,只要这些进程不都处于阻塞态,则至少有一个进程正在处理器上运行(处理器至少有一个),因此就绪队列中的进程个数最多有 $n - 1$ 个。选项 B 容易被错选,以为出现了处理器为空、就绪队列全满的情况,实际调度无此状态。

② 本题易错选 C,阻塞队列有 $n - 1$ 个进程是可能发生的,但不是最多的情况。不少读者会忽略死锁的情况,死锁就是 $n$ 个进程都被阻塞,因此阻塞队列最多可以有 $n$ 个进程。

32. B

PV 操作是一种低级的进程通信原语,不是系统调用,因此选项 II 正确;P 操作和 V 操作都属于原子操作,所以 PV 操作由两个不可被中断的过程组成,因此选项 IV 正确。

33. C

临界资源是指每次仅允许一个进程访问的资源。每个进程中访问临界资源的那段代码称为临界区。选项 I 错误,银行家算法是避免死锁的算法。选项 II 错误,每个进程中访问临界资源的那段代码称为临界区。选项 III 正确,公用队列可供多个进程使用,但一次只可供一个程序使用。选项 IV 错误,私用数据仅供一个进程使用,不存在临界区问题。综上分析,正确答案为选项 C。

34. B


<!-- page: 141 -->

对 $S$ 进行了 28 次 P 操作和 18 次 V 操作,即 $S - 28 + 18 = 0$,得信号量的初值为 10;然后,对信号量 $S$ 进行了 15 次 P 操作和 2 次 V 操作,即 $S - 15 + 2 = 10 - 15 + 2 = -3$,$S$ 信号量的负值的绝对值表示等待队列中的进程数。所以有 3 个进程等待在信号量 $S$ 的队列中。

35. B

本题的关键是,输出语句 A2, B2 中读取的 x 的值不同,由于 A1, B1 执行有先后问题,使得在执行 A2, B2 前,x 的可能取值有两个,即 $1, -3$;这样,输出 z 的值可能是 $1 + 2 = 3$ 或 $(-3) + 2 = -1$;输出 c 的值可能是 $1 \times 1 = 1$ 或 $(-3) \times (-3) = 9$。

36. D

并发进程之间的关系没有必然的要求,只有执行时间上的偶然重合,可能无关也可能有交往。

37. C

信号量的初值表示该类资源的总数,因此信号量的初值取 3。每分配一个该类资源,信号量减 1,当信号量等于 0 时,表示该类资源刚好被分完;当信号量小于 0 时,表示还有进程正在等待该类资源,信号量的绝对值就是等待进程的数量。因此,当没有进程使用时,信号量最大为 3;当有三个进程正在使用并有一个进程在等待时,信号量最小为 -1。

38. C

根据 Peterson 算法的原理,可知 (1) 和 (2) 处分别为 $\text{turn} = 1$ 和 $\text{turn} = 0$。

39. A

flag 数组用于标记各个线程想进入临界区的意愿。当一个线程想要进入临界区时,它将自己对应的 flag 值置为 true;当一个线程退出临界区时,它将自己对应的 flag 值置为 false。这样,若两个进程都争着想进入临界区,则可以让进程将进入临界区的机会谦让给对方。

40. A

turn 变量用于指示允许进入临界区的线程编号。当一个线程想要进入临界区时,它将 turn 置为对方的编号,表示优先让对方先进入。当一个线程检查到对方的 flag 为 true 时,表示对方也想进入,这时就需要根据 turn 来决定谁先进入。若 turn 等于自己的编号,表示轮到自己进入,则可以直接进入。若 turn 等于对方的编号,表示轮到对方进入,则需等待对方退出。

41. B

进程并发带来问题不仅包括同步互斥问题,还包括死锁等其他问题。生产者-消费者问题用于解决进程的同步和互斥问题。共享一个数据对象仅涉及互斥访问的问题。

42. A

当缓冲区为空时,消费者进程取产品会被阻塞,此时需等待生产者进程生产新产品。

43. D

生产者和消费者共享缓冲区,每次只允许一个生产者或消费者进入缓冲区,当有一个生产者或消费者进入缓冲区时,其他生产者或消费者就必须阻塞等待。因此,生产者有可能唤醒其他生产者或消费者,消费者也有可能唤醒其他生产者或消费者,四个选项均正确。

44. A

所谓互斥使用某临界资源,是指在同一时间段只允许一个进程使用此资源,所以互斥信号量的初值都为 1。

45. B

在生产者-消费者问题中,每次只能有一个生产者或消费者进入缓冲区,需要用一个互斥信号量来控制,当有一个生产者或消费者进入缓冲区时,其他申请进入缓冲区的消费者会被阻塞。

46. C


<!-- page: 142 -->

在读者-写者问题中,写者和写者之间、写者和读者之间必须互斥访问共享对象,读者和读者之间则可以同时访问。

47. D

在哲学家就餐问题中,若所有哲学家都是右撇子,则他们都会先拿起右边的筷子,然后等待左边的筷子,这样就形成了一个循环等待链。但是,若其中有一些哲学家是左撇子,则他们会先拿起左边的筷子,然后等待右边的筷子,这样就打破了循环等待链。

48. C

信号量 seat 表示桌子上可以坐下的位置数,因为只有五个位置,所以每次只能有四位哲学家同时拿起左边的餐叉,才能保证不会发生死锁,所以 seat 的初值应该为 4。

49. C

因为进程并发,所以进程的执行具有不确定性,在 $\mathrm{P}_1, \mathrm{P}_2$ 执行到第一个 $\mathrm{P}, \mathrm{V}$ 操作前,应该是相互无关的。现在考虑第一个对 $\mathrm{s}_1$ 的 $\mathrm{P}, \mathrm{V}$ 操作,因为进程 $\mathrm{P}_2$ 是 $\mathrm{P}(\mathrm{s}_1)$ 操作,所以它必须等待 $\mathrm{P}_1$ 执行完 $\mathrm{V}(\mathrm{s}_1)$ 操作后才可继续运行,此时的 $\mathrm{x}, \mathrm{y}, \mathrm{z}$ 值分别是 2, 3, 4,当进程 $\mathrm{P}_1$ 执行完 $\mathrm{V}(\mathrm{s}_1)$ 后便在 $\mathrm{P}(\mathrm{s}_2)$ 上阻塞,此时 $\mathrm{P}_2$ 可以运行直到 $\mathrm{V}(\mathrm{s}_2)$,此时的 $\mathrm{x}, \mathrm{y}, \mathrm{z}$ 值分别是 5, 3, 9,进程 $\mathrm{P}_1$ 继续运行到结束,最终的 $\mathrm{x}, \mathrm{y}, \mathrm{z}$ 值分别为 5, 12, 9。

50. B

信号量表示相关资源的当前可用数量。当信号量 $K &gt; 0$ 时,表示还有 $K$ 个相关资源可用,所以该资源的可用个数是 1。而当信号量 $K &lt; 0$ 时,表示有 $|K|$ 个进程在等待该资源。因为资源有剩余,可见没有其他进程等待使用该资源,所以进程数为 0。

51. D

这是 Peterson 算法的实际实现,保证进入临界区的进程合理安全。

该算法为了防止两个进程为进入临界区而无限期等待,设置了变量 turn,表示允许进入临界区的编号,每个进程在先设置自己的标志后再设置 turn 标志,允许另一个进程进入。这时,再同时检测另一个进程状态标志和允许进入标志,就可保证当两个进程同时要求进入临界区时只允许一个进程进入临界区。保存的是较晚的一次赋值,因此较晚的进程等待,较早的进程进入。先到先入,后到等待,从而完成临界区访问的要求。

其实这里可想象为两个人进门,每个人进门前都会和对方客套一句“你走先”。若进门时没别人,就当和空气说句废话,然后大步登门入室;若两人同时进门,就互相先请,但各自只客套一次,所以先客套的人请完对方,就等着对方请自己,然后光明正大地进门。

52. C

x 的值最终是多少,取决于最后是哪个进程对 x 进行了写操作。一个进程一旦拿到了 x 值,它最后对 x 写操作的值也就确定了。因此本题只需考虑两个进程拿到 x 值的所有可能情况。对于进程 $\mathrm{P}_1$,最初取到的 x 值可能是 1,也可能是进程 $\mathrm{P}_2$ 完成后更新得到的 x 值 0,因此对于 $\mathrm{P}_1$,最终写入 x 的值可能是 2(当它最初取到 1 时)和 1(当它最初取到 0 时)。同理,对于 $\mathrm{P}_2$,最初取到的 x 值可能是 1,也可能是 $\mathrm{P}_1$ 完成后更新得到的 x 值 2,因此对于 $\mathrm{P}_2$,最终写入 x 的值可能是 0(当它最初取到 1 时)和 1(当它最初取到 2 时)。因此,最终的 x 值可能是 0、1 或 2。

53. C

需要进行互斥的操作是对临界资源的访问,也就是说,不同线程对同一个进程内部的共享变量的访问才有可能需要进行互斥,不同进程的线程、代码段或变量不存在互斥访问的问题,同一个线程内部的局部变量也不存在互斥访问的问题。选项 A 中的 a 是线程内部的局部变量,不需要互斥访问。选项 D 是不同进程的线程代码段,不存在互斥访问的问题。选项 B 是对进程内部的共


<!-- page: 143 -->

享变量 x 的读操作,不互斥也不影响执行结果,所以不需要互斥访问。选项 C 是不同线程对同一个进程内部的共享变量的写操作,需要互斥访问(类似于读者-写者问题)。

## 54. B

使用 TSL 指令实现进程互斥时,并没有阻塞态进程,等待进入临界区的进程一直停留在执行 while(TSL(&amp;lock))的循环中,不会主动放弃 CPU,一直处于运行态,直到该进程的时间片用完放弃处理机,转为就绪态,此时切换另一个就绪态进程占用处理机。这不同于信号量机制实现的互斥。由此可知选项 A 和 C 错误,选项 B 正确。TSL 指令本身就是原子操作,不需要关中断来保证其不被打断。TSL 指令实现原子性的原理是,执行 TSL 指令的 CPU 锁住内存总线,以禁止其他 CPU 在本指令结束之前访问内存。此外,假如 while(TSL(&amp;lock))在关中断状态下执行,若 TSL(&amp;lock)一直为 true,不再开中断,则系统可能因此终止。因此选项 D 错误。

## 55. A

管程是由一组数据及定义在这组数据之上的对这组数据的操作组成的软件模块,这组操作能初始化并改变管程中的数据和同步进程。管程不仅能实现进程间的互斥,还能实现进程间的同步,因此选项 A 错误、B 正确;管程具有如下特性:①局部于管程的数据只能被局部于管程内的过程所访问;②一个进程只有通过调用管程内的过程才能进入管程访问共享数据;③每次仅允许一个进程在管程内执行某个内部过程,因此选项 C 和 D 正确。