《用多线程同步方法解决哲学家就餐问题报告》由会员分享,可在线阅读,更多相关《用多线程同步方法解决哲学家就餐问题报告(13页珍藏版)》请在金锄头文库上搜索。
1、课 程 设 计 报 告 书课程名称: 计算机操作系统 题 目: 用多线程同步方法解决哲学家就餐问题 系 名:专业班级:姓 名:学 号:指导教师: 2016 年 6 月 24 日武汉华夏理工学院信息工程系课 程 设 计 任 务 书课程名称: 操作系统原理课程设计 指导教师: 班级名称: 开课系、教研室: 自动化与计算机 一、课程设计目的与任务操作系统课程设计是操作系统原理课程的后续实践课程,旨在通过一周的实践训练,加深学生对理论课程中操作系统概念,原理和方法的理解,加强学生综合运用操作系统原理、Linux 系统、C 语言程序设计技术进行实际问题处理的能力,进一步提高学生进行分析问题和解决问题的能
2、力,包含系统分析、系统设计、系统实现和系统测试的能力。学生将在指导老师的指导下,完成从需求分析,系统设计,编码到测试的全过程。二、课程设计的内容与基本要求1、课程设计题目用多线程同步方法解决哲学家就餐问题2、课程设计内容本课程设计要求在 Linux 操作系统,GCC 编译环境下开发。用 c/c+语言在 Linux 操作系统环境下,通过研究 Linux 的线程机制和信号量实现哲学家就餐问题的并发控制。为避免死锁,可采用只许 4 个哲学家入席且桌上有 5 支筷子的办法。几把椅子可用连续存储单元。1 每个哲学家取得一双筷子开始用餐后,即时显示“Dining”和该哲学家的标识符以及餐桌上有几位哲学家及
3、其所坐的位置。2 设定共有 10 个哲学家需用餐。每位用餐耗时 10 秒钟以上。3 多个哲学家须共享操作函数代码。提示:1 有界缓冲区/连续存储区可用数组实现。2 编译命令可用:gcc -lpthread -o 目标文件名源文件名3 多线程编程方法参见电子文档。3、设计报告撰写格式要求:1 设计题目与要求 2 设计思想3 系统结构 4 数据结构的说明和模块的算法流程图5 使用说明书(即用户手册):内容包含如何登录、退出、读、写等操作说明6 运行结果和结果分析(其中包括实验的检查结果、程序的运行情况)7 自我评价与总结8 附录:程序清单,注意加注释(包括关键字、方法、变量等),在每个模块前加注释
4、;三、课程设计步骤及时间进度和场地安排本课程设计将安排在第 18 周, 现代教育技术中心。具体安排如下:时间 设计内容第一天 下发任务书,学生查阅资料第二天 系统设计和原型开发第三天- 第四天 系统功能实现、系统调试、测试、打包和验收第五天 整理报告课程设计集中时间安排:周次星期一 星期二 星期三 星期四第 18 周 第 1-2 节 第 3-4 节 第 3-4 节 第 3-6 节地点 现教 现教 现教 现教四、课程设计考核及评分标准课程设计考核将综合考虑学生的系统设计方案、运行结果、课程设计报告书的质量、态度、考勤、答辩情况等各因素。具体评分标准如下:(1)设计方案正确,具有可行性、创新性;
5、30 分(2)系统开发效果较好; 20 分(3)设计报告规范、课程设计报告质量高、参考文献充分 20 分(4)课程设计答辩时,问题回答正确; 20 分(5)态度认真、刻苦钻研、遵守纪律; 10 分按上述五项分别记分后求和,总分按五级制记载最后成绩。优秀(10090 分) ,良好(8089 分) ,中等(7079 分) ,及格(6069 分),不及格(059 分)0一、设计题目:用多线程同步方法解决哲学家就餐问题二、设计思想:1、为每个哲学家产生一个线程,设计正确的同步算法2、每个哲学家取得一双筷子开始用餐后,即时显示“Dining”和该哲学家的自定义标识符以及餐桌上所有几位哲学家标识符及其所坐
6、的位置。3、设定共有 10 个哲学家需用餐。每位用餐耗时 10 秒钟以上。4、多个哲学家须共享操作函数代码。三、系统结构开始设置哲学家是否有座位? 等待坐座位左边是否有筷子?等待拿起左边的筷子右边是否有筷子?拿起右边的筷子哲学家吃饭,吃完了离开座位,一边画圈圈结束等待YYYNNN1四、主要数据结构的说明和模块的算法流程图:1、创建函数 pthread_create 声明如下:#include Int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void*(*start_routine) (void *), void
7、 *arg); 2、等待其它线程结束函数 pthread_join 声明如下:#include int pthread_join(pthread_t thread, void *retval);3、信号量的数据类型为结构 sem_t,它本质上是一个长整型的数。初始化信号量函数 sem_init 声明如下: #include sem_init (sem_t *sem, int pshared, unsigned int value);4、增加信号量值函数 sem_post 声明如下:#include int sem_post(sem_t *sem);5、减少信号量值函数 sem_wait 声明如
8、下#include int sem_wait(sem_t * sem);主要数据结构声明:1、#define NUMBERS 10 /将哲学家人数 NUMBERS 定义为 102、sem_t chopsticsNUMBERS /定义 5 只筷子的互斥信号量 chopstics3、sem_t room /定义避免死锁的同步信号量 room线程共享函数伪代码:void *Share(int i)think();p(room); /请求入席进餐 p(chopsticksetnumber); /请求左手边的筷子 p(chopsticksetnumber+1); /请求右手边的筷子eat();v (ch
9、opsticksetnumber); /释放左手边的筷子v(chopsticksetnumber+1); /释放右手边的筷子 v(room); /退出席位释放信号量 chairs 2五、使用说明:打开虚拟机,进入 linux 系统。应用程序 终端输入 gcc lpthread o a.a.c编码成功后,输入 ./a ,得到所需结果。六、运行结果和结果分析: 如图 1、2 所示:图 13图 2syhlocalhost $ gcc -lpthread -o a a.csyhlocalhost $ ./a哲学家 1 坐上了位置 1哲学家 1 拿到左侧筷子 1哲学家 1 拿到右侧筷子 2哲学家 1 坐
10、在 1 椅子上吃饭dining*哲学家 1 坐在椅子 1 上哲学家 2 坐上了位置 2哲学家 3 坐上了位置 3哲学家 3 拿到左侧筷子 3哲学家 3 拿到右侧筷子 4哲学家 3 坐在 3 椅子上吃饭dining*哲学家 1 坐在椅子 1 上哲学家 2 坐在椅子 2 上哲学家 3 坐在椅子 3 上哲学家 4 坐上了位置 4哲学家 1 吃饱了放下筷子 1 和 2哲学家 1 离开了位置 1 走到一边画圈圈哲学家 3 吃饱了放下筷子 3 和 4哲学家 3 离开了位置 3 走到一边画圈圈哲学家 2 拿到左侧筷子 2哲学家 2 拿到右侧筷子 3哲学家 2 坐在 2 椅子上吃饭4dining*哲学家 2
11、坐在椅子 2 上哲学家 5 坐上了位置 1哲学家 5 拿到左侧筷子 1哲学家 4 拿到左侧筷子 4哲学家 4 拿到右侧筷子 5哲学家 4 坐在 4 椅子上吃饭dining*哲学家 5 坐在椅子 1 上哲学家 2 坐在椅子 2 上哲学家 2 吃饱了放下筷子 2 和 3哲学家 4 吃饱了放下筷子 4 和 5哲学家 4 离开了位置 4 走到一边画圈圈哲学家 5 拿到右侧筷子 2哲学家 5 坐在 1 椅子上吃饭dining*哲学家 5 坐在椅子 1 上哲学家 2 坐在椅子 2 上哲学家 6 坐上了位置 3哲学家 6 拿到左侧筷子 3哲学家 6 拿到右侧筷子 4哲学家 6 坐在 3 椅子上吃饭dinin
12、g*哲学家 5 坐在椅子 1 上5哲学家 2 坐在椅子 2 上哲学家 6 坐在椅子 3 上哲学家 2 离开了位置 2 走到一边画圈圈哲学家 8 坐上了位置 2哲学家 9 坐上了位置 4哲学家 5 吃饱了放下筷子 1 和 2哲学家 5 离开了位置 1 走到一边画圈圈哲学家 6 吃饱了放下筷子 3 和 4哲学家 6 离开了位置 3 走到一边画圈圈哲学家 8 拿到左侧筷子 2哲学家 8 拿到右侧筷子 3哲学家 8 坐在 2 椅子上吃饭dining*哲学家 8 坐在椅子 2 上哲学家 7 坐上了位置 1哲学家 7 拿到左侧筷子 1哲学家 9 拿到左侧筷子 4哲学家 9 拿到右侧筷子 5哲学家 9 坐在
13、 4 椅子上吃饭dining*哲学家 7 坐在椅子 1 上哲学家 8 坐在椅子 2 上哲学家 8 吃饱了放下筷子 2 和 36哲学家 7 拿到右侧筷子 2哲学家 7 坐在 1 椅子上吃饭dining*哲学家 7 坐在椅子 1 上哲学家 8 坐在椅子 2 上哲学家 9 吃饱了放下筷子 4 和 5哲学家 9 离开了位置 4 走到一边画圈圈哲学家 8 离开了位置 2 走到一边画圈圈哲学家 10 坐上了位置 3哲学家 10 拿到左侧筷子 3哲学家 10 拿到右侧筷子 4哲学家 10 坐在 3 椅子上吃饭dining*哲学家 7 坐在椅子 1 上哲学家 10 坐在椅子 3 上哲学家 7 吃饱了放下筷子
14、1 和 2哲学家 7 离开了位置 1 走到一边画圈圈哲学家 10 吃饱了放下筷子 3 和 4哲学家 10 离开了位置 3 走到一边画圈圈七、测试过程及结果分析:各个哲学家(线程)完全独立自主运作,达到了预期的目标,拿筷子自 然无冲突,吃饭也能正常运行,全程序没有一个哲学家饿死(线程不执行) ,或者是有哲学家在座位上却吃不到饭(死锁)的问题。所有的哲学家都可以去画圈圈。八、 心得体会: 虽然这次课程设计用了一星期,但是通过查阅资料,还是有了很大的收获, ,使我对操作系统的基本知识有了进一步的提高,并在实践中对7各种概念有了进一步的深化。初看别人的编程,根本就不知道写的是什么。只知道不停的运行,却一直得不到结果,坐着干着急。后来,慢慢地从一点一滴的学习中,能够将程序读懂了,这就是最大的进步。通过这次课程设计,我确实学到了很多东西,这些学到的东西可以使我受益终生。除了知识技术上的东西,我更锻炼了自己的快速学习能力。总的来说,这次的课程设计的收获比较大,对 LINUX 的运用以及编程都更进了一步。一个看似小程序,却包含了很多辛劳,没有扎实的理论基础和熟练地操