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

操作系统实验报告实验者:朱毅学号: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,分配给这些饥饿的哲学家筷子,若左边有筷子,取之,并标识“拥有左筷子”;若右边有筷子,取之,并标识“拥有右筷子”。
操作系统课程设计——哲学家进餐问题

操作系统课程设计——哲学家进餐问题1000字哲学家进餐问题是一个经典的多线程同步问题,在操作系统中有着广泛的应用。
因此,在操作系统课程设计中,探究哲学家进餐问题是一件非常有意义的事情。
哲学家进餐问题的场景是:五个哲学家围坐在一张圆桌前,每个哲学家的左右两侧有一只筷子,他们需要利用这两只筷子才能进餐。
每个哲学家有两种状态:思考和进餐。
当一个哲学家处于进餐状态时,他需要同时获取他左右两侧的筷子,进餐结束后,他会释放这两只筷子,进入思考状态。
在这个场景中,如果所有的哲学家都同时想要进餐,那么就可能会出现死锁情况,即所有的哲学家都拿到了左手边的筷子,但都无法拿到右手边的筷子,导致无法进餐。
因此,需要在代码中实现同步互斥机制,避免死锁的发生。
本课程设计中,我使用了Java语言来实现哲学家进餐问题。
在代码实现中,首先定义了哲学家、筷子、餐桌等对象,然后使用线程来模拟哲学家的思考和进餐过程。
为了避免死锁,我使用了Chandy/Misra算法,即每个哲学家先尝试去取左手边的筷子,如果取不到就不再继续等待,而是重新回到思考状态,等待下一个机会。
同时,当一个哲学家取到了左手边的筷子之后,如果发现右手边的筷子已被占用,他就会释放左手边的筷子,重新回到思考状态,等待下一个机会。
在实现过程中,我还使用了信号量机制,保证了线程间的同步互斥。
每个筷子都是一个二元信号量,初始为1,表示可用。
当一个哲学家拿起筷子时,他会将对应的信号量减1,表示不可用。
当哲学家用完筷子之后,会将对应的信号量加1,表示可用。
通过这种方式,实现了对筷子的访问同步。
最后,我对代码进行了测试,模拟了多位哲学家同时进行进餐的过程。
在测试中,我发现哲学家进餐的速度受到筷子的数量和哲学家思考进餐比例的影响。
当筷子数量少于哲学家数量时,容易出现死锁;当哲学家思考和进餐的时间相当时,程序的运行情况比较稳定。
总的来说,本课程设计实现了哲学家进餐问题,通过学习该问题,我更深入地理解了同步互斥机制的重要性,并学会了如何使用信号量来实现同步互斥。
哲学家进餐问题(操作系统)

哲学家进餐问题(操作系统)哲学家进餐问题(操作系统)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. 附件本文档不涉及附件。
哲学家吃饭问题试验报告操作系统

目录1.设计题目与要求21.1设计目的1.2设计要求2.总体设计思想与相关知识22.1总体设计思想2.2问题描述2.3解决方案3.数据结构、流程图23.1数据结构3.2流程图4.源代码.35.运行结果.66.结果分析.77.总结及心得体会.71.设计题目与要求1.1设计目的掌握进程同步问题的解决思路及方法,熟练使用Windows操作系统提供的信号量机制解决各种进程同步问题.1.2设计要求设有五个哲学家,共用一张放有五把椅子的餐桌,每人坐在一把椅子上,桌子上有五个碗和五只筷子,每人两边各放一只筷子.哲学家们是交替思考和进餐,饥饿时便试图取其左右最靠近他的筷子.条件:(1)只有拿到两只筷子时,哲学家才能吃饭.(2)如果筷子已被别人拿走,那么必须等别人吃完之后才能拿到筷子.(3)任意一个哲学家在自己未拿到两只筷子吃饭前,不会放下手中拿到的筷子.2.总体设计思想与相关知识2.1总体设计思想哲学家的生活就是思考和吃饭,即思考,饿了就餐,再思考,循环往复.要求是:每一个哲学家只有在拿到位于他左右的筷子后,才能够就餐;哲学家只能先拿左边的筷子,再去拿右边的筷子,而不能同时去抓他两边的筷子,也不能从其他哲学家手中抢夺筷子;哲学家每次就餐后必须放下他手中的两把筷子后恢复思考,不能强抓住餐具不放.设计一个程序,能够显示当前各哲学家的状态和桌上餐具的使用情况,并能无死锁的推算出下一状态各哲学家的状态和桌上餐具的使用情况.即设计一个能安排哲学家正常生活的程序.2.2问题描述可能出现死锁问题,由于当五个哲学家都饥饿时,都拿着一支筷子,这样就可能五个哲学家都用不上餐.2.3解决方案2.3.1最多允许4个哲学家同时坐在桌子周围.2.3.2给所有哲学家编号,奇数号的哲学家必须首先拿左边的筷子,偶数号的哲学家那么反之.2.3.3为了防止死锁,把哲学家分为三种状态,思考,饥饿,进食,仅当一个哲学家左右两边的筷子都可用时,才允许他拿筷子,并且一次拿到两只筷子,否那么不拿.3.数据结构及流程图3.1数〞结构philosopherProc+myid:int+mystate:int+philosopherProc(LPVOIDlpParameter)+ResumeThread(hPhilosopher[i]):int +strcpy(stateStr, ""):int程序中定义一个哲学家类,包含两个私有对象和四个公有对象.myid对象:报讯哲学家的编号.mystate对象:用于保存当前该哲学家的状态,philosopherProc( LPVOID lpParameter) 方法:哲学家类构造函数,PHILOSOPHER_NUM表示哲学家编号ResumeThread(hPhilosopher[i]) 方法:返回该哲学家编号strcpy(stateStr,"") 方法:返回哲学家当前状态根据题目要求改变哲学家的状态(饥饿 ,进餐,思考,饥饿)3.2流程图的一个概念.指的是一个核心对象在某一个进程中的唯一索引*/HANDLE semaphore[PHILOSOPHER_NUM]; // semaphore 用来表示筷子是否可用4. 源代码〔c++〕//哲学家就餐问题的解法 #include <windows.h> #include <process.h> #include <time.h> #include <stdlib.h> #include <stdio.h> #include <iostream> using namespace std;有效//命名空间std 内定义的所有标识符都 const unsigned int PHILOSOPHER_NUM=5; //const char THINKING=1;表示得到饥饿,3表示正在吃饭*/ const char HUNGRY=2; const char DINING=3; HANDLE hPhilosopher[5];/*///*HANDLE 〔 哲学家数目标记当前哲学家的状态,1表示等待,2定义数组存放哲学家句柄〕是windows 操作系统中DWORD WINAPI philosopherProc( LPVOID IpParameter) // 据)的API函数philosopherProc {int myid;char idStr[128];char stateStr[128];char mystate;int ret;unsigned int leftFork;//左筷子unsigned int rightFork;//右筷子myid = int(lpParameter);itoa(myid, idStr, 10);WaitForSingleObject(mutex, INFINITE);cout << "philosopher " << myid << " begin" << endl;ReleaseMutex(mutex);mystate = THINKING;//THINKINGHANDLE mutex;// Mutex 用来限制平安输出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); // 用,就把左筷子放下改变状态先检查左筷子是否左筷子可用就拿起,右筷子可用,就改如果右筷子不可返回DWORD32位数初始状态为)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 sint sleepTime;sleepTime = 1 + (int)(5.0*rand()/(RAND_MAX+1.0));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号哲学家就开始DINING7.总结及心得体会这次操作系统的作业让我深刻的体会到操作系统的知识作用.培养我综合运用知识的水平,结合了C++的知识来解决这个问题.稳固了以前的知识.在设计这个程序的时候我遇到了很多困难,但是通过老师和同学们的帮助,我一一解决掉了.而且发现了我很多学习中的缺乏之处,对以前学习的知识熟悉不够深刻,掌握的不够,这个要好好复习一下.总的来说,这个操作系统的作业带给我很多收获,让我受益匪浅.封pliilcsopher.cpp附件:。
操作系统课程设计——哲学家进餐问题

操作系统课程设计课程设计题目:哲学家进餐问题姓名:专业:班级:学号:指导教师:2014年6月10日目录1.设计题目与要求 (2)1.1实验目的 (2)1.2初始条件..............................................................................................错误!未定义书签。
2 总体设计思想及相关知识 (3)2.1总体设计思想 (3)2.2 临界区互斥编程原理 (4)2.3开发环境与工具 (3)3模块说明 (3)3.1 状态改变模块 (4)4. 部分源程序代码及测试结果 (6)5. 课设总结 (9)参考文献 (9)1.设计题目与要求1.1实验目的通过实现哲学家进餐问题的同步,深入了解和掌握进程同步和互斥的原理。
用C++进行线程的创建与撤销代码相对来说比较简单,因为封装比较多,我们能做的就是创建与调用。
当然,代码中也有一些复杂的地方,不是对线程的操作,而是关于界面的显示与操作,单个线程容易创建与撤销,但难的是合理的“监控”与组织多个线程并及时进行状态的显示。
虽然用程序语言实现了进程创建(当然,这是在并不会理论的情况下),但还是没弄清理论的实质。
可能理论更抽象些吧。
在平常的编程中,虽然经常遇到过要使用多线程的问题,但没有去试过从操作系统的角度去考虑线程的运行,在以后的学习中,我想还是会深入了解与学习这方面的东西的。
1.2设计要求哲学家有N个,也定全体到达后开始讨论:在讨论的间隙哲学家进餐,每人进餐时都需使用刀、叉各一把,所有哲学家刀和叉都拿到后才能进餐。
哲学家的人数、餐桌上的布置自行设定,实现刀和叉的互斥使用算法的程序实现。
(1)操作系统:windows(2)程序设计语言:C++(3)设定圆桌上有六个哲学家,三对刀叉,如下图摆放:图1-1 哲学家进餐问题设定图2 总体设计思想及相关知识2.1总体设计思想哲学家的生活就是思考和吃饭,即思考,就餐,再思考,往复循环。
操作系统哲学家就餐问题课程设计c语言

1.1 设计题目描述:
用多线程同步方法解决哲学家就餐问题(Dining-Philosophers Problem)
1.2 要求:
1)为每个哲学家产生一个线程,设计正确的同步算法 2)每个哲学家取得一双筷子开始用餐后,即时显示“Dining…”和该哲学 家的自定义标识符以及餐桌上所有几位哲学家标识符及其所坐的位置。 3)设定共有 5 个哲学家需用餐。每位用餐耗时 10 秒钟以上。 4)多个哲学家须共享操作函数代码。
针对每个哲学家通过共享操作函数代码分别建立5个线程以实现同步哲学家就餐而申请进入餐厅的哲学家进入room的等待队列根据fifo的原则总会进入到餐厅就餐因此不会出现饿死和死锁的现象针对5只筷子分别设置了5个互斥信号量以保证每只筷子每次只能被取得一次
武汉理工大学《操作系统》课程设计
题 目 : 用 多 线 程 同 步 方 法 解 决 哲 学 家 就 餐 问 题 (Dining-Philosophers
2. 设计说明书内容要求: Nhomakorabea1)设计题目与要求 2)总的设计思想及系统平台、语言、工具等。 3)数据结构与模块说明(功能与流程图) 4) 给出用户名、 源程序名、 目标程序名和源程序及其运行结果。 (要 注明存储各个程序及其运行结果的 Linux 主机 IP 地址和目录。 ) 5)运行结果与运行情况 (提示: (1)连续存储区可用数组实现。 (2)编译命令可用: cc (3)多线程编程方法参见附件。 )
2.2 系统平台、语言及工具
(1)操作系统:Linux (2)程序设计语言:C 语言 (3)工具:编辑工具 Vi、编译器 gcc
1
武汉理工大学《操作系统》课程设计
3.数据结构与模块说明
线程创建函数 pthread_create 声明如下: #include <pthread.h> int pthread_create (pthread_t *thread,pthread_attr_t *attr,Void* (*start_routine)(void *),void *arg);
操作系统实验报告哲学家就餐

操作系统实验报告哲学家就餐一、实验目的:通过模拟哲学家就餐问题,了解并掌握操作系统中的进程同步机制,以及解决进程间资源竞争所引发的死锁问题。
二、实验介绍:哲学家就餐问题是由荷兰计算机科学家伊克斯特拉(Dijkstra)于1965年首次提出的。
其问题描述如下:五位哲学家坐在一张圆桌子周围,每个哲学家面前有一碗饭和一根筷子。
哲学家的生活方式是交替地进行思考和进食。
当一个哲学家思考时,他不需要使用他的两个筷子;当一个哲学家想吃饭时,他需要同时获取他的左右两个筷子,并在获取到筷子后才能开始进食。
问题的关键是如何解决哲学家间的筷子竞争问题,以及避免死锁的发生。
三、实验设计:1.并发思路每个哲学家作为一个进程,在进行思考和进食这两个操作之前,需要获取他的两个筷子。
接下来考虑进程同步的两个关键点:-互斥:保证每个筷子同时只能被一个哲学家使用,避免资源竞争问题。
-死锁避免:通过限制只允许至多四位哲学家同时持有筷子,从而避免死锁发生。
2.进程同步机制- 互斥:使用Semaphore实现互斥,每个筷子都是一个Semaphore,初始值为1-死锁避免:引入一个全局计数器,记录当前持有筷子的哲学家数量,每次哲学家想要获取筷子时,先检查该计数器,仅当计数器小于4时才会获取筷子。
四、实验步骤:1.创建5个哲学家进程和5个筷子线程。
2.每个哲学家的线程循环执行思考和进食操作。
3.在进食之前,哲学家需要获取两个筷子,获取筷子的顺序按照哲学家编号进行,每个哲学家先获取自己的左边筷子,再获取自己的右边筷子。
4.进行进食操作后,哲学家释放两个筷子。
5.循环执行步骤3和步骤4,直到实验结束。
五、实验结果:通过观察实验结果,可以看到哲学家的思考和进食操作交替进行,并且避免了死锁的发生。
六、实验总结:通过本次实验,我了解了操作系统中的进程同步机制,并学会了如何解决资源竞争和死锁问题。
在本实验中,我使用了Semaphore和全局计数器实现了互斥和死锁避免,从而成功模拟了哲学家就餐问题。
操作系统02-6.4 哲学家问题_16

西安交通大学软件学院操作系统原理Operating System PrincipleOperating System Principle田丽华6-4 哲学家问题临界资源的抽象初始条件正确的P-V操作同步、互斥的约束条件12 34Semaphore 信号量Classical Problems of SynchronizationDiningPhilosophers ProblemDining--Philosophers Problem(哲学家就餐问题)Buffer ProblemBoundedBounded--Buffer Problem(有限缓冲区问题)Readers and Writers ProblemReaders and Writers Problem(读者写者问题)问题描述:哲学家进餐问题(the dining philosophers problem)(由Dijkstra 首先提出并解决)5个哲学家围绕一张圆桌而坐,桌子上放着5支筷子,每两个哲学家之间放一支;哲学家的动作包括思考和进餐,进餐时需要同时拿起他左边和右边的两支筷子,思考时则同时将两支筷子放回原处。
如何保证哲学家们的动作有序进行?如:不出现相邻者同时进餐;Dining-Philosophers ProblemShared dataSemaphore chopStick[] = new Semaphore[5];Philosopher(i)Philosopher(i)Repeat思考;取chopStick[i];取chopStick[(i+1) mod 5];进餐;放chopStick[i];放chopStick[(i+1) mod 5];Until false;Dining-Philosophers Problem (Cont.) Philosopher i:while (true) {// get left chopstickchopStick[i].P();// get right chopstickchopStick[(i + 1) % 5].P();// eat for awhile//return left chopstickchopStick[i].V();// return right chopstickchopStick[(i + 1) % 5].V();// think for awhile}讨论可能会出现死锁,五个哲学家每人拿起了他左边的筷子01 最多允许四个哲学家同时就坐02 同时拿起两根筷子03 非对称解决。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统哲学家问题实验报告实验报告三实验名称:一、调试验证“有限缓冲”经典同步问题二、利用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.“有限缓冲”经典同步问题。
(1)具体实现代码//缓冲区实现public class BoundeBufferimplements Buffer{private static final intBUFFER_SIZE=5;private Object[] buffer;private int in,out;private Semaphore mutex;private Semaphore empty;private Semaphore full;public BoundeBuffer() {in=0;out=0;buffer=newObject[BUFFER_SIZE];mutex=new Semaphore(1);empty=newSemaphore(BUFFER_SIZE);full=new Semaphore(0); }public void insert(Object item){try{empty.acquire();mutex.acquire();buffer[in]=item;in=(in+1)%BUFFER_SIZE;mutex.release();full.release();}catch(InterruptedExcept ion e){e.printStackTrace();} }public Object remove() {try {full.acquire();mutex.acquire();} catch (InterruptedException e) {e.printStackTrace();}Object item=buffer[out];out=(out+1)%BUFFER_SIZE;mutex.release();empty.release();return item;}//生产者实现public class Producerimplements Runnable{private Buffer buffer;public Producer(Bufferbuffer){this.buffer=buffer;}public void run(){Date message;while(true){SleepUtilities.nap();message=new Date();System.out.println("生产者产生了 "+message);buffer.insert(message);}}}//消费者实现public class Consumerimplements Runnable{private Buffer buffer;public Consumer(Bufferbuffer)this.buffer=buffer; }public void run() {Date message;while(true){SleepUtilities.nap();message=(Date)buffer.r emove();System.out.println("消费者者消费了"+message);//工厂测试类public class Factorypublic static voidmain(String[] args){Buffer buffer=newBoundeBuffer();Thread producer=newThread(newProducer(buffer));Thread consumer=newThread(newConsumer(buffer));producer.start();consumer.start();} (2)运行结果:2.哲学家进餐问题(1)具体实现代码class ChopStick{boolean available;ChopStick(){available=true;}public synchronized void takeup(){while(!available){try{System.out.println("哲学家等待另一根筷子");wait();}catch(InterruptedException e) {}}available=false;}public synchronized voidputdown(){available=true;notify();}}class Philosopher extends Thread {ChopStick left,right;int phio_num;publicPhilosopher(ChopStickleft,ChopStick right,intphio_num){this.left=left;this.right=right;this.phio_num=phio_num;}public void eat(){left.takeup();right.takeup();System.out.println("哲学家"+(this.phio_num+1)+" 在用餐"); }public void think(){left.putdown();right.putdown();System.out.println("哲学家"+(this.phio_num+1)+" 在思考"); }public void run(){while(true){eat();try{sleep(1000);}catch(InterruptedExceptione){}think();try{sleep(1000);}catch(InterruptedExceptione){}}}}public class WaitNotiExample {public static void main(String[] args){final ChopStick[]chopsticks=new ChopStick[4];final Philosopher[]philos=new Philosopher[4];for(int i=0;i<4;i++) {chopsticks[i]=newChopStick();}for(int i=0;i<4;i++) {philos[i]=newPhilosopher(chopsticks[i],chopsticks[(i+1)%4],i);}for(int i=0;i<4;i++) {philos[i].start();}(2)运行结果二、所遇问题与解决方法1.问题最初设想当筷子可用是,先分配左边的筷子,等待一会额再分配右边的筷子,由于这个算法过程中,会出现左边的筷子一直被占用着得不到释放,就有可能出现死锁的情况,该算法不可行。
2.解决仅当一个哲学家左右的筷子都可用时,才允许他拿起筷子。
这样要么只有一次占用两只筷子在吃面,然后释放所有的资源;要么不占用资源。
该算法可行。
三、实验总结1.“有限缓冲”经典同步问题(1)本次实验是关于生产者与消费者之间互斥和同步的问题。
问题的是指是P、V操作,实验设一个共享缓冲区,生产者和消费者互斥的使用,当一个线程使用缓冲区的时候,另一个让其等待直到前一个线程释放缓冲区为止。
(2)实验中包含的知识点很多,包括临界区资源共享问题、信号量定义、PV操作流程、进程间的通信方式(消息传递和共享内存)、进程同步和互斥、信号量机制解决进程之间的同步与互斥问题等等。
(3)通过本实验设计,我们对操作系统的P、V进一步的认识,深入的了解P、V操作的实质和其重要性。
课本的理论知识进一步阐述了现实中的实际问题。
2.哲学家进餐问题(1)程序分为四大模块,一步步解决了哲学家状态及状态改变的问题,筷子的“闲”、“用”问题;实现了哲学家等待、吃饭、思考三个过程的转换循环,并且避免了死锁问题;让临间资源得到了充分的利用。
(2)这次实验让我学会分模块解决问题,怎样利用互斥锁对临间资源进行管理;此外自己在编程上以及一些函数的认识上存在较大的问题,以后应该多多实践,提高自己的反应速度,加速逻辑思维能力。