请用信号量机制实现这三个进程的同步与互斥活动,并说明所定义的信号量的含义。要求用伪代码描述。 15
三个进程P1、P2、P3互斥使用一个包含N(N>0)个单元的缓冲区。P1每次用produce()生成一个正整数并用put()送入缓冲区某一空单元中;P2每次用getodd...
三个进程P1、P2、P3互斥使用一个包含N(N>0)个单元的缓冲区。P1每次用produce()生成一个正整数并用put()送入缓冲区某一空单元中;P2每次用getodd()从该缓冲区中取出一个奇数并用countodd()统计奇数个数;P3每次用geteven()从该缓冲区中取出一个偶数并用counteven()统计偶数个数。
展开
1个回答
展开全部
解:缓冲区是一互斥信号量,因此设互斥信号量
mutex
P1、P2
因为奇数的设置与取用而同步,设同步信号量odd
P1、P3因为偶数的设置与取用而同步,设同步信号量even;
P1、P2、P3因为共享缓冲区,设同步信号量empty。
semaphore
mutex=1;
//
缓冲区互斥信号量
semaphore
odd=0, even=0 //
奇数、偶数进程的同步信号量
semaphore
empty=N //
空缓冲区单元个数信号量
main( )
cobegin{
process P1
while(true){
number=produce();
p(empty); //
递减空缓冲区的单元个数
p(mutex); //
互斥访问缓冲区
put(
);
v(mutex); //
恢复访问缓冲区
if number%2==0 v(even); //
为偶数允许取偶数
else v(odd); //
为奇数允许取奇数
}
process P2
process P3
while(true){
while(true){
p(odd); //
互斥奇数
p(even);
p(mutex); //
互斥访问缓冲区
p(mutex);
getodd(
);
getevend(
);
v(mutex); //
恢复访问缓冲区
v(mutex);
v(empty); //
递增空缓冲区的单元个数
v(empty);
countodd(); }
counteven();}
}
coend
mutex
P1、P2
因为奇数的设置与取用而同步,设同步信号量odd
P1、P3因为偶数的设置与取用而同步,设同步信号量even;
P1、P2、P3因为共享缓冲区,设同步信号量empty。
semaphore
mutex=1;
//
缓冲区互斥信号量
semaphore
odd=0, even=0 //
奇数、偶数进程的同步信号量
semaphore
empty=N //
空缓冲区单元个数信号量
main( )
cobegin{
process P1
while(true){
number=produce();
p(empty); //
递减空缓冲区的单元个数
p(mutex); //
互斥访问缓冲区
put(
);
v(mutex); //
恢复访问缓冲区
if number%2==0 v(even); //
为偶数允许取偶数
else v(odd); //
为奇数允许取奇数
}
process P2
process P3
while(true){
while(true){
p(odd); //
互斥奇数
p(even);
p(mutex); //
互斥访问缓冲区
p(mutex);
getodd(
);
getevend(
);
v(mutex); //
恢复访问缓冲区
v(mutex);
v(empty); //
递增空缓冲区的单元个数
v(empty);
countodd(); }
counteven();}
}
coend
光点科技
2023-08-15 广告
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件...
点击进入详情页
本回答由光点科技提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询