6个哲学家进餐

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

问题描述:一个房间内有6位哲学家,他们的生活就是思考和进食。哲学家思考后,过一定的时间就会饥饿,饥饿之后就想吃饭,吃饭后再思考。房间里有一张圆桌,桌子周围放有6把椅子,分别属于6位哲学家,每两位哲学家之间有1支筷子,哲学家进食时必须同时使用左右两支筷子。实验要求:1、写出哲学家进餐的算法描述答:用六支筷子解决需要用两双筷子来进餐的六个哲学家,这就导致了筷子不是私用而成了公用资源,这就需要对每支筷子设立一个信号量来解决哲学家们进餐时产生的互斥问题。这里设置六个信号量0—5,并用pv原语来控制信号量,并将六个哲学家分别编号0—5。同时,哲学家进餐时可能会产生每个人都拿了一支筷子造成谁也无法进餐的问题,所以同时设置一种设法来控制哲学家们对筷子申请的顺序,以避免死锁的产生。2、写出你的算法如何解决死锁问题,即不能6位哲学家各拿到1支筷子,但都吃不上答:解决死锁的方法是让编号为奇数的哲学家首先申请左手边的筷子,再去申请右手边的筷子;让编号为偶数的哲学家首先去申请右手边的筷子然后再去申请左手边的筷子。这样死锁的问题即可避免。因为之所以产生死锁就是每个哲学家都拿了一支筷子才可能会产生死锁,而进行奇左偶右的方法就使得在一个哲学家拿到一支筷子的情况下即可至少使一个邻座的哲学家无法拿到一支筷子。1043234012553、用C程序实现哲学家进餐。(注:可以使用共享变量的方式,也可以使用信号量的方式来实现)#includesys/types.h#includesys/ipc.h#includesys/sem.h#includesignal.h#includestdio.h#includesys/wait.h#includestdlib.h#defineN6//定义哲学家个数#defineTHINKTIME3//思考时间#defineEATTIME2//进餐时间voidpop(),vop(),zxj(),think(),eat();//初始化函数main(){inti,semid,pid[5];//定义变量,i是哲学家编号,semid是信号量,pid[5]是六个子进程semid=semget(0x1234,6,0666|IPC_CREAT);//创建6个信号量for(i=0;iN;i++)/*为每个信号量赋值为1*/{if(semctl(semid,i,SETVAL,1)==-1)perror(semsetvalueerror);//如果信号量赋值失败则输出semsetvalueerror}while((pid[0]=fork())==-1);if(pid[0]==0)//创建第一个子进程{intnum=1;//num初始化为1,用来标记吃饭次数while(1)//如果为真则循环zxj(semid,0,num);//调用哲学家函数}else{while((pid[1]=fork())==-1);if(pid[1]==0)//创建第二个子进程{intnum=1;while(1)zxj(semid,1,num);}else{while((pid[2]=fork())==-1);if(pid[2]==0){intnum=1;while(1)zxj(semid,2,num);}else{while((pid[3]=fork())==-1);if(pid[3]==0){intnum=1;while(1)zxj(semid,3,num);}else{while((pid[4]=fork())==-1);if(pid[4]==0){intnum=1;while(1)zxj(semid,4,num);}else{while((pid[5]=fork())==-1);if(pid[5]==0){intnum=1;while(1)zxj(semid,5,num);}else{sleep(50);//主进程睡眠50秒让子进程完成通信,即给50秒模拟哲学家进餐kill(0,15);//完成后终止程序exit(0);}}}}}}}voidzxj(intsemid,inti,intnum)//哲学家函数{while(1)//如果为真则循环if(i%2==0)//如果哲学家编号为偶数{think(i);//先思考(调用think函数)pop(semid,(i+1)%6);//先取右边的筷子pop(semid,i);//再取左边的筷子eat(i,num);//开始吃饭(调用eat函数)num++;//吃完饭后吃饭次数加一vop(semid,(i+1)%6);//放下右边的筷子vop(semid,i);//放下左边的筷子}Else//else哲学家编号为奇数{think(i);//同样先思考(调用think函数)pop(semid,i);//先取左边的筷子pop(semid,(i+1)%6);//再取右边的筷子eat(i,num);//开始吃饭(调用eat函数)num++;//吃完饭后吃饭次数加一vop(semid,i);//放下左边的筷子vop(semid,(i+1)%6);//放下右边的筷子}}voidthink(inti)//思考函数{printf(我是第%d个哲学家,我正在[思考],思考时间为%d秒.\n,i,i+THINKTIME);//输出编号为i的哲学家的思考时间sleep(i+THINKTIME);//睡眠,完成思考过程}voideat(inti,intnum){printf(我是第%d个哲学家,我正在吃第%d次饭,吃饭时间为%d秒.\n,i,num,i+EATTIME);//输出编号为i的哲学家的吃饭次数num和吃饭时间sleep(i+EATTIME);//睡眠,完成吃饭过程}}voidpop(intsemid,intsemnum)//p操作{structsembufthesops;thesops.sem_num=semnum;thesops.sem_op=-1;thesops.sem_flg=SEM_UNDO;semop(semid,&thesops,1);}voidvop(intsemid,intsemnum)//v操作{structsembufthesops;thesops.sem_num=semnum;thesops.sem_op=1;thesops.sem_flg=SEM_UNDO;semop(semid,&thesops,1);}4、程序的运行结果。[root@localhost~]#cc-ommmm.c[root@localhost~]#./mm我是第0个哲学家,我正在[思考],思考时间为3秒.我是第1个哲学家,我正在[思考],思考时间为4秒.我是第2个哲学家,我正在[思考],思考时间为5秒.我是第3个哲学家,我正在[思考],思考时间为6秒.我是第4个哲学家,我正在[思考],思考时间为7秒.我是第5个哲学家,我正在[思考],思考时间为8秒.我是第0个哲学家,我正在吃第1次饭,吃饭时间为2秒.我是第2个哲学家,我正在吃第1次饭,吃饭时间为4秒.我是第0个哲学家,我正在[思考],思考时间为3秒.我是第4个哲学家,我正在吃第1次饭,吃饭时间为6秒.我是第2个哲学家,我正在[思考],思考时间为5秒.我是第1个哲学家,我正在吃第1次饭,吃饭时间为3秒.我是第1个哲学家,我正在[思考],思考时间为4秒.我是第0个哲学家,我正在吃第2次饭,吃饭时间为2秒.我是第4个哲学家,我正在[思考],思考时间为7秒.我是第3个哲学家,我正在吃第1次饭,吃饭时间为5秒.我是第5个哲学家,我正在吃第1次饭,吃饭时间为7秒.我是第0个哲学家,我正在[思考],思考时间为3秒.我是第1个哲学家,我正在吃第2次饭,吃饭时间为3秒.我是第3个哲学家,我正在[思考],思考时间为6秒.我是第1个哲学家,我正在[思考],思考时间为4秒.我是第2个哲学家,我正在吃第2次饭,吃饭时间为4秒.我是第5个哲学家,我正在[思考],思考时间为8秒.我是第4个哲学家,我正在吃第2次饭,吃饭时间为6秒.我是第0个哲学家,我正在吃第3次饭,吃饭时间为2秒.我是第2个哲学家,我正在[思考],思考时间为5秒.我是第0个哲学家,我正在[思考],思考时间为3秒.我是第1个哲学家,我正在吃第3次饭,吃饭时间为3秒.我是第1个哲学家,我正在[思考],思考时间为4秒.我是第0个哲学家,我正在吃第4次饭,吃饭时间为2秒.我是第3个哲学家,我正在吃第2次饭,吃饭时间为5秒.我是第4个哲学家,我正在[思考],思考时间为7秒.我是第0个哲学家,我正在[思考],思考时间为3秒.我是第5个哲学家,我正在吃第2次饭,吃饭时间为7秒.我是第1个哲学家,我正在吃第4次饭,吃饭时间为3秒.我是第3个哲学家,我正在[思考],思考时间为6秒.我是第1个哲学家,我正在[思考],思考时间为4秒.我是第2个哲学家,我正在吃第3次饭,吃饭时间为4秒.我是第5个哲学家,我正在[思考],思考时间为8秒.我是第4个哲学家,我正在吃第3次饭,吃饭时间为6秒.我是第0个哲学家,我正在吃第5次饭,吃饭时间为2秒.我是第2个哲学家,我正在[思考],思考时间为5秒.我是第0个哲学家,我正在[思考],思考时间为3秒.我是第1个哲学家,我正在吃第5次饭,吃饭时间为3秒.我是第1个哲学家,我正在[思考],思考时间为4秒.我是第0个哲学家,我正在吃第6次饭,吃饭时间为2秒.我是第4个哲学家,我正在[思考],思考时间为7秒.我是第3个哲学家,我正在吃第3次饭,吃饭时间为5秒.我是第0个哲学家,我正在[思考],思考时间为3秒.我是第5个哲学家,我正在吃第3次饭,吃饭时间为7秒.我是第1个哲学家,我正在吃第6次饭,吃饭时间为3秒.我是第3个哲学家,我正在[思考],思考时间为6秒.我是第2个哲学家,我正在吃第4次饭,吃饭时间为4秒.我是第1个哲学家,我正在[思考],思考时间为4秒.已终止[root@localhost~]#

1 / 6
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功