前言
缓冲区管理问题是操作系统中P、V操作部分非常经典的问题!_
缓冲区问题
1. 问题描述
有n
个进程将字符逐个读入到一个容量为80
的缓冲区中(n>1)
,当缓冲区满后,由输出进程Q
负责一次性取走这80
个字符。这种过程循环往复,请用信号量和P、V操作写出n个读入进程(P1, P2,…Pn)
和输出进程Q
能正确工作的的动作序列
2. 问题分析
n
个进程对缓冲区之间是互斥关系,而它们和进程Q
之间又是同步关系,理解了这一点,根据前面几个P、V操作经典例题的分析,我们知道,同步关系需要2个同步信号量,互斥关系需要一个互斥信号量,大体思路就是如此。
3. P、V操作
semaphore empty = 80; // 空闲缓冲区的数量
semaphore full = 0; // 缓冲区是否满
semaphore mutex = 1; // 互斥信号量,保证count,int等能完整执行
int count = 0; // 表示已写入内容的缓冲区的大小
char[80] Buffer; // 缓冲区
int in = 0; // 缓冲区读入游标-读入位置标志位
cobegin
process Pi(i=1,2,...,n) {
while(true) {
{读入一个字符到x};
P(empty);
P(mutex);
Buffer[in] = x;
in = (in + 1) % 80;
count++;
if(count == 80) {
count = 0; // 从0开始继续计数
V(mutex);
V(full); // 读入满80个字符后提醒Q进程取走
} else
V(mutex);
}
}
process Q {
while(true) {
P(full);
P(mutex);
for(int j=0; j<80; j++)
read Buffer[j];
in = 0;
V(mutex);
for(int j=0; j<80; j++)
V(empty);
}
}
coend
d=====( ̄▽ ̄*)b