第1题
计算机系统中的进程之间往往需要相互协作以完成一个任务。在某网络系统中,缓冲区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)是的,它涉及到对共享资源(在这里是缓冲区 B)的修改,而这个修改需要被同步,以防止数据的不一致性。
2)
// 进程 P1
P1() {
wait(mutex); // 请求访问缓冲区 B
执行 C1,将一个数据分组写入 B 中
signal(mutex); // 释放缓冲区 B 的使用权
signal(full); // 表示缓冲区 B 已满
}
// 进程 P2
P2() {
wait(full); // 等待缓冲区 B 变满
wait(mutex); // 请求访问缓冲区 B
执行 C1,从 B 中读出一个数据分组
signal(mutex); // 释放缓冲区 B 的使用权
}在这个代码中,wait() 操作表示请求一个信号量,如果信号量的值大于 0,那么就将其减 1;如果信号量的值为 0,那么就阻塞,直到信号量的值大于 0。signal() 操作表示释放一个信号量,将其值加 1。
3)
// 进程 P1
P1() {
wait(mutex); // 请求访问缓冲区 B
执行 C3,对 B 中的数据分组进行修改
signal(mutex); // 释放对缓冲区 B 的访问
}
// 进程 P2
P2() {
wait(mutex); // 请求访问缓冲区 B
执行 C3,对 B 中的数据分组进行修改
signal(mutex); // 释放对缓冲区 B 的访问
}在这个代码中,wait() 操作表示请求一个信号量,如果信号量的值大于 0,那么就将其减 1;如果信号量的值为 0,那么就阻塞,直到信号量的值大于 0。signal() 操作表示释放一个信号量,将其值加 1。所以,实现 C3 的代码是临界区,因为它涉及到共享资源(在这里是缓冲区B)的修改,而这个修改需要被同步,以防止数据的不一致性。