2024 408 真题解答
🧑💻 作者: 一可爱小白兔
📦 版本: 1.0.0
📄 字数(字): 0
⏳ 时长(min): 0
⏱️ 更新于: 2026-01-09
问题描述
计算机系统中的进程之间往往需要相互协作以完成一个任务,在某网络系统中缓冲区 B 用于存放一个数据分组,对 B 的操作有 C1、C2 和 C3。
C1 将一个数据分组写入 B 中,C2 从 B 中读出一个数据分组,C3 对 B 中的数据分组进行修改。 要求 B 为空时才能执行 C1,B 非空时才能执行 C2 和 C3。 请回答下列问题:
(1)假设进程 P1 和 P2 均需执行 C1,实现 C1 的代码是否为临界区?为什么?
(2)假设 B 初始为空,进程 P1 执行 C1 一次,进程 P2 执行 C2 一次。
请定义尽可能少的信号量。并用 wait(),signal() 操作描述进程 P1、P2 之间的同步或互斥关系,说明所用信号量的作用及初值。
(3)假设 B 初始不为空,进程 P1 和 P2 各执行 C3 一次,请定义尽可能少的信号量。 并用 wait()、signal() 操作描述进程 P1 和 P2 之间的同步或互斥关系,说明所用信号量的作用及初值。
答案
(1) 是的,实现 C1 的代码可以被视为临界区。临界区是指在并发编程中,当多个进程同时访问和修改共享数据时,必须进行互斥访问的代码区域。
(2)
c++
semaphore full = 0; // 同步信号量,表示缓冲区B中数据分组的数量,初值为0
cobegin
P1(){
执行C1;
singnal(full); // 缓冲区中数据分组数量加1
}
P2(){
wait(full); // 缓冲区中数据分组数量减1
执行C;
}
coend1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
📌📌 为什么可以省略 `mutex` ?
当其他同步机制已经天然提供了互斥性时,就可以省略 mutex ,如本题的单缓冲区的生产者-消费者问题
(3)
c++
semaphore mutex = 1; // 互斥信号量,表示缓冲区B的互斥访问,初值为1
cobegin
Pi(){
wait(mutex);
执行C3;
signal(mutex);
}
coend1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9