好文档 - 专业文书写作范文服务资料分享网站

6个哲学家进餐问题预防死锁

天下 分享 时间: 加入收藏 我要投稿 点赞

红河学院 课程设计报告

课程名称: 设计题目: 院 系: 专 业: 班 级: 设 计 者: 学 号: 指导教师:

2013

1 / 8

5

操作系统 6个哲学家进餐

工学院 计算机科学与技术 11计科班 曹永前 2 韦 相 月 26 日

1. 问题描述:

一个房间内有6个哲学家,他们的生活就是思考和进食。哲学家思考后,过一定的时间就会饥饿,饥饿之后就想吃饭,吃饭后再思考。房间里有一张圆桌,桌子周围放有五把椅子,分别属于五位哲学家每两位哲学家之间有一把叉子,哲学家进食时必须同时使用左右两把叉子。

1 0 1

2 0 2 3 5 4 3 4 5 2. 问题分析

1、写出哲学家进餐的算法描述。

用六只筷子解决需要用两双筷子来进餐的六个哲学家,由于每个哲学家都需要其周围的两只筷子,所以筷子是公用信号量,这久需要设置一个互斥信号量,来使六个哲学家互斥的进餐.具体做法将六个信号量设置为0-5,用pv源于来控制信号量,并将六个哲学家分别编号为0-5.经过仔细分析我们会发现,有这样一个问题存在,就是当每个哲学家都申请到他周围的一只筷子时,由于他们每人都只有一只筷子无法进餐,没有进餐他们就无法释放他们已经得得到的筷子,这样是进餐出于一种僵局,无法继续下去,这就是死锁问题.

2、死锁问题的分析与具体的解决方法。

死锁问题就是当每个哲学家都拿到且只拿到一只筷子,这样每个哲学家都无

2 / 8

法进餐,也无法释放所得到的筷子,所以解决死锁我们就要从这入手,就是怎样去预防使所有哲学家不要同时去申请他们同一方向的筷子.根据这解决死锁的方法有以下几种:

a.每一次最多只能有五个哲学家申请进餐.这样其中的一个哲学家就能申请到两只筷子,就能够进餐,再将筷子释放给其他哲学家进餐.

b.用AND信号量,就是哲学家需同时申请其左右两边的筷子,两边都有资源的时候,才能让这个哲学家得到资源,这样哲学家只要申请到筷子就能进餐, 再将筷子释放给其他哲学家进餐. c.用管程机制来实现。

d.我们前面已经将每个哲学家都分配了一个编号,我们可以编号为奇数的哲学家首先去申请其左边的筷子,再去申请其右手边的筷子;让编号为偶数的哲学家,先去申请其右边的筷子,再去申请其左边的筷子.我们可以看出编号为奇数的哲学家左边,与编号为偶数的哲学家的右边为同一只筷子,当其中一个哲学家拿到此筷子后,他另一边的筷子也是空闲的,这样就能避免死锁. 主程序中我使用的是最后一种避免死锁的方法.

3、用C程序实现哲学家进餐。(注:可以使用共享变量的方式,也可以使用信号量的方式或其他方法来实现)

3.程序清单

#include #include #include #include #include #include #include #define N 6 //人数

#define THINKTIME 3 // 思考时间 #define EATTIME 2 //进餐时间

void pop(),vop(),zxj(),think(),eat(); // 初始化 main() {

int i,semid,pid; //定义变量i为 哲学家的编号,semid 信号量 semid = semget(0x1234,6,0666|IPC_CREAT); for (i=0;i

if (semctl(semid,i,SETVAL,1)==-1) perror(\ }

int pid1,pid2,pid3,pid4,pid5,pid6; while ((pid1=fork())==-1);

3 / 8

6个哲学家进餐问题预防死锁

红河学院课程设计报告课程名称:设计题目:院系:专业:班级:设计者:学号:指导教师:20131/8年5操作系统6个哲学家进餐工学院计算机科学与技术11计科班曹永前2韦
推荐度:
点击下载文档文档为doc格式
1jjsi8hiv87b3ef97wu606i7k4ff8500zep
领取福利

微信扫码领取福利

微信扫码分享