桌上有一空盘,允许存放一只水果爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果规定当盘空时一次只能放一只水果供吃者取用,请用
P,V原语实现爸爸,儿子,女儿三个并发进程的同步
分析在本题中,爸爸,儿子,女儿共用一个盘子,盘中一次只能放一个水果当盘子为空时,爸爸可将一个水果放入果盘中若放入果盘中的是桔子,则允许儿子吃,女儿必须等待;若放入果盘中的是苹果,则允许女儿吃,儿子必须等待本题实际上是生产者-消费者问题的一种变形这里,生产者放入缓冲区的产品有两类,消费者也有两类,每类消费者只消费其中固定的一类产品
解:在本题中,应设置三个信号量
S,S
o,Sa,信号量S表示盘子是否为空,其初值为l;信号量So表示盘中是否有桔子,其初值为0;信号量Sa表示盘中是否有苹果,其初值为0同步描述如下:
intS=1;
intSa=0;
intSo=0;
main()
{
cobegin
father();/*父亲进程*/
son();/*儿子进程*/
daughter();/*女儿进程*/
coend
}
father()
{
while(1)
{
P(S);
将水果放入盘中;
if(放入的是桔子)V(So);
elseV(Sa);
}
}
son()
{
while(1)
{
P(So);
从盘中取出桔子;
V(S);
吃桔子;
}
}
daughter()
{
while(1)
{
P(Sa);
从盘中取出苹果;
V(S);
吃苹果;
}
}
分析在本题中,爸爸,儿子,女儿共用一个盘子,盘中一次只能放一个水果当盘子为空时,爸爸可将一个水果放入果盘中若放入果盘中的是桔子,则允许儿子吃,女儿必须等待;若放入果盘中的是苹果,则允许女儿吃,儿子必须等待本题实际上是生产者-消费者问题的一种变形这里,生产者放入缓冲区的产品有两类,消费者也有两类,每类消费者只消费其中固定的一类产品
解:在本题中,应设置三个信号量
s,s
o,sa,信号量s表示盘子是否为空,其初值为l;信号量so表示盘中是否有桔子,其初值为0;信号量sa表示盘中是否有苹果,其初值为0同步描述如下:
ints=1;
intsa=0;
intso=0;
main()
{
cobegin
father();/*父亲进程*/
son();/*儿子进程*/
daughter();/*女儿进程*/
coend
}
father()
{
while(1)
{
p(s);
将水果放入盘中;
if(放入的是桔子)v(so);
elsev(sa);
}
}
son()
{
while(1)
{
p(so);
从盘中取出桔子;
v(s);
吃桔子;
}
}
daughter()
{
while(1)
{
p(sa);
从盘中取出苹果;
v(s);
吃苹果;
}
}
1.有三个进程p
1,p
2,p3协作解决文件打印问题:系统有两个环形缓冲池,每个缓冲池有n个缓冲区;p1每次将1条记录从磁盘读入缓冲池1,p2每次将1条记录从缓冲池1复制到缓冲池2,p3每次从缓冲池2取出1条记录打印输出请用信号量机制实现这三个进程的同步
信号量提示:full
1,empty
1,mutex
1,in
1,out1;full
2,empty
2,mutex
2,in
2,out2
2.上题中如果两个缓冲池都是单缓冲区,则如何简化各进程的描述?
提示:单缓冲区,故上题中的mute
x,i
n,out均不需要
这个问题较为简单:与生产者一消费者问题非常类似,只不过涉及的进程多了一个因此,我们可以用类似于生产者一消费者的解决方法来解决这个问题不过,由于本问题的范围在生产者消费者问题上进行了线性扩展,我们也需要对生产者消费者的解决方案进行线性扩展,即增加适当数量的信号量
解决要点如下:
(1)由于缓冲区是共享空间,我们设置一个互斥信号量来保护它设信号量为mutex
(2)P
1,P2共享缓冲区的奇数数值,设同步信号量为odd
(3)P
1,P3共享缓冲区的偶数数值,设同步信号量为even
(4)P
1,P
2,P3共享缓冲区的空位,设同步信号量为empty
(5)所有进程均需进行down(mutex)和up(mutex)操作
(6)P1需要进行down(empty)和up(odd)/up(even)之一的操作
(7)P2需要进行down(odd)和up(empty)的操作
(8)P3需要进行down(even)和]up(empty)的操作
三个进程的实现如下:
P1:
while(true){
integerprodlace();//此行以下5行与生产者问题解答一样
down(empty);
down(mutex);
put();
up(mutex);
if(integer%20)//此处与生产者方案略有不同,需要进行判断,以决定唤醒P
2,P3中的哪一个进程
up(even);
else
up(odd);
}
P2:与消费者问题的解答几乎完全一样
while(true){
down(odd);
down(mutex);
getodd();
up(mutex);
up(empty);
countOdd();
}
P3:与消费者问题的解答几乎完全一样
while(true){
down(even);
down(mutex);
getEven();
up(mutex);
up(empty);
countEven();
}
解:缓冲区是一互斥信号量,因此设互斥信号量
mutex
P
1,P2
因为奇数的设置与取用而同步,设同步信号量odd
P
1,P3因为偶数的设置与取用而同步,设同步信号量even;
P
1,P
2,P3因为共享缓冲区,设同步信号量empty
semaphore
mutex1;
//
缓冲区互斥信号量
semaphore
odd0,even0//
奇数,偶数进程的同步信号量
semaphore
emptyN//
空缓冲区单元个数信号量
main()
cobegin{
processP1
while(true){
numberproduce();
p(empty);//
递减空缓冲区的单元个数
p(mutex);//
互斥访问缓冲区
put(
);
v(mutex);//
恢复访问缓冲区
ifnumber%20v(even);//
为偶数允许取偶数
elsev(odd);//
为奇数允许取奇数
}
processP2
processP3
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
前几天才写的,新鲜热辣你把100改为10即可#include#include#include#defineSEQLEN100intmain(intargc,char**argv){inti0;intseqSEQLEN];//不直接产生随机数,而是产生随机位置,再到序列中提取相应位置上的数字for(i0;ilt;SEQLEN;i++){seqi]i+1;}//初始化种子intseed(int)time(NULL);printf(%d\n,RAND_MAX);for(i0;ilt;SEQLEN;i++){//每次得到随机数后,放大的因子从100到1逐步缩小intoffset(int)((double)rand_r(amp;seed)*(SEQLEN-i)/RAND_MAX);//每得到一个随机位置后,就把序列中相应位置上的数字替换到序列后部inttmpseqoffset];seqoffset]seqSEQLEN-i];seqSEQLEN-i]tmp;}for(i0;ilt;SEQLEN;i++){printf(%3d,,seqi]);if(i%109){printf(\n);}}printf(\n);return0;}
上一篇:主板代码8,诊断卡显示08怎么办
下一篇 > :网线没信号怎么办,我家那条网线经常没信号怎么办
还没有评论,快来抢沙发吧!
最新发现
相关资讯
三个并发进程的同步算法,一空盘放一水果父放梨母放橘儿取梨女取橘四人如何并发
(1)由于缓冲区是共享空间,我们设置一个互斥信号量来保护它设信号量为mutex
2024-03-22 06:32:32
主板代码8,诊断卡显示08怎么办
另外开机就蓝屏看不见代码一闪而过然后自己重新启动的情况这个时候已经不可能在系统里进行第一步的设置了,那么就要在机器启动的时候按F8,选择启动失败后禁用重新启动这项,选择之后启动失败了,系统就会停在蓝屏代
2024-03-22 06:32:28
python做上位机界面设计,有没有嵌入式的上位机用python做的
上位机是不是一般都包括串口调试工具
2024-03-22 06:30:35
bios检测成功后黑屏,检测顺利通过,显示器不亮.请高手
应该是显卡设置的分辩率太高引起的,可以开机按F8进安全模式下把显卡给卸载了,然后重新正常启动进系统后安装上驱动修改分辨率为显示器支持的模式
2024-03-22 06:30:30
wire算法原理,1-Wire的单总线的工作原理
概述本示例的程序采用C语言编写,主程序为:GetTemperatures,它完成1-Wire主机的初始化,搜索1-Wire总线上的所有器件,并指定它们测量温度,然后将测量值送回CPU并存储如果总线上没有1-Wire器件,则退出主程序并返回值1,否则,
2024-03-22 06:28:35
新闻热榜
oppo透明桌面怎么设置,oppo手机怎么设置透明壁纸
2024-02-26 13:00:3389c2051c语言,求AT89C2051单片机高手电平如下C语言程序
2024-03-13 16:06:50oraclesql包常量,请问Oracle中如何在通过创建一个package,然后在package中创建...
2024-02-26 19:08:338g显卡,GTX1070和RTX2060哪个性能比较好,哪个性价比比较高
2024-03-13 17:34:31mac重装系统白屏...当然是用BOOT安装的,重启后无法进入界面,一直白屏
2024-03-13 19:08:25热门游戏
精彩专题