欢迎来到天天文库
浏览记录
ID:49560401
大小:58.00 KB
页数:5页
时间:2020-03-02
《哲学家就餐问题分析.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、操作系统实验报告竹学家就餐问题分析•问题描述:十个哲学家围在一个圆桌就餐,相邻两人间有一把刀和i把叉,只有同时拿到刀叉者才能就餐,并口每个哲学家只能从他的左边和右边拿取。•问题分析:我们设定资源是刀叉,资源可以共享,因此两个相邻哲学家之间的刀叉就是临界区,要做好临界区的加锁以实现互斥。设定进程执行为就餐,十个哲学家则有十个并发的进程。我们规定每人拿取时手中的餐具不同,山于十个哲学家之间均有一副刀叉,所以他们的资源是充足的,这就避免了大家都想拿到刀叉而又都拿不到,各并发进程不能继续向前推进的严重死锁状态
2、。但是要考虑到山于哲学家在竞争刀叉时会出现有人只拿到一•样后,左或右又无资源时,该人就会一直处于等待状态,形成死锁,影响进程的并发效率。还有当两边的人都向中间拿吋,中间的人便会因为没有资源而等待。于是再做规定:将哲学家分为三个状态,Thinking,Hungery,Eating.每人一•次拿到刀叉,否则就不拿。还要保证相邻两人不能同时就餐。简略流程图为:释放所占有的资源•实验中用到的变量:#defineN10#defineTHINKING0#defineHUNGRY1#defineEATING2#ly
3、pcdefintsemaphore;//^<示信号量intstate[N];//记录哲学家的状态(THINKING,HUNGERY,EATING)semaphoremutex=l;//公共信号量,以实现临界区互斥semaphores[N];//为每个哲学家建立一个信号量structPERSONINFOintindex;//哲学家编号Boolhand[2][2];//表示哲学家的手,TRUE表示拿到,FALSE表示空//0维是左手,1维是右手dwordthreadid;//记录每个哲学家进程的现成IDH
4、ANDLEthreadhandle;//记录每个哲学家进程的句柄};structPERSONINFOpersons[N];//记录哲学家的结构体boolknife[N];//TRUE:拿有刀,FALSE:空boolfork[N];//TRUE:拿有叉,FALSE:空//分别用knife[i-l]和knife[(i+l)%N]表示第i人左右两边的刀//分别用fork[i-l]和fork[(i+l)%N]表示第i人左右两边的刀•操作过程:每人每次同时取两物,且分别两端取得情况A:两手空空时从左(右)侧各取
5、一物情况B:两手都有物时结束线程,否则继续循环(加少量延时)•程序流程init()//初始化{for(i=0;i6、[(i-1)%5]!=EATING)&&(state[(i+1)%5]!=EATING){state:i]=EATING;V(&s[i]);}}//当哲学家手上拿到刀或叉后,便将桌上相应位置置空//当哲学家放下刀或叉后,便将桌上相应位置置一voidchangeit(bool&hand,bool&knife,bool&fork,boolleft)p(mutex);//临界区if(!handhand[!left]knife&&fork)//桌上有刀也有叉时{knife二mno.Random(2);//拿取7、餐具是随机的,0表示拿走,1表示没拿走if(knife==0){hand[left][O]=l;手上拿着刀fork=l;}else{hand[left][l]=l;//手上拿者叉fork=0;}}elseif(!hand[left]&&!hand[!left]&&!knife&&fork)//桌上有叉但没有刀时{handtleft][1]=1;fork=0;}elseif(!hand[left]&&!hand[left]&&knife&&!fork)//桌上只有刀时{hand[left][0]=l;k8、nife=0;}if(!hand[left]&&hand[!left]&&knife&&fork){if(hand[!left][0]=l){hand[left][1]=1;fork=0;}if(hand[!left][1]=1){hand[left][0]=1;knife=0;}}v(mutex);voidCatchtools(structPERSONINFO*person)i=person->index;〃左于•是空并且桌上有至少有一样餐具if(!p
6、[(i-1)%5]!=EATING)&&(state[(i+1)%5]!=EATING){state:i]=EATING;V(&s[i]);}}//当哲学家手上拿到刀或叉后,便将桌上相应位置置空//当哲学家放下刀或叉后,便将桌上相应位置置一voidchangeit(bool&hand,bool&knife,bool&fork,boolleft)p(mutex);//临界区if(!handhand[!left]knife&&fork)//桌上有刀也有叉时{knife二mno.Random(2);//拿取
7、餐具是随机的,0表示拿走,1表示没拿走if(knife==0){hand[left][O]=l;手上拿着刀fork=l;}else{hand[left][l]=l;//手上拿者叉fork=0;}}elseif(!hand[left]&&!hand[!left]&&!knife&&fork)//桌上有叉但没有刀时{handtleft][1]=1;fork=0;}elseif(!hand[left]&&!hand[left]&&knife&&!fork)//桌上只有刀时{hand[left][0]=l;k
8、nife=0;}if(!hand[left]&&hand[!left]&&knife&&fork){if(hand[!left][0]=l){hand[left][1]=1;fork=0;}if(hand[!left][1]=1){hand[left][0]=1;knife=0;}}v(mutex);voidCatchtools(structPERSONINFO*person)i=person->index;〃左于•是空并且桌上有至少有一样餐具if(!p
此文档下载收益归作者所有