操作系统课程设计——哲学家进餐问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统课程设计课程设计题目:哲学家进餐问题姓名:
专业:
班级:
学号:
指导教师:
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 临界区互斥编程原理
不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问。每个进程中访问临界资源的那段代码称为临界区(Critical Section)。
每个进程中访问临界资源的那段程序称为临界区(Critical Section)(临界资源是一次仅允许一个进程使用的共享资源)。每次只准许一个进程进入临界区,进入后不允许其他进程进入。不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问。
本程序主要使用了EnterCriticalSection (&cs)和LeaveCriticalSection (&cs)两个函数实现临界区互斥,临界区用EnterCriticalSection (&cs)来进入,LeaveCriticalSection (&cs)用来离开临界区。
2.3开发环境与工具
系统平台:WINDOW环境
实现语言:C++
开发工具:Visual C++6.0
.
3.模块说明
本人在此次课程设计中,打开visual C++——》新建——》project——》win32 console application 建立一个zxm工程。利用工作区间打开zxm.cpp编译。
图3-1 哲学家类的UML图(该图阐述了zxm.cpp文件的主要结构:创建一个philosopher类,在philosopher类中定义了status、number整型成员变量。Philosopher()构造函数,find()、getinfo()、change()成员函数)
.
图3-3 状态改变模块Change()流程图.
4. 部分源程序代码
部分源代码:
void Philosopher::Change() //Philosopher类中change成员函数
{
EnterCriticalSection (&cs) //进入临界区
if(status==1) //正在进餐
{
tools[number%5]=true; //放下左手工具
tools[(number-1)%5]=true; //放下右手工具
status=2; //改变状态为思考
}
else if(status==2) //思考中
{
status=0; //改变状态为等待
}
else if(status==0) //等待中
{
if(tools[number%5]&&tools[(number-1)%5]) //左右手两边工具均为空闲状态{
tools[number%5]=false; //拿起左手工具
tools[(number-1)%5]=false; //拿起右手工具
status=1;
}
.