操作系统
2015-45
有 A、B 两人通过信箱进行辩论,每个人都从自己的信箱中取得对方的问题。将答案和向对方提出的新问题组成一个邮件放入对方的邮箱中。假设 A 的信箱最多放 M 个邮件,B 的信箱最多放 N 个邮件。初始时 A 的信箱中有 x 个邮件(0 < x < M),B 的信箱中有 y 个(0 < y < N)。辩论者每取出一个邮件,邮件数减 1。A 和 B 两人的操作过程描述如下:
CoBegin
A{
while (TRUE) {
从 A 的信箱中取出一个邮件;
回答问题并提出一个新问题;
将新邮件放入 B 的信箱;
}
}B{
while (TRUE) {
从 B 的信箱中取出一个邮件;
回答问题并提出一个新问题;
将新邮件放入 A 的信箱;
}
}CoEnd
当信箱不为空时,辩论者才能从信箱中取邮件,否则需要等待。当信箱不满时,辩论者才能将新邮件放入信箱,否则需要等待。请添加必要的信号量和 P、V(或 wait、signal)操作,以实现上述过程的同步。要求写出完整过程,并说明信号量的含义和初值。
答案
【答案】
(1)信号量定义及初值:
semaphore Full_A = x;// A信箱中的邮件数semaphore Empty_A = M - x;// A信箱中的空位数semaphore Full_B = y;// B信箱中的邮件数semaphore Empty_B = N - y;// B信箱中的空位数semaphore mutex_A = 1;// 用于A信箱的互斥访问semaphore mutex_B = 1;// 用于B信箱的互斥访问
(2)A的同步过程:
A {
while (TRUE) {
P(Full_A); // 等待A信箱有邮件
P(mutex_A); // 进入A信箱临界区
从A的信箱中取出一个邮件;
V(mutex_A); // 离开A信箱临界区
V(Empty_A); // A信箱空位加1
回答问题并提出一个新问题;
P(Empty_B); // 等待B信箱有空位
P(mutex_B); // 进入B信箱临界区
将新邮件放入B的信箱;
V(mutex_B); // 离开B信箱临界区
V(Full_B); // B信箱邮件数加1
}
}(3)B的同步过程:
B {
while (TRUE) {
P(Full_B); // 等待B信箱有邮件
P(mutex_B); // 进入B信箱临界区
从B的信箱中取出一个邮件;
V(mutex_B); // 离开B信箱临界区
V(Empty_B); // B信箱空位加1
回答问题并提出一个新问题;
P(Empty_A); // 等待A信箱有空位
P(mutex_A); // 进入A信箱临界区
将新邮件放入A的信箱;
V(mutex_A); // 离开A信箱临界区
V(Full_A); // A信箱邮件数加1
}
}