2015 操作系统 同步问题设计 解答题
第 45 题

[tag_link]

有 A、B 两人通过信箱进行辩论,每个人都从自己的信箱中取得对方的问题,将答案和向对方提出的新问题组成一个邮件放人对方的信箱中。假设 A 的信箱最多放M个邮件,B 的信箱最多放N个邮件。初始时 A 的信箱中有x个邮件 (0<x<M),B 的的信箱中有y个邮件 (0<y<N)。辩论者每取出一个邮件,邮件数减 1。A 和 B 两人的操作过程描述如下:

A {
    while (true) {
         A 的信箱中取出一个邮件;
        回答问题并提出一个新问题;
        将新邮件放入 B 的信箱;
    }
}
B {
    while (true) {
         B 的信箱中取出一个邮件;
        回答问题并提出一个新问题;
        将新邮件放入 A 的信箱;
    }
}

当信箱不为空时,辩论者才能从信箱中取邮件,否则等待。当信箱不满时,辩论者才能将新邮件放入信箱,否则等待。请添加必要的信号量和 P、V(或 wait、signal)操作,以实现上述过程的同步。要求写出完整的过程,并说明信号量的含义和初值。

同步问题设计

semaphore A_full = x;        // A 信箱中已有的邮件个数
semaphore A_empty = M - x;   // A 信箱还可以放多少个邮件
semaphore B_full = y;        // B 信箱中已有的邮件个数
semaphore B_empty = N - y;   // B 信箱中还能放多少个邮件
semaphore A_mutex = 1;       // 互斥访问 A 信箱
semaphore B_mutex = 1;       // 互斥访问 B 信箱

A() {
  while (1) {
    P(A_full);
    P(A_mutex);
    A信箱中取出一个邮件;
    V(A_mutex);
    V(A_empty);
    回答问题并提出新问题;
    P(B_empty);
    P(B_mutex);
    将信件放入B邮箱;
    V(B_mutex);
    V(B_full);
  }
}

B() {
  while (1) {
    P(B_full);
    P(B_mutex);
    B信箱中取出一个邮件;
    V(B_mutex);
    V(B_empty);
    回答问题并提出新问题;
    P(A_empty);
    P(A_mutex);
    将信件放入A邮箱;
    V(A_mutex);
    V(A_full);
  }
}

【评分说明】

1)每对信号量的定义及初值正确,给分。

2)每个互斥信号量的 P、V 操作使用正确,各给分。

3)每个同步信号量的 P、V 操作使用正确,各给分。

4)其他答案酌情给分。