1 / 14
文档名称:

哲学家就餐-课件(PPT·精·选).ppt

格式:ppt   页数:14页
下载后只包含 1 个 PPT 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

哲学家就餐-课件(PPT·精·选).ppt

上传人:aidoc7 2016/5/13 文件大小:0 KB

下载得到文件列表

哲学家就餐-课件(PPT·精·选).ppt

相关文档

文档介绍

文档介绍:哲学家用餐哲学家用餐哲学家用餐问题: ?哲学家就餐问题中,一组哲学家围坐在一个圆桌旁,每个哲学家的左边都只有一只筷子(当然他的右边也有一只筷子,但是这是他右边哲学家的左边的筷子),他们吃完了就思考,思考了一会就会饿,饿了就想吃,然而,为了吃饭,他们必须获得左边和右边的筷子进餐完毕, 放下筷子继续思考。五个人五只筷子该如何进行用餐啊利用记录型信号量解决: ?进分析可知,放在桌子上的筷子是临界资源,在一段时间内允许一位哲学家使用。为了实现对筷子的互斥使用,可以用一个信号量表示一只筷子,由这五个信号量构成信号量数组。其描述如下: ? Var chopstick:array[0, …,4]of semaphore; ?所有信号量均被初始化为 1 ,第 i位哲学家的活动课描述为: ? repeat: ? wait(chopstick[i ]); ? Wait(chopstick[(i+1)mod5); ?…? eat; ?…? signal(chopstick[i ]); ? signal(chopstick([i+1]mod5); ?…? Think; ? until false 但是这样有可能造成死锁,如何解决? (1) 至多只允许四个哲学家同时进餐,以保证至少有一个哲学家能够进餐, 最终总会释放出他所使用过的两支筷子, 从而可使更多的哲学家进餐. 其伪码是: Semaphore chopstick[5]={1,1,1,1,1}; Semaphore room=4; Void philosopher(int i) { while(true ) { Think(); Wait(room ); // 请求进入房间进餐 wait(chopstick[i ]);// 请求左手边的筷子 wait(chopstick[(i+1)]%5); // 请求右手边的筷子 eat(); signal(chopstick[(i+1)]%5);// 释放右手边的筷子 singal(chopstick[i ]);// 释放右手边的筷子 singal(room ); } } 可采用以下几种解决方法来解决死锁: ?(2) 仅当哲学家的左右两支筷子都可用时,才允许他拿起筷子进餐. 其伪码: ? Semaphore chopstick[5]={1,1,1,1,1}; ? Void philosopher(int I) ? { ? while(true )? { ? Think(); ? Swait(chopstick[(I+1)]%5 , chopstick[I ]); ? eat(); ? Ssignal(chopstick[(I+1)]%5 , chopstick[I ]); ? } ? } (3) 规定奇数号的哲学家先拿起他左边的筷子,然后再去拿他右边的筷子;,将是 1,2 号哲学家竞争 1号筷子,3,4 号哲学家竞争 ,获得后,再去竞争偶数号筷子,最后总会 : ? Semaphore chopstick[5]={1,1,1,1,1}; ? void philosopher(int i) ?{? While(true )?{? Think(); ? If(i%2==0) // 偶数号哲学家, 先右后左?{? Wait(chopstick[i+1]mod5); ? Wait(chopsticl[i ]); ? eat(); ? signal(chopstick[(i+1)]mod5); ? singal(chopstick[i ]); ?}? else ?{? Wait(chopsticl[i ]); ? Wait(chopstick[i+1]mod5); ? eat(); ? singal(chopstick[i ]