操作系统哲学家就餐问题课程设计C语言Word下载.docx

上传人:b****6 文档编号:21795543 上传时间:2023-02-01 格式:DOCX 页数:10 大小:19.40KB
下载 相关 举报
操作系统哲学家就餐问题课程设计C语言Word下载.docx_第1页
第1页 / 共10页
操作系统哲学家就餐问题课程设计C语言Word下载.docx_第2页
第2页 / 共10页
操作系统哲学家就餐问题课程设计C语言Word下载.docx_第3页
第3页 / 共10页
操作系统哲学家就餐问题课程设计C语言Word下载.docx_第4页
第4页 / 共10页
操作系统哲学家就餐问题课程设计C语言Word下载.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

操作系统哲学家就餐问题课程设计C语言Word下载.docx

《操作系统哲学家就餐问题课程设计C语言Word下载.docx》由会员分享,可在线阅读,更多相关《操作系统哲学家就餐问题课程设计C语言Word下载.docx(10页珍藏版)》请在冰豆网上搜索。

操作系统哲学家就餐问题课程设计C语言Word下载.docx

(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年 月 日

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1