操作系统哲学家就餐问题课程设计C语言Word下载.docx
- 文档编号:21795543
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:10
- 大小:19.40KB
操作系统哲学家就餐问题课程设计C语言Word下载.docx
《操作系统哲学家就餐问题课程设计C语言Word下载.docx》由会员分享,可在线阅读,更多相关《操作系统哲学家就餐问题课程设计C语言Word下载.docx(10页珍藏版)》请在冰豆网上搜索。
(3)多线程编程方法参见附件。
3.调试报告:
1)调试记录
2)自我评析和总结
上机时间安排:
18周一~五08:
0-12:
00
指导教师签名:
年月日
系主任(或责任教师)签名:
年月日
用多线程同步方法解决哲学家就餐问题
(Dining-PhilosophersProblem)
1.设计题目与要求
1.1设计题目描述:
用多线程同步方法解决哲学家就餐问题(Dining-PhilosophersProblem)
1.2要求:
2.总体设计思想及系统平台、语言、工具
2.1总体设计思想
哲学家就餐问题,即共有5个哲学家绕一个圆桌做在5个位置上,他们每2个人中间有一只筷子,共5只筷子,只有当每个哲学家取得他左右两边的筷子时,哲学家才能开始就餐,其它时间,哲学家只能思考或等待筷子。
为避免哲学家互相等待对方的筷子发生死锁,本次课程设计要求只许4个哲学家入席,以保证至少有一个哲学家能够进餐。
本课程设计将room作为信号量,将其初始化为4,以保证只允许4个哲学家同时入席就餐,这样就能保证至少有一个哲学家可以就餐。
针对每个哲学家,通过共享操作函数代码,分别建立5个线程,以实现同步哲学家就餐,而申请进入餐厅的哲学家进入room的等待队列,根据FIFO的原则,总会进入到餐厅就餐,因此不会出现饿死和死锁的现象,针对5只筷子分别设置了5个互斥信号量,以保证每只筷子每次只能被取得一次。
2.2系统平台、语言及工具
(1)操作系统:
(2)程序设计语言:
(3)工具:
编辑工具Vi、编译器gcc
3.数据结构与模块说明
线程创建函数pthread_create声明如下:
#include<
pthread.h>
intpthread_create(pthread_t*thread,pthread_attr_t*attr,Void*(*start_routine)(void*),void*arg);
等待其它线程结束函数pthread_join声明如下:
#include<
intpthread_join(pthread_tth,void*thread_return);
信号量的数据类型为结构sem_t,它本质上是一个长整型的数。
初始化信号量函数sem_init声明如下:
semaphore.h>
sem_init(sem_t*sem,intpshared,unsignedintvalue);
增加信号量值函数sem_post声明如下:
Sem_post(sem_t*sem);
减少信号量值函数sem_wait声明如下
Sem_wait(sem_t*sem);
主要数据结构声明:
#defineNUMBERS5//将哲学家人数NUMBERS定义为5
sem_tchopstics[NUMBERS]//定义5只筷子的互斥信号量chopstics
sem_troom//定义避免死锁的同步信号量room
线程共享函数伪代码:
void*Share(inti)
{
think();
wait(room);
//请求入席进餐
wait(chopstick[i]);
//请求左手边的筷子
wait(chopstick[(i+1)%5]);
//请求右手边的筷子
eat();
signal(chopstick[i]);
//释放左手边的筷子
signal(chopstick[(i+1)%5]);
//释放右手边的筷子
signal(room);
//退出席位释放信号量chairs
}
4.用户名、源程序名、目标程序名和源程序
4.1用户名、源程序名、目标程序名
用户名:
源程序名:
目标程序名:
4.2源程序
stdio.h>
unistd.h>
#defineNUMBERS5
sem_tchopstics[NUMBERS];
sem_troom;
sem_tmutex;
intflag[NUMBERS]={0,0,0,0,0};
intchairs[NUMBERS]={0,1,2,3,4};
inti,j;
void*Share(intthreadid);
intmain()
interror;
pthread_tthreads[NUMBERS];
for(i=0;
i<
NUMBERS;
i++)
{
sem_init(&
chopstics[i],0,1);
}
sem_init(&
room,0,NUMBERS-1);
mutex,0,1);
error=pthread_create(&
threads[i],NULL,(void*)Share,(void*)i);
if(error)
{
printf("
ERROR:
threadcreatefailed!
!
"
);
//exit(-1);
}
pthread_join(threads[i],NULL);
}
void*Share(intthreadid)
inti=threadid;
sem_wait(&
room);
flag[i]=1;
chopstics[i]);
printf("
philosopher%dgetchopstics%d\n"
i,i);
chopstics[(i+1)%NUMBERS]);
i,(i+1)%NUMBERS);
mutex);
\n*********************************************\n"
printf("
Dining...\n"
philosopher:
%d,onchairs%dandeating\n"
i,chairs[i]);
for(j=0;
j<
j++)
if((j!
=i)&
&
flag[j])
philosopher%d,onchairs%dandhungry\n"
j,chairs[j]);
sleep(3);
sem_post(&
printf("
philosopher%disfullandputdownchopstics%dand%dandleft\n"
i,i,(i+1)%NUMBERS);
*********************************************\n\n"
flag[i]=0;
5.运行结果
6.调试记录
(1)将写好的代码进行编译,出现如下错误提示:
1.c:
(.text+0x37):
undefinedreferenceto`sem_init'
(.text+0x6a):
(.text+0x86):
(.text+0xc8):
undefinedreferenceto`pthread_create'
(.text+0x108):
undefinedreferenceto`pthread_join'
/tmp/ccq8XD3O.o:
Infunction`Share'
:
(.text+0x13f):
undefinedreferenceto`sem_wait'
(.text+0x160):
(.text+0x1b0):
(.text+0x1f7):
(.text+0x2ad):
undefinedreferenceto`sem_post'
(.text+0x2c0):
(.text+0x2f5):
(.text+0x35d):
collect2:
ldreturned1exitstatus
检查发现,pthread库不是Linux系统默认的库,连接时需要使用库libpthread.a,所以在使用pthread_create创建线程时,在编译中要加-lpthread参数:
gcc-lpthread-o11.c
(2)重新编译代码,出现如下错误提示:
9:
error:
invalidinitializer
10:
Infunction‘main’:
35:
warning:
incompatibleimplicitdeclarationofbuilt-infunction‘exit’
Infunction‘Share’:
48:
incompatibletypeswhenassigningtotype‘sem_t’fromtype‘int’
71:
expected‘;
’before‘sem_post’
76:
仔细查看代码,发是对信号灯初始不能在定义的时候直接初始化,改用sem_init()函数对room,mutex和flag[]进行初始化,去掉exit()函数,找到缺少‘;
’的地方,添加‘;
’
(3)重新编译、连接、运行程序,出现如下错误提示:
查看代码,发现对信号灯flag[]使用出错,将flag[i]=1改为sem_wait(&
flag[i]);
flag[i]=0改为sem_post(&
flag[i])
(4)重新编译、连接、运行程序,没有错误提示,但是结果有误:
philosopher0getchopstics0
I'
mphilosopher0getchopstics0
程序程出现死锁,无法正常进行,查看代码,发现不应该把flag[]设置为信号
(5)改正后,重新编译、连接,运行程序,得到正确结果
philosopher1getchopstics1
philosopher2getchopstics2
philosopher3getchopstics3
philosopher3getchopstics4
*********************************************
Dining...
3,onchairs3andeating
philosopher0,onchairs0andhungry
philosopher1,onchairs1andhungry
philosopher2,onchairs2andhungry
philosopher3isfullandputdownchopstics3and4andleft*********************************************
philosopher2getchopstics3
2,onchairs2andeating
philosopher4,onchairs4andhungry
philosopher4getchopstics4
philosopher2isfullandputdownchopstics2and3andleft
philosopher1getchopstics2
Dining...philosopher:
1,onchairs1andeating
philosopher1isfullandputdownchopstics1and2andleft
philosopher0getchopstics1
0,onchairs0andeating
philosopher0isfullandputdownchopstics0and1andleft
philosopher4getchopstics0
4,onchairs4andeating
philosopher4isfullandputdownchopstics4and0andleft
7.自我评析与总结
通过本次课程设计,我对哲学家就餐这一操作系统经典问题有了进一步的了解,尤其是在设计进程同步算法方面有了新的认识。
通过亲自动手和查询资料,我知道了通过Linux系统的线程机制和信号量控制来实现哲学家就餐问题的并发控制。
在这次课程设计中,由于没有掌握好进程同步中的一些关键知识,导致在实际操作中遇到了很多问题,比如说对信号灯初始化,可以用sem_init函数来很好的实现,而不需要在定义的时候就进行初始化。
在整个程序设计和完善中,遇到很多问题,有些是由于对知识不了解引起的,有些是由于粗心引起的。
此次课程设计使我明白,在程序设计中,我们需要有一个清晰的整体结构,然后针对每个模块逐步实现其功能,在设计中也需要有严谨和认真的态度,才会更好的完成一项任务。
8.参考文献
[1]《操作系统概念》(第七版),AbrahamSilberschatz等著,高等教育出版社出版
[2]《LinuxC编程实践》,童永清著,人民邮电出版社
[3]《操作系统》(第3版)(中译本),OPERATINGSYSTEMS(3RDEDITION),(美)HARVETM.DEITEL;
PAULJ.DEITEL;
DAVIDR.CHOFFNES,清华大学出版社
本科生课程设计成绩评定表
班级:
姓名:
学号:
序号
评分项目
满分
实得分
1
学习态度认真、遵守纪律
10
2
设计分析合理性
3
设计方案正确性、可行性、创造性
20
4
设计结果正确性
40
5
设计报告的规范性
6
设计验收
总得分/等级
评语:
注:
最终成绩以五级分制记。
优(90-100分)、良(80-89分)、中(70-79分)、
及格(60-69分)、60分以下为不及格
指导教师签名:
200年 月 日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 哲学家 就餐 问题 课程设计 语言