首页教程软件资讯正文

三个并发进程的同步算法,一空盘放一水果父放梨母放橘儿取梨女取橘四人如何并发

发布时间:2024-03-22 06:32:32 来源:其它 作者:未知

一空盘放一水果父放梨母放橘儿取梨女取橘四人如何并发

一空盘放一水果父放梨母放橘儿取梨女取橘四人如何并发

桌上有一空盘,允许存放一只水果爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果规定当盘空时一次只能放一只水果供吃者取用,请用

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);

吃苹果;

}

}

设有2个并发执行的进程:P1:S1;P2:S2利用信号量实现前驱关系S1...

设有2个并发执行的进程:P1:S1;P2:S2利用信号量实现前驱关系S1...

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均不需要

三个进程P1,P2,P3互斥使用一个包含N(N0)个单元的缓冲区.-...

三个进程P1,P2,P3互斥使用一个包含N(N0)个单元的缓冲区.-...

这个问题较为简单:与生产者一消费者问题非常类似,只不过涉及的进程多了一个因此,我们可以用类似于生产者一消费者的解决方法来解决这个问题不过,由于本问题的范围在生产者消费者问题上进行了线性扩展,我们也需要对生产者消费者的解决方案进行线性扩展,即增加适当数量的信号量

解决要点如下:

(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

1,假设有键盘输入进程,计算进程,打印进程三个并发进程:键盘输...

前几天才写的,新鲜热辣你把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;}

文章TAG: 并发 空盘 水果 母放橘 父放梨 进程 三个并发进程的同步算法

还没有评论,快来抢沙发吧!

最新发现

相关资讯

新闻热榜

热门游戏

精彩专题