哲学家吃饭问题实验报告 操作系统

合集下载

操作系统实验报告(哲学家问题)

操作系统实验报告(哲学家问题)

操作系统实验报告实验者:朱毅学号:0701013 实验题目:哲学家问题设有5个哲学家,共享一张放有5把椅子的桌子,每人分得一把椅子。

但是,桌子上总共只有5支筷子,在每人两边分开各放一支。

哲学家们在肚子饥饿时才试图分两次从两边拾起筷子就餐。

条件:(1)只有拿到两支筷子时,哲学家才能吃饭。

(2)如果筷子已在他人手上,则哲学家必须等他人吃完之后才能拿到筷子。

(3)任一哲学家在自己未拿到两支筷子吃饭之前,决不放下自己手中的筷子。

试:(1)描述一个保证不会出现两个邻座同时要求吃饭的通信算法。

(2)描述一个既没有两邻座同时吃饭,又没有人饿死(永远拿不到筷子)的算法。

(3)在什么情况下,5个哲学家全部吃不上饭?开发环境:Microsoft V isual Foxpro 6.0算法描述:数据环境:表KUAIZI 相应字段:筷子号状态(逻辑型)使用者桌号表ZHEXUEJIA相应字段:哲学家名所属状态拥有左筷子(逻辑型)拥有右筷子(逻辑型)桌号表FANGAN 相应字段方案表的具体内容请参见DAIMA.DOC文件本程序解决死锁的关键:从苏格拉底开始往黑格尔依次处理,对每人的处理一次进行到底,从而肯定必然有一人完全占有资源,避免了死锁,其实质就是按照5个哲学家的座位号作为绝对的优先级进行资源的先后分配。

初始状态:选择算法(以下两算法不同之处用黑体标识)算法一:(1)保证不会出现两个邻座同时要求吃饭的通信算法。

1、由操作人员按“有人饿了”按钮,控制是否有哲学家肚子饿了。

2、出现复选框和“确定”按钮,挑选哲学家后,按“确定”后确认选择。

当做出一个选择后,该哲学家左右两边的哲学家则不能被选中(通过对复选框的ENABLED属性控制),若取消选中,则该哲学家左右两边的哲学家(在该哲学家的另一邻居也未被选中为前提) 还原为可选状态。

3、“确认”后执行以下步骤:①从苏格拉底到黑格尔依次检验其是否是此次被选中②若是此次被选中,进行以下步骤:a 改变表KUAIZI 和表ZHEXUEJIA中相应的字段:ZHEXUEJIA:所属状态由F(Full)改为H(Hungry)b执行PROG1,分配给这些饥饿的哲学家筷子,若左边有筷子,取之,并标识“拥有左筷子”;若右边有筷子,取之,并标识“拥有右筷子”。

实验4 哲学家就餐问题的实现

实验4 哲学家就餐问题的实现
• 5个信号量:Sem0, Sem1, Sem2, Sem3, Sem4
• 优先级: Task0>Task1>Task2>Task3>Байду номын сангаасask4
嵌入式操作系统实验
实验4 哲学家就餐问题的实现
什么是哲学家就餐问题 本实验目的 实验内容
void Task (void *pdata) { …… for (;;) { /* 无限循环 */ TASK_Thinking_To_Hungry(i);
OSSemPend(fork[i], 0, &err); OSSemPend(fork[j], 0, &err);
TASK_Eat(i); OSSemPost(fork[j]); OSSemPost(fork[i]); OSTimeDly(200); } }
/* Acquire semaphores to eat */
嵌入式操作系统实验
实验4 哲学家就餐问题的实现
什么是哲学家就餐问题 本实验设计
互斥问题
嵌入式操作系统实验
实验4 哲学家就餐问题的实现
什么是哲学家就餐问题 本实验目的
目的
通过经典的哲学家就餐实验,了解如何利用信号量对 共享资源进行互斥访问。
• 5个任务:Task0、Task1、 Task2、 Task3、 Task4
/* Release semaphore /* Delay 100 clock tick
*/ */
嵌入式操作系统实验
实验4

哲学家就餐问题的实现
什么是哲学家就餐问题 本实验目的 实验内容 实验要求
实验要求
1. 调试代码,运行结果截图 2. 将p51的OSSemPost(fork[j]); OSSemPost(fork[i]); 顺序改变下,运行结果有变化?

操作系统哲学家进餐问题

操作系统哲学家进餐问题

操作系统实习报告一、设计目的:死锁是进程并发执行过程中可能出现的现象,所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局。

哲学家就餐问题是描述死锁的经典例子。

为了防止死锁,可以采用资源预分配法或者资源按序分配法。

资源预分配法是指进程在运行前一次性地向系统申请它所需要的全部资源,如果系统当前不能够满足进程的全部资源请求,则不分配资源, 此进程暂不投入运行,如果系统当前能够满足进程的全部资源请求, 则一次性地将所申请的资源全部分配给申请进程。

二、设计内容哲学家进餐问题的模拟。

三、开发环境windows环境,Myeclipse平台。

四、分析设计<一>实验原理哲学家进餐问题描述的是五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五只碗和五只筷子。

他们的生活方式是交替地进行思考和进餐。

平时,一个哲学家进行思考,饥饿时便试图取用其左右的最靠近他的筷子,只有在他拿到两只筷子时才能进餐。

进餐完毕放下筷子继续思考。

由于:①只有拿到两只筷子时,哲学家才能吃饭;②如果筷子已经在他人手上,则该哲学家必须等到他人吃完之后才能拿到筷子;③任何一个哲学家在自己没有拿到两只筷子吃饭之前,决不放下自己手中的筷子。

则可能出现五个哲学家都饥饿时都拿着一直筷子。

这样就可能五个哲学家都用不上餐。

该问题可用记录型信号量解决,经分析可知,放在桌子上的筷子是临界资源,在一段时间内只允许一位哲学家使用,为了实现对筷子的互斥使用,可以用一个信号量表示一只筷子,由这五个信号量组成信号量数组。

当哲学家饥饿时总是先拿其左边的筷子,成功后,再去拿右边的筷子,又成功后方可就餐。

进餐完,又先放下他左边的筷子,再放下右边筷子。

这个算法可以保证不会有两个相邻的哲学家同时就餐,但有可能引起死锁。

对于死锁问题可采取这样的几种解决方法:(1)至多只允许四个哲学家同时进餐,以保证至少有一个哲学家可以进餐,最终总会释放出他所用过的两只筷子,从而可使更多的哲学家进餐;(2)仅当左右两只筷子均可用时,才允许哲学家拿起筷子就餐(3)规定奇数号哲学家先拿起右边筷子,然后再去拿左边筷子,而偶数号哲学家则相反。

操作系统哲学家问题实验报告

操作系统哲学家问题实验报告

实验报告三实验名称:一、调试验证“有限缓冲”经典同步问题二、利用Java同步解决“哲学家进餐”问题日期:2015-11-5 班级:13级计科学号:姓名:一、实验目的1.了解信号量的使用2.掌握正确使用同步机制的方法3.实现生产者消费者进程的互斥与同步4.实现java同步解决“哲学家进餐”问题二、实验内容1.调试验证“有限缓冲”经典同步问题2.利用Java同步解决“哲学家进餐”问题三、项目要求与分析1.“有限缓冲”经典同步问题(1)问题描述有一群生产者进程在生产产品,此产品提供给消费者去消费。

为使生产者和消费者进程能并发执行,在它们之间设置一个具有n个缓冲池,生产者进程可将它所生产的产品放入一个缓冲池中,消费者进程可从一个缓冲区取得一个产品消费。

(2)问题分析设两个同步信号量:一个说明空缓冲区的数目,用empty表示,初值为有界缓冲区的大小N,另一个说明已用缓冲区的数目,用full表示,初值为0。

由于在执行生产活动和消费活动中要对有界缓冲区进行操作。

有界缓冲区是一个临界资源,必须互斥使用,所以另外还需要设置一个互斥信号量mutex,其初值为1。

2.“哲学家进餐”问题(1)问题描述假如所有的哲学家都同时拿起左侧筷子,看到右侧筷子不可用,又都放下左侧筷子,等一会儿,又同时拿起左侧筷子,如此这般,永远重复。

对于这种情况,即所有的程序都在无限制地运行,但是都无法得到任何进展,即出现饿死,所有的哲学家都吃不上饭。

规定在拿起左侧的筷子后,先检查右面的筷子是否可用。

如果不可用,则放下左侧的筷子,等一段时间后再重复整个过程。

(2)问题分析当出现以下情形,在某一瞬间,所有的哲学家都同时启用这个算法,拿起左侧的筷子,而看到右侧筷子都不可用,又都放下左侧筷子,等一会儿,又同时拿起左侧筷子……如此永远重复下去。

对于这种情况,所有的程序都在运行,但却都无法取得进展,即出现饿死,所有的哲学家都吃不上饭。

解决死锁问题:为了避免死锁,把哲学家分为三种状态:思考,饥饿(等待),进食,并且一次拿起两只筷子,否则不拿。

哲学家进餐问题(操作系统)

哲学家进餐问题(操作系统)

哲学家进餐问题(操作系统)哲学家进餐问题(操作系统)1. 引言文档概述:在操作系统领域,哲学家进餐问题是一个经典的并发控制问题。

该问题模拟了五位哲学家围坐在一张圆桌旁,每个哲学家面前放置着一碗面和一只叉子。

哲学家在思考和进餐之间切换,但是他们必须分享叉子来进行进餐。

然而,如果每个哲学家都同时拿起右边的叉子,就会出现死锁的情况。

因此,设计一个合理的算法来解决这个问题是非常重要的。

2. 问题描述2.1 哲学家和叉子在该问题中,有五位哲学家分别编号为 P1、P2、P3、P4、P5,以及五只叉子,编号为 F1、F2、F3、F4、F5.每个哲学家在思考时不会使用叉子,而在进餐时需要使用相邻两只叉子。

2.2 运行过程哲学家的运行过程根据以下步骤进行:- 当一个哲学家饿了后,他会尝试获取左边和右边的叉子。

- 如果两只叉子都可用,哲学家就会进餐,并在完成后释放叉子。

- 否则,哲学家需要等待其他哲学家释放叉子。

3. 解决方案为了解决哲学家进餐问题,我们可以采用以下方法之一:3.1 资源分级分配算法该算法将叉子分为左叉子和右叉子,每个哲学家只能同时拿起左叉子和右叉子。

通过约定哲学家只能按照一定顺序拿起叉子,可以避免死锁的发生。

3.2 资源分级分配算法的伪代码:```acquire_forks(left_fork_id, right_fork_id) {if (left_fork_id < right_fork_id) {acquire(left_fork_id);acquire(right_fork_id);} else {acquire(right_fork_id);acquire(left_fork_id);}}release_forks(left_fork_id, right_fork_id) { release(left_fork_id);release(right_fork_id);}philosopher(id) {while (true) {think();acquire_forks(id, (id + 1) % 5);eat();release_forks(id, (id + 1) % 5);}}```4. 附件本文档不涉及附件。

哲学家就餐-操作系统

哲学家就餐-操作系统

衡阳师范学院操作系统课程设计报告题目哲学家就餐问题学生姓名文润学号 ******** 专业班级计算机科学与技术1402班指导教师王玉奇完成时间 2016.11.29目录一、设计要求 (2)实验目的: (2)设计要求: (2)二、运行环境 (2)三、设计思想及流程 (2)设计思想: (2)流程图: (4)主要数据结构: (5)四、运行结果 (5)五、设计心得 (6)六、参考资料 (6)七、程序清单 (7)一、设计要求1.实验目的:通过实现哲学家就餐问题的互步,深入了解和掌握进程互斥的原理。

2.设计要求:哲学家有N个,规定全体到齐后开始讨论,在讨论的间隙哲学家就餐,每人进餐时都需使用刀、叉合一把,所有哲学家刀和叉都拿到后猜能进餐。

哲学家的人数、餐桌上的布置自行设定,实现刀和叉的互斥使用算法的程序实现。

二、运行环境操作系统:Windows系统编程语言:Java语言编译软件:Eclipse三、设计思想及流程1.设计思想:对问题分析可知,目前问题的瓶颈在于:死锁。

死锁的发生必须满足以下四个必要条件:①互斥:至少有一个资源每次只能被一个进程使用,即非共享模式。

这里指每只刀叉只能被一个哲学家持有。

②占有并等待。

一个进程因请求资源而阻塞时,对已获得的资源保持不放。

③不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。

这里指哲学家不能去抢别人的刀叉。

④循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

在系统设计、进程调度等方面注意避免让这四个必要条件成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。

此外,也要防止进程在处于等待状态的情况下占用资源。

经分析可知,放在桌子上的刀叉是临界资源,在一段时间内只允许一位哲学家使用,为了实现对刀叉的互斥使用,可以用一个信号量表示一只刀叉,由这N 个信号量组成信号量数组。

计算机系统实验报告(哲学家就餐死锁)

计算机系统实验报告(哲学家就餐死锁)

目录第一章总体设计 (3)1.程序结构设计第一章总体设计 (3)2. 程序设计组成框图………………………………………………………….错误!未定义书签。

3. 流程图……………………………………………………………………………错误!未定义书签。

第二章详细设计………………………………………………………………………………….错误!未定义书签。

1.功能说明 (5)2. 函数功能 (6)3.入口及出口参数说明 (6)4.函数调用关系描述 (7)第三章调试与测试 (8)第四章关键原程序清单和执行结果……………………………错误!未定义书签。

1.源程序…………………………………………………………………………….错误!未定义书签。

2.运行结果 (9)第五章参考资料 (9)第一章总体设计1. 程序结构设计程序需要六个线程,主线程用于显示主菜单,接收用户的功能选择;五个哲学家线程用于模拟哲学家的活动,即不停地思考、饥饿、进食。

相邻的两个哲学家线程需要共享他们中间的同一根筷子,因此对每一根筷子的使用要互斥,用互斥体数组h_mutex_chopsticks来实现。

主线程创建五个哲学家线程后要等待所有哲学家结束,用线程句柄数组h_thread来表示五个线程,主线程通过等待这五个线程句柄来实现同步。

该程序共有7个函数,这些函数可以分成4组。

各组包含的函数及其功能如图3-1所示。

2.程序设计组成框图3.流程图第二章详细设计1.功能说明系统通过简单的控制台界面,运行后在屏幕上显示功能菜单,列出该程序具有的功能,供用户选择,用户选择功能后应该转到相应的处理程序。

程序应该包括以下功能:(1)演示死锁现象;(2)通过资源按序分配法防止死锁;(3)通过资源预分配法防止死锁;(4)退出。

1.功能说明(1)演示死锁现象:演示死锁情况的哲学家线程函数,每个哲学家都得到了左边的筷子,又都在等待右边的筷子(2)通过资源按序分配法防止死锁:每个哲学家先申请左右两根筷子中编号小的筷子,再申请编号大的筷子。

操作系统实验报告哲学家就餐

操作系统实验报告哲学家就餐

操作系统实验报告哲学家就餐一、实验目的:通过模拟哲学家就餐问题,了解并掌握操作系统中的进程同步机制,以及解决进程间资源竞争所引发的死锁问题。

二、实验介绍:哲学家就餐问题是由荷兰计算机科学家伊克斯特拉(Dijkstra)于1965年首次提出的。

其问题描述如下:五位哲学家坐在一张圆桌子周围,每个哲学家面前有一碗饭和一根筷子。

哲学家的生活方式是交替地进行思考和进食。

当一个哲学家思考时,他不需要使用他的两个筷子;当一个哲学家想吃饭时,他需要同时获取他的左右两个筷子,并在获取到筷子后才能开始进食。

问题的关键是如何解决哲学家间的筷子竞争问题,以及避免死锁的发生。

三、实验设计:1.并发思路每个哲学家作为一个进程,在进行思考和进食这两个操作之前,需要获取他的两个筷子。

接下来考虑进程同步的两个关键点:-互斥:保证每个筷子同时只能被一个哲学家使用,避免资源竞争问题。

-死锁避免:通过限制只允许至多四位哲学家同时持有筷子,从而避免死锁发生。

2.进程同步机制- 互斥:使用Semaphore实现互斥,每个筷子都是一个Semaphore,初始值为1-死锁避免:引入一个全局计数器,记录当前持有筷子的哲学家数量,每次哲学家想要获取筷子时,先检查该计数器,仅当计数器小于4时才会获取筷子。

四、实验步骤:1.创建5个哲学家进程和5个筷子线程。

2.每个哲学家的线程循环执行思考和进食操作。

3.在进食之前,哲学家需要获取两个筷子,获取筷子的顺序按照哲学家编号进行,每个哲学家先获取自己的左边筷子,再获取自己的右边筷子。

4.进行进食操作后,哲学家释放两个筷子。

5.循环执行步骤3和步骤4,直到实验结束。

五、实验结果:通过观察实验结果,可以看到哲学家的思考和进食操作交替进行,并且避免了死锁的发生。

六、实验总结:通过本次实验,我了解了操作系统中的进程同步机制,并学会了如何解决资源竞争和死锁问题。

在本实验中,我使用了Semaphore和全局计数器实现了互斥和死锁避免,从而成功模拟了哲学家就餐问题。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录1.设计题目与要求 (2)
设计目的
设计要求
2.总体设计思想与相关知识 (2)
总体设计思想
问题描述
解决方案
3.数据结构、流程图 (2)
数据结构
流程图
4.源代码 (3)
5.运行结果 (6)
6.结果分析 (7)
7.总结及心得体会 (7)
1.设计题目与要求
设计目的
掌握进程同步问题的解决思路及方法,熟练使用Windows操作系统提供的信号量机制解决各种进程同步问题。

设计要求
设有五个哲学家,共用一张放有五把椅子的餐桌,每人坐在一把椅子上,桌子上
有五个碗和五只筷子,每人两边各放一只筷子。

哲学家们是交替思考和进餐,饥饿时便试图取其左右最靠近他的筷子。

条件:
(1) 只有拿到两只筷子时,哲学家才能吃饭。

(2) 如果筷子已被别人拿走,则必须等别人吃完之后才能拿到筷子。

(3) 任意一个哲学家在自己未拿到两只筷子吃饭前,不会放下手中拿到的筷子。

2.总体设计思想与相关知识
总体设计思想
哲学家的生活就是思考和吃饭,即思考,饿了就餐,再思考,循环往复。

要求是:每一个哲学家只有在拿到位于他左右的筷子后,才能够就餐;哲学家只能先拿左边的筷子,再去拿右边的筷子,而不能同时去抓他两边的筷子,也不能从其他哲学家手中抢夺筷子;哲学家每次就餐后必须放下他手中的两把筷子后恢复思考,不能强抓住餐具不放。

设计一个程序,能够显示当前各哲学家的状态和桌上餐具的使用情况,并能无死锁的推算出下一状态各哲学家的状态和桌上餐具的使用情况。

即设计一个能安排哲学家正常生活的程序。

问题描述
可能出现死锁问题,因为当五个哲学家都饥饿时,都拿着一支筷子,这样就可能五个哲学家都用不上餐。

解决方案
最多允许4个哲学家同时坐在桌子周围。

给所有哲学家编号,奇数号的哲学家必须首先拿左边的筷子,偶数号的哲学家则反之。

为了避免死锁,把哲学家分为三种状态,思考,饥饿,进食,仅当一个哲学家左右两边的筷子都可用时,才允许他拿筷子,并且一次拿到两只筷子,否则不拿。

3.数据结构及流程图
程序中定义一个哲学家类,包含两个私有对象和四个公有对象。

myid对象:报讯哲学家的编号。

mystate对象:用于保存当前该哲学家的状态,
philosopherProc( LPVOID lpParameter)方法:哲学家类构造函数,PHILOSOPHER_NUM表示哲学家编号
ResumeThread(hPhilosopher[i])方法:返回该哲学家编号
strcpy(stateStr, "")方法:返回哲学家当前状态
根据题目要求改变哲学家的状态(饥饿->进餐->思考->饥饿…………)
流程图
4.源代码(c++)
...." << endl;
ReleaseMutex(mutex);
mystate = THINKING; //初始状态为THINKING
leftFork = (myid) % PHILOSOPHER_NUM;
rightFork = (myid + 1) % PHILOSOPHER_NUM;
while (true)
{
switch(mystate)
{
case THINKING:
mystate = HUNGRY; // 改变状态
strcpy(stateStr, "HUNGRY");
break;
case HUNGRY:
strcpy(stateStr, "HUNGRY");
ret = WaitForSingleObject(semaphore[leftFork], 0); // 先检查左筷子是否可用
if (ret == WAIT_OBJECT_0)
{
ret = WaitForSingleObject(semaphore[rightFork], 0); //左筷子可用就拿起,再检查右筷子是否可用
if (ret == WAIT_OBJECT_0)
{
mystate = DINING; // 右筷子可用,就改变自己的状态
strcpy(stateStr, "DINING");
}
else
{
ReleaseSemaphore(semaphore[leftFork], 1, NULL); // 如果右筷子不可用,就把左筷子放下
}
}
break;
case DINING:
// 吃完后把两支筷子都放下
ReleaseSemaphore(semaphore[leftFork], 1, NULL);
ReleaseSemaphore(semaphore[rightFork], 1, NULL);
mystate = THINKING; // 改变自己的状态
strcpy(stateStr, "THINKING");
break;
}
// 输出状态
WaitForSingleObject(mutex, INFINITE);
cout << "philosopher " << myid << " is : " << stateStr << endl;
ReleaseMutex(mutex);
// sleep a random time : between 1 - 5 s
int sleepTime;
sleepTime = 1 + (int)*rand()/(RAND_MAX+);
Sleep(sleepTime*10);
}
}
int main()
{
int i;
srand(time(0));
mutex = CreateMutex(NULL, false, NULL);
for (i=0; i<PHILOSOPHER_NUM; i++)
{
semaphore[i] = CreateSemaphore(NULL, 1, 1, NULL);
hPhilosopher[i]=CreateThread(NULL,0,philosopherProc,LPVOID(i), CREATE_SUSPENDED,0);
}
for (i=0; i<PHILOSOPHER_NUM; i++)
ResumeThread(hPhilosopher[i]);
Sleep(2000);
return 0;
}
5.运行结果
6.结果分析
对哲学家进行编号,将他们的初始状态全部设定为THINGKING,接着先从0开始改变他们的状态为HUNGRY,继续运行后4号和2号哲学家先DINING,3号和1号哲学家为HUNGRY,当4号哲学家吃完后,0号哲学家就开始DINING。

7.总结及心得体会
这次操作系统的作业让我深刻的体会到操作系统的知识作用。

培养我综合运用知识的能力,结合了c++的知识来解决这个问题。

巩固了以前的知识。

在设计这个程序的时候我遇到了很多困难,但是通过老师和同学们的帮助,我一一解决掉了。

而且发现了我很多学习中的不足之处,对以前学习的知识认识不够深刻,掌握的不够,这个要好好复习一下。

总的来说,这个操作系统的作业带给我很多收获,让我受益匪浅。

附件:。

相关文档
最新文档