操作系统
2009-45
(7分)三个进程 P1、P2、P3 互斥使用一个包含 N(N > 0)个单元的缓冲区。P1 每次用 produce() 生成一个正整数并用 put() 送入缓冲区某一空单元中;P2 每次用 getodd() 从该缓冲区中取出一个奇数并用 countodd() 统计奇数个数;P3 每次用 geteven() 从该缓冲区中取出一个偶数并用 counteven() 统计偶数个数。请用信号量机制实现这三个进程的同步与互斥活动,并说明所定义信号量的含义(要求用伪代码描述)。
答案
答案:
(1)信号量定义及含义:
mutex(初值1):互斥信号量,保证对缓冲区的互斥访问。odd(初值0):同步信号量,表示缓冲区中奇数的个数,由P1生产后V操作,P2消费前P操作。even(初值0):同步信号量,表示缓冲区中偶数的个数,由P1生产后V操作,P3消费前P操作。empty(初值N):同步信号量,表示缓冲区中空单元的个数,由P1生产前P操作,P2/P3消费后V操作。
(2)进程伪代码:
mutex=1;
odd=0, even=0;
empty=N;
main() {
cobegin {
Process P1() {
while (True) {
x = produce();
P(empty); // 申请一个空单元
P(mutex); // 互斥进入缓冲区
Put(); // 放入缓冲区
V(mutex); // 释放互斥锁
if (x % 2 == 0) // 判断奇偶性
V(even); // 偶数,唤醒P3
else
V(odd); // 奇数,唤醒P2
}
}
Process P2() {
while (True) {
P(odd); // 等待一个奇数
P(mutex); // 互斥进入缓冲区
getodd(); // 取出奇数
V(mutex); // 释放互斥锁
V(empty); // 释放一个空单元
countodd(); // 统计奇数
}
}
Process P3() {
while (True) {
P(even); // 等待一个偶数
P(mutex); // 互斥进入缓冲区
geteven(); // 取出偶数
V(mutex); // 释放互斥锁
V(empty); // 释放一个空单元
counteven(); // 统计偶数
}
}
} coend
}(3)关键点:
- 同步:P1通过
odd和even信号量协调P2和P3的消费,确保生产与消费的奇偶匹配。 - 互斥:所有进程通过
mutex信号量互斥访问缓冲区,避免竞争条件。 - 流量控制:
empty信号量限制缓冲区占用,防止溢出。