操作系统课程设计哲学家进餐问题.docx
《操作系统课程设计哲学家进餐问题.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计哲学家进餐问题.docx(8页珍藏版)》请在冰豆网上搜索。
操作系统课程设计哲学家进餐问题
操作系统课程设计
课程设计题目:
哲学家进餐问题
姓名:
专业:
班级:
学号:
指导教师:
2014年6月10日
1.设计题目与要求2
1.1实验目的2
1.2初始条件2
2总体设计思想及相关知识3
2.1总体设计思想3
2.2临界区互斥编程原理3
2.3开发环境与工具3
3模块说明3
3.1状态改变模块4
4.部分源程序代码及测试结果6
5.课设总结7
参考文献8
1.设计题目与要求
1.1实验目的
通过实现哲学家进餐问题的同步,深入了解和掌握进程同步和互斥的原理。
用C++进行线程的创建与撤销代码相对来说比较简单,因为封装比较多,我们能做的就是创建与调用。
当然,代码中也有一些复杂的地方,不是对线程的操作,而是关于界面的显示与操作,单个线程容易创建与撤销,但难的是合理的“监控”与组织多个线程并及时进行状态的显示。
虽然用程序语言实现了进程创建(当然,这是在并不会理论的情况下),但还是没弄清理论的实质。
可能理论更抽象些吧。
在平常的编程中,虽然经常遇到过要使用多线程的问题,但没有去试过从操作系统的角度去考虑线程的运行,在以后的学习中,我想还是会深入了解与学习这方面的东西的。
1.2设计要求
哲学家有N个,也定全体到达后开始讨论:
在讨论的间隙哲学家进餐,每人进餐时都需使用刀、叉各一把,所有哲学家刀和叉都拿到后才能进餐。
哲学家的人数、餐桌上的布置自行设定,实现刀和叉的互斥使用算法的程序实现。
(1)操作系统:
windows
(2)程序设计语言:
C++
(3)设定圆桌上有六个哲学家,三对刀叉,如下图摆放:
图1-1哲学家进餐问题设定图
2总体设计思想及相关知识
2.1总体设计思想
哲学家的生活就是思考和吃饭,即思考,就餐,再思考,往复循环。
要求是:
每一个哲学家只有在拿到位于他左右的刀叉后,才能够就餐;哲学家只能先拿一把刀或叉,再去拿另一把刀或叉,而不能同时去抓他旁边的两把餐具,也不能从其他哲学家手中抢夺餐具;哲学家每次就餐后必须放下他手中的两把餐具后恢复思考,不能强抓住餐具不放。
设计一个程序,能够显示当前各哲学家的状态和桌上餐具的使用情况,并能无死锁的推算出下一状态各哲学家的状态和桌上餐具的使用情况。
即设计一个能安排哲学家正常生活的程序。
为哲学家设计3种状态,即“等待”“进餐”“思考”。
每个哲学家重复进行“等待”->“进餐”->“思考”的行动循环。
其中:
“等待”->“进餐”:
只有一个哲学家处于等待进餐状态,且左右手两边的餐具都处于“空闲”状态时,可以发生这种状态改变。
此状态改变发生后,哲学家拿起左右手两边的餐具。
“进餐”->“思考”:
此状态改变发生后,哲学家放下左右手上的餐具。
餐具状态由“使用中”转变为“空闲”。
“思考”->“等待”:
哲学家思考结束后,无条件转入等待状态。
由上所述,程序中应设置6个元素的信号量数组,tools[6],用来保持哲学家之间的同步。
2.2临界区互斥编程原理
不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问。
每个进程中访问临界资源的那段代码称为临界区(CriticalSection)。
每个进程中访问临界资源的那段程序称为临界区(CriticalSection)(临界资源是一次仅允许一个进程使用的共享资源)。
每次只准许一个进程进入临界区,进入后不允许其他进程进入。
不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问。
本程序主要使用了EnterCriticalSection(&cs)和LeaveCriticalSection(&cs)两个函数实现临界区互斥,临界区用EnterCriticalSection(&cs)来进入,LeaveCriticalSection(&cs)用来离开临界区。
2.3开发环境与工具
系统平台:
WINDOW环境
实现语言:
C++
开发工具:
VisualC++6.0
3.模块说明
本人在此次课程设计中,打开visualC++——》新建——》project——》win32consoleapplication建立一个zxm工程。
利用工作区间打开zxm.cpp编译。
Philosopher
-number:
int
-status:
int
+Philosopher(innum:
int)
+find()const:
int
+getinfo()const:
int
+Change():
void
图3-1哲学家类的UML图(该图阐述了zxm.cpp文件的主要结构:
创建一个philosopher类,在philosopher类中定义了status、number整型成员变量。
Philosopher()构造函数,find()、getinfo()、change()成员函数)
图3-3状态改变模块Change()流程图
4.部分源程序代码
部分源代码:
voidPhilosopher:
:
Change()//Philosopher类中change成员函数
{
EnterCriticalSection(&cs)//进入临界区
if(status==1)//正在进餐
{
tools[number%5]=true;//放下左手工具
tools[(number-1)%5]=true;//放下右手工具
status=2;//改变状态为思考
}
elseif(status==2)//思考中
{
status=0;//改变状态为等待
}
elseif(status==0)//等待中
{
if(tools[number%5]&&tools[(number-1)%5])//左右手两边工具均为空闲状态
{
tools[number%5]=false;//拿起左手工具
tools[(number-1)%5]=false;//拿起右手工具
status=1;
}
}
LeaveCriticalSection(&cs)
}
5.测试及结果
图5-1程序运行开始界面
6.课设总结
经过了前后共1周的时间,我们小组三人艰辛的完成了这次课程设计。
由开始的苹果问题到现在所解决的哲学家进餐问题,不仅体现了我的应急能力差,还反映出了对操作系统这门功课理解的不到位,没有真正理解进程和线程的创建与作用,线程的同步与互斥。
通过这次课程设计,我学到了许多课本学到的知识和课本上学不到的问题,体会到了对一个团队来说合作才是最重要的,就算你一个人没日没夜的做也不如大家一起思考一个小时。
聪明的人往往是能很好的利用身边的人和资源。
通过这次设计,我得到了一个很好的理论联系实际的机会,锻炼了通过理论解决实际问题的能力。
正所谓“实践出真知”,有些代码看上去没什么问题,但是实际运行起来就是不出正确结果。
代码内部可能存在逻辑或语法等方面我们平时不会注意到的小问题,通过这次课程设计,我积累了不少这样小问题的解决方法。
有些时候,学习到的知识是次要的,重要的是学习知识的方法。
知识是死的,人事活着的。
死读书就是读死书,作为一个当代大学生,我们应该充实发挥大脑,灵活运用、
参考文献
1.《计算机操作系统》汤子瀛,哲凤屏西安电子科技大学学出版社
2..《操作系统原理与实践教程》周湘贞、曾宪权编,清华大学出版社。
3张丽芬,刘利雄《操作系统实验教程》清华大学出版社
4,《操作系统教程--原理和实例分析》孟静编,高等教育出版社
5.《Windows操作系统核心编程实验教程》,宋晓宇编,中国铁道出版社。
6《操作系统实验教程》,张丽芬、刘利雄、王全玉等编,清华大学出版社。