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