进程同步模拟吃水果,操作系统课程设计报告书

合集下载

《操作系统》课程设计报告

《操作系统》课程设计报告

《操作系统》课程设计报告一、读者/写者的问题模拟实现读者/写者问题,是指保证一个writer 进程必须与其他进程互斥地访问共享对象的同步问题。

读者写者问题可以这样的描述:有一群写者和一群读者,写者在写同一本书,读者也在读这本书,多个读者可以同时读这本书,但是只能有一个写者在写书,并且读者必优先,也就是说,读者和写者同时提出请求时,读者优先。

当读者提出请求时,需要有一个互斥操作,另外需要有一个信号量S 来确定当前是否可操作。

信号量机制是支持多道程序的并发操作系统设计中解决资源共享时进程间的同步与互斥的重要机制,而读者写者则是这一机制的一个经典范例。

与记录型信号量解决读者——写者问题不同,信号量机制它增加了一个限制,即最多允许RN 个读者同时读。

为此,又引入了一个信号量L,并赋予初值为RN,通过执行wait (L,1,1)操作来控制读者的数目,每当有一个读者进入时,就要执行wait (L,1,1)操作,使L 的值减1。

当有RN 个读者进入读后,L 便减为0,第RN+1 个读者要进入读时,必然会因wait(L,1,1)操作失败而堵塞。

程序实例:#include <windows.h>#include <ctype.h>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <malloc.h>#define MAX_PERSON 100#define READER 0 //读者#define WRITER 1 //写者#define END -1#define R READER#define W WRITERtypedef struct _Person{HANDLE m_hThread;//定义处理线程的句柄int m_nType;//进程类型(读写)int m_nStartTime;//开始时间int m_nWorkTime;//运行时间int m_nID;//进程号}Person;Person g_Persons[MAX_PERSON];int g_NumPerson = 0;long g_CurrentTime= 0;//基本时间片数int g_PersonLists[] = {//进程队列1, W, 3, 5, 2, W, 16, 5, 3, R, 5, 2,4, W, 6, 5, 5, R, 4, 3, 6, R, 17,7,END,};int g_NumOfReading = 0;int g_NumOfWriteRequest = 0;//申请写进程的个数HANDLE g_hReadSemaphore;//读者信号HANDLE g_hWriteSemaphore;//写者信号bool finished = false; //所有的读完成//bool wfinished = false; //所有的写完成void CreatePersonList(int *pPersonList);bool CreateReader(int StartTime,int WorkTime,int ID);bool CreateWriter(int StartTime,int WorkTime,int ID);DWORD WINAPI ReaderProc(LPVOID lpParam);DWORD WINAPI WriterProc(LPVOID lpParam);int main(){g_hReadSemaphore = CreateSemaphore(NULL,1,100,NULL); //创建信号灯,当前可用的资源数为1,最大为100g_hWriteSemaphore = CreateSemaphore(NULL,1,100,NULL); //创建信号灯,当前可用的资源数为1,最大为100CreatePersonList(g_PersonLists); // Create All the reader and writersprintf("Created all the reader and writer\n 创建\n");g_CurrentTime = 0;while(true){g_CurrentTime++;Sleep(300); // 300 msprintf("CurrentTime = %d\n",g_CurrentTime);if(finished) return 0;} // return 0;}void CreatePersonList(int *pPersonLists){int i=0;int *pList = pPersonLists;bool Ret;while(pList[0] != END){switch(pList[1]){case R:Ret = CreateReader(pList[2],pList[3],pList[0]);//351,w452,523,654break; case W:Ret = CreateWriter(pList[2],pList[3],pList[0]);break;}if(!Ret)printf("Create Person %d is wrong\n",pList[0]);pList += 4; // move to next person list}}DWORD WINAPI ReaderProc(LPVOID lpParam)//读过程{Person *pPerson = (Person*)lpParam;// wait for the start timewhile(g_CurrentTime != pPerson->m_nStartTime){ }printf("Reader %d is Requesting 等待\n",pPerson->m_nID);printf("\n\n************************************************\n");// wait for the write requestWaitForSingleObject(g_hReadSemaphore,INFINITE); if(g_NumOfReading ==0) {WaitForSingleObject(g_hWriteSemaphore,INFINITE); }g_NumOfReading++;ReleaseSemaphore(g_hReadSemaphore,1,NULL);pPerson->m_nStartTime = g_CurrentTime;printf("Reader %d is Reading the Shared Buffer等待\n",pPerson->m_nID); printf("\n\n************************************************\n"); while(g_CurrentTime <= pPerson->m_nStartTime + pPerson->m_nWorkTime) {}printf("Reader %d is Exit退出\n",pPerson->m_nID);printf("\n\n************************************************\n"); WaitForSingleObject(g_hReadSemaphore,INFINITE);g_NumOfReading--;if(g_NumOfReading == 0){ReleaseSemaphore(g_hWriteSemaphore,1,NULL);//此时没有读者,可以写}ReleaseSemaphore(g_hReadSemaphore,1,NULL);if(pPerson->m_nID == 4) finished = true; //所有的读写完成ExitThread(0);return 0;}DWORD WINAPI WriterProc(LPVOID lpParam){Person *pPerson = (Person*)lpParam;// wait for the start timewhile(g_CurrentTime != pPerson->m_nStartTime){}printf("Writer %d is Requesting 请求进行写操作\n",pPerson->m_nID);printf("\n\n************************************************\n"); WaitForSingleObject(g_hWriteSemaphore,INFINITE);// modify the writer's real start timepPerson->m_nStartTime = g_CurrentTime;printf("Writer %d is Writting the Shared Buffer写内容\n",pPerson->m_nID);while(g_CurrentTime <= pPerson->m_nStartTime + pPerson->m_nWorkTime){}printf("Writer %d is Exit退出\n",pPerson->m_nID);printf("\n\n************************************************\n");//g_NumOfWriteRequest--;ReleaseSemaphore(g_hWriteSemaphore,1,NULL);if(pPerson->m_nID == 4) finished = true;//所有的读写完成ExitThread(0);return 0;}bool CreateReader(int StartTime,int WorkTime,int ID){DWORD dwThreadID;if(g_NumPerson >= MAX_PERSON)return false;Person *pPerson = &g_Persons[g_NumPerson];pPerson->m_nID = ID;pPerson->m_nStartTime = StartTime;pPerson->m_nWorkTime = WorkTime;pPerson->m_nType = READER;g_NumPerson++;// Create an New ThreadpPerson->m_hThread= CreateThread(NULL,0,ReaderProc,(LPVOID)pPerson,0,&dwThreadID); if(pPerson->m_hThread == NULL)return false;return true;}bool CreateWriter(int StartTime,int WorkTime,int ID){DWORD dwThreadID;if(g_NumPerson >= MAX_PERSON)return false;Person *pPerson = &g_Persons[g_NumPerson];pPerson->m_nID = ID;pPerson->m_nStartTime = StartTime;pPerson->m_nWorkTime = WorkTime;pPerson->m_nType = WRITER;g_NumPerson++;// Create an New ThreadpPerson->m_hThread= CreateThread(NULL,0,WriterProc,(LPVOID)pPerson,0,&dwThreadID); if(pPerson->m_hThread == NULL)return false;return true;}二、进程间通信与子进程使用管道进行父子进程间通信,程序首先判断参数是否合法,因为输入的字符将从父进程通过发送到子进程中。

操作系统课程设计吃水果问题完整

操作系统课程设计吃水果问题完整
目录
1
1.1
进程同步模拟设计:吃水果问题
1.2
桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。
1.3
将问题转换为信号量上的资源分配类型问题:
这是进程同步问题的模拟,可以把向盘子放或取水果的每一个过程可以转为一个进程的操作,这些进程是互斥的,同时也存在一定的同步关系。通过编程实践时,实际是随机的调用人一个进程的操作,而这些进程的操作相当于程序中的函数调用。而计算机在执行时每一个时刻只能执行一个操作,这就默认了互斥。同步的模拟可以类似于函数调用时的前提关系即先决条件。这样进程同步模拟就完全可以通过函数的调用来实现。
int MonFa_c;//用于爸爸妈妈等待次序的区别
int Son_a;//用于两个儿子等待次序的区别
int daughter_b;//用于两个女儿等待次序的区别
int k;//产生进程调用的数量
srand((unsigned)time(NULL));//srand()函数产生一个以当前时间开始的随机种子
Son2(); //处于等待的Son2()自动调用
Son_a=1;
}
}
else
{
if(Son1_lag==true)
{
Son1_lag=false; //Son1等待取消
cout<<"处于等待的Son1自动被调用"<<endl;
Son1(); //处于等待的Son源自()自动调用Son_a=0;
}
else if(Son2_lag==true)
{
orange--;

进程同步模拟设计--吃水果问题

进程同步模拟设计--吃水果问题

附件1:学号:012课程设计题目进程同步模拟设计--吃水果问题学院计算机科学与技术学院专业计算机科学与技术专业班级计算机姓名指导教师2011 年01 月19 日课程设计任务书学生:专业班级:指导教师:作单位:计算机科学与技术学院题目: 进程同步模拟设计——吃水果问题初始条件:1.预备容:阅读操作系统的进程管理章节容,对进程的同步和互斥,以及信号量机制度有深入的理解。

2.实践准备:掌握一种计算机高级语言的使用。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.模拟吃水果的同步模型:桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。

爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。

2.设计报告容应说明:⑴需求分析;⑵功能设计(数据结构及模块说明);⑶开发平台及源程序的主要部分;⑷测试用例,运行结果与运行情况分析;⑸自我评价与总结:i)你认为你完成的设计哪些地方做得比较好或比较出色;ii)什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);iv)完成本题是否有其他方法(如果有,简要说明该方法);v)对实验题的评价和改进意见,请你推荐设计题目。

时间安排:设计安排一周:周1、周2:完成程序分析及设计。

周2、周3:完成程序调试及测试。

周4、周5:验收、撰写课程设计报告。

(注意事项:严禁抄袭,一旦发现,一律按0分记)指导教师签名:年月日系主任(或责任教师)签名:年月日进程同步模拟设计——吃水果问题1需求分析1.1吃水果问题的描述桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。

爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。

1.2问题的转换这是进程同步问题的模拟,可以把向盘子放或取水果的每一个过程可以转为一个进程的操作,这些进程是互斥的,同时也存在一定的同步关系。

进程同步模型系统的设计—吃水果

进程同步模型系统的设计—吃水果

课程设计课程设计任务书学生: Miss屠专业班级: 08计科指导教师:王海英工作单位:计算机科学与技术学院题目: 进程同步模型系统的设计——吃水果问题初始条件:1.预备容:阅读操作系统的进程管理章节容,对进程的同步和互斥,以及信号量机制度有深入的理解。

2.实践准备:掌握一种计算机高级语言的使用。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.为下面吃水果的问题创建进程并利用通信API实现进程之间的同步模型。

能够处理以下的情形:桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。

爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。

2.设计报告容应说明:⑴课程设计目的与功能;⑵需求分析,数据结构或模块说明(功能与框图);⑶源程序的主要部分;⑷运行结果与运行情况分析;⑸自我评价与总结:i)你认为你完成的设计哪些地方做得比较好或比较出色;ii)什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);iv)完成本题是否有其他的其他方法(如果有,简要说明该方法);时间安排:设计安排一周:周1、周2:完成程序分析及设计。

周2、周3:完成程序调试及测试。

周4、周5:撰写课程设计报告。

指导教师签名:年月日系主任(或责任教师)签名:年月日进程同步模型系统的设计——吃水果问题1、课程设计目的与功能1.1、目的为下面吃水果的问题创建进程并利用通信API实现进程之间的同步模型。

能够处理以下的情形:桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。

爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。

1.2、实现的功能本程序共创建了4个在windows系统环境下实现的线程,即Fahter、Mother、Son和Daughter等4个线程,以及putapple、putorange、getapple和getorange 等4个函数,其中4个线程是用于实现爸爸、妈妈、儿子和女儿分别放水果和取水果的线程操作的,并分别调用这4个函数,来实现真正的操作。

进程同步模拟设计吃水果问题

进程同步模拟设计吃水果问题

附件1:学号:012课程设计题目进程同步模拟设计--吃水果问题学院计算机科学与技术学院专业计算机科学与技术专业班级计算机姓名指引教师年01 月19 日课程设计任务书学生姓名:专业班级:指引教师:作单位:计算机科学与技术学院题目: 进程同步模拟设计——吃水果问题初始条件:1.预备内容:阅读操作系统旳进程管理章节内容,对进程旳同步和互斥,以及信号量机制度有进一步旳理解。

2.实践准备:掌握一种计算机高档语言旳使用。

规定完毕旳重要任务:(涉及课程设计工作量及其技术规定,以及阐明书撰写等具体规定)1.模拟吃水果旳同步模型:桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一种水果。

爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中旳橘子,两个女儿专门等吃盘子中旳苹果。

2.设计报告内容应阐明:⑴需求分析;⑵功能设计(数据构造及模块阐明);⑶开发平台及源程序旳重要部分;⑷测试用例,运营成果与运营状况分析;⑸自我评价与总结:i)你觉得你完毕旳设计哪些地方做得比较好或比较杰出;ii)什么地方做得不太好,后来如何改正;iii)从本设计得到旳收获(在编写,调试,执行过程中旳经验和教训);iv)完毕本题与否有其她措施(如果有,简要阐明该措施);v)对实验题旳评价和改善意见,请你推荐设计题目。

时间安排:设计安排一周:周1、周2:完毕程序分析及设计。

周2、周3:完毕程序调试及测试。

周4、周5:验收、撰写课程设计报告。

(注意事项:严禁抄袭,一旦发现,一律按0分记)指引教师签名:年月日系主任(或责任教师)签名:年月日进程同步模拟设计——吃水果问题1需求分析1.1吃水果问题旳描述桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一种水果。

爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中旳橘子,两个女儿专门等吃盘子中旳苹果。

1.2问题旳转换这是进程同步问题旳模拟,可以把向盘子放或取水果旳每一种过程可以转为一种进程旳操作,这些进程是互斥旳,同步也存在一定旳同步关系。

000操作系统课设报告(进程控制-吃苹果)

000操作系统课设报告(进程控制-吃苹果)
semid_full2 = semget(SEMKEY_FULL2,1, 0777);
semctl(semid_mutex,0,IPC_RMID);
semctl(semid_empty,0,IPC_RMID);
semctl(semid_full1,0,IPC_RMID);
semctl(semid_full2,0,IPC_RMID);
操作系统课程设计
——Linux系统管理实践与进程通信实现
实验学期2至2学年,第学期
学生姓名
专业班操作系统》课程设计报告
实验题目:Linux系统管理实践与进程控制、进程通信实现
设计时间:2014-01-09至
2014-01-14
一、 实验目的与要求
1、掌握基本的同步与互斥算法。
int mother()//母亲程序
int daughter()//女儿程序
int son()//儿子程序
int main(int argc, char *argv[])//主程序,包含了初始化程序
信号量:
设置互斥信号量mutex:每次盘子中只能放一只水果或取出一只水果;
设置同步信号量full1:实现父亲放苹果,女儿取水果的同步;
else
printf("Fail To Create SEM_FULL2!\n");
return -1;
}
/*给信号量赋初值*/
set_sembuf_struct(&sem_tmp, 0, BUFF_LEN, 0);/*BUFF_LEN*/
void set_sembuf_struct(struct sembuf *sem,int semnum, int semop,int semflg)

技工院--苹果-桔子问题的实现

技工院--苹果-桔子问题的实现

《操作系统》课程设计任务书题目:苹果-桔子问题的实现学生姓名:班级:物联网工程1班学号:指导教师:张清/贾娟娟一、设计目的学生通过该题目的设计过程,掌握进程同步问题的原理、软件开发方法并提高解决实际问题的能力。

二、设计内容1、了解UNIX的命令及使用格式,熟悉UNIX/LINUX的常用基本命令,练习并掌握UNIX提供的vi编辑器来编译C程序,学会利用gcc、gdb编译、调试C程序。

2、编写程序实现苹果-桔子问题。

桌上有一个空盘子,只允许放一个水果。

爸爸专向盘中放苹果,妈妈专向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。

规定当盘空时,一次只能放一个水果。

三、设计要求及工作量1、分析设计要求,给出解决方案(要说明设计实现所用的原理、采用的数据结构)。

2、设计合适的测试用例,对得到的运行结果要有分析。

3、设计中遇到的问题,设计的心得体会。

4、文档:课程设计打印文档每个学生一份,并装在统一的资料袋中。

5、光盘:每个学生的文档和程序资料建在一个以自己学号和姓名命名的文件夹下,刻录一张光盘,装入资料袋中。

四、要提交的成果1. 设计说明书一份,内容包括:1) 中文摘要100字;关键词3-5个;2) 设计思想;3)各模块的伪码算法;4)函数的调用关系图;5)测试结果;6)源程序(带注释);7)设计总结;8) 参考文献、致谢等。

2. 刻制光盘一张。

五、设计进度计划及时间安排六、主要参考资料1.汤子瀛,哲凤屏.《计算机操作系统》.西安电子科技大学学出版社.2.王清,李光明.《计算机操作系统》.冶金工业出版社.3.孙钟秀等. 操作系统教程. 高等教育出版社4.曾明. Linux操作系统应用教程. 陕西科学技术出版社.5. 张丽芬,刘利雄.《操作系统实验教程》. 清华大学出版社.6. 孟静,操作系统教程--原理和实例分析. 高等教育出版社7. 周长林,计算机操作系统教程. 高等教育出版社8. 张尧学,计算机操作系统教程,清华大学出版社9.任满杰,操作系统原理实用教程,电子工业出版社10.张坤.操作系统实验教程,清华大学出版社目录1.绪论 (1)1.1设计任务 (1)1.2设计思想 (1)1.3基础知识 (1)2.各模块伪码算法 (3)2.1父亲进程模块 (3)2.2母亲进程模块 (5)2.3儿子进程模块 (7)2.4女儿进程模块 (9)2.5Print函数 (11)3. 函数调用关系图 (14)3.1函数调用图........................................ 错误!未定义书签。

《操作系统课程设计》报告范本(doc 10页)

《操作系统课程设计》报告范本(doc 10页)

《操作系统课程设计》报告学号:姓名:班级:指导教师:报告日期:一、课设目的通过对操作系统课程的学习,熟悉进程的概念、进程的管理与存储、进程的调度,通过实践深入理解进程的调度算法。

二、课设任务要求编写一个程序,可以创建若干个虚拟进程,并对若干个虚拟进程进行调度,调度策略为时间片轮转法,主要任务包括:①进程的个数,进程的内容(即进程的功能序列)来源于一个进程序列描述文件,另外调度运行结果输出到一个运行日志文件;②设计PCB适用于时间片轮转法;③建立进程队列;④实现时间片轮转调度算法,尽量可视化的展示调度的动态过程。

○5总结程序设计的开发过程:需求分析、系统设计、系统实现及文档的收集和整理。

三、实验方法与设计分析每个进程有一个进程控制块( PCB)表示。

进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。

据需要设计调查计划调查、收集数据,能按要求整理数据,在统计表进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。

进程的到达时间为输入进程的时间。

,计算机,千千万万中小创业者渴望成功高中语文,语文试卷,计算机摇篮课进程的运行时间以时间片为单位进行计算。

每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。

式,因此上开店成为了一种潮流,并且越来越多高中语文,语文试卷,计算机就绪进程获得 CPU后都只能运行一个时间片。

用已占用CPU时间加1来表示。

卷,计算机络购物高中语文,语文试卷,计算机市场潜力还远未被释放课件同如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。

语文,语文试卷,计算机,第5代速度达自动软件,不用东奔西走高中语文,语文每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 PCB,以便进行检查。

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

某某大学课程设计报告课程名称:操作系统课程设计设计题目:进程同步模拟吃水果问题系别:计算机系专业:计算机科学与技术组别:学生: 学号:起止日期:指导教师:目录第一章需求分析 (1)1.1问题概述 (1)1.2任务分析 (1)1.3设计思路 (1)1.4运行环境 (1)第二章概要设计 (2)2.1 数据结构 (2)2.2模块说明 (2)2.2.1主函数 (2)2.2.2 6个进程函数 (2)2.3 操作的流程图 (3)第三章详细设计 (4)3.1定义类 (4)3.2定义各个过程 (5)3.3定义Print()函数 (5)3.4主函数 (6)第四章调式和操作说明 (13)4.1测试用例 (13)4.2运行结果 (14)第五章总结和体会 (15)参考文献: (15)致谢: (15)第一章需求分析1.1问题概述桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。

爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。

1.2任务分析1.模拟吃水果的同步模型:桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。

爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。

2.设计报告容要求:模拟吃水果问题,实现进程的同步操作;给出实现方案(包括数据结构和模块说明等);画出程序的基本结构框图和流程图;分析说明每一部分程序的的设计思路;实现源代码;按期提交完整的程序代码和可执行程序;根据要求完成课程设计报告。

1.3设计思路这是进程同步问题的模拟,可以把向盘子放或取水果的每一个过程可以转为一个进程的操作,这些进程是互斥的,同时也存在一定的同步关系。

通过编程实践时,实际是随机的调用人一个进程的操作,而这些进程的操作相当于程序中的函数调用。

而计算机在执行时每一个时刻只能执行一个操作,这就默认了互斥。

同步的模拟可以类似于函数调用时的前提关系即先决条件。

这样进程同步模拟就完全可以通过函数的调用来实现。

具体的每一个操作的对应的函数的关系:爸爸向盘子中放一个苹果:Father()妈妈向盘子中放一个橘子:Mother()儿子1从盘子取一个橘子:Son1()儿子2从盘子取一个橘子:Son2()女儿1从盘子取一个橘子:Daugther1()儿子1从盘子取一个橘子:Daugther2()1.4运行环境(1):硬件配置个人计算机:PⅢ 500MHz以上/128M存/10G硬盘(2):软件配置操作系统:Windows XP开发软件:VisualC++6.0第二章概要设计2.1 数据结构(1)用一个整型变量Plate_Size表示盘子,初始值为0,当放水果时Plate_Size加1,取水果时Plate_Size减1。

变量Plate_Size的最大值为2,当为2时表示盘子已经满,此时若进行放水果操作,放水果将处于等待状态;为0时表示盘子为空,此时若进行取水果操作,取水果操作将处于等待状态。

(2)整型变量orange和apple分别表示盘子中的橘子和苹果数目,初始都为0,Plate_Size=apple+orange。

(3)用6个bool型的变量 Father_lag,Mother_lag,Son1_lag,Son2_lag,Daughter1_lag,Daughter2_lag表示六个进程是否处于等待状态。

处于等待时,变量值为true。

(4)两个放水果进程进程同时处于等待状态时,若有取水果的操作将自动执行等待的放水果进程,执行按等待的先后顺序;两个取苹果或橘子进程同时候处于等待状态,若有放苹果或橘子的操作将自动执行等待的取进程,进行按等待的先后顺序。

(5)用一个随机的函数产生0—5的6个整数,分别对应六个进程的调用。

2.2模块说明2.2.1主函数用一个随机的函数产生0—5的6个整数,分别对应六个进程的调用,调用的次数可以自己输入,本程序共产生了10次随机的调用进程。

2.2.2 6个进程函数爸爸向盘子中放一个苹果操作:Father()妈妈向盘子中放一个橘子操作:Mother()儿子1从盘子取一个橘子操作:Son1()儿子2从盘子取一个橘子操作:Son2()女儿1从盘子取一个橘子操作:Daugther1()女儿2从盘子取一个橘子操作:Daugther2()2.2.3 Print函数用于输出盘子中苹果和橘子的个数,水果总个数及有哪些进程处于等待状态。

2.3 操作的流程图图一放水果操作(放水果时父亲和母亲是随即进行)图二吃水果的流程图(假如儿子1先)第三章详细设计3.1定义类*//*class A{private:int apple=0;int orange=0;public:void Father();void Mother();void Son1();void Son2();void Daughter1();void Daughter2();void print();}3.2定义各个过程void Father() //Father进程{apple++;Print();}void Mother() //Mother进程{orange++;// Print();}void Son1() //Son1进程{orange--;// Print();}void Son2() //Son2进程{orange--;// Print();}void Daughter1() //Daughter1进程{apple--;// Print();}void Daughter2() //D aughter2进程{apple--;//Print();}3.3定义Print()函数void Print(){cout<<"现在盘子里有"<<apple<<"个苹果,"<<orange<<"个橘子,"<<"共有"<<apple+orange<<"个水果."<<endl;if(Father_lag==true)cout<<"Father进程处于等待状态,";if(Mother_lag==true)cout<<"Mother进程处于等待状态,";if(Son1_lag==true)cout<<"Son1进程处于等待状态,";if(Son2_lag==true)cout<<"Son2进程处于等待状态, ";if(Daughter1_lag==true)cout<<"Daughter1进程处于等待状态,";if(Daughter2_lag==true)cout<<"Daughter2进程处于等待状态,";if(((Father_lag==false)&&(Mother_lag==false) &&(Son1_lag==false)&&(Son2_lag==false)&&(Daughter1_lag==false)&&( Daughter2_lag==false))!=true)cout<<endl;}3.4主函数int main(){int k;srand((unsigned)time(NULL));//srand()函数产生一个以当前时间开始的随机种子for(k=0;k<10;k++){ int i;cout<<"第"<<k+1<<"次操作:"<<endl;i=rand()%6; //随进生成1-5.Plate_Size=apple+orange;switch(i){ case 0:cout<<"Father调用."<<endl;if(Plate_Size==2){ Father_lag=true;//Father()等待Print();if(Mother_lag==false)MonFa_c=1;}else{Father();Print();if((Daughter1_lag==true)&&(Daughter2_lag==true)){if(Daughter_b==1){Daughter1_lag=false;//Daughter1等待取消cout<<"处于等待的Daughter1自动被调用"<<endl;Daughter1(); //处于等待的Daughter1自动调用Print();Daughter_b=2;}else{Daughter2_lag=false;//Daughter2等待取消cout<<"处于等待的Daughter2自动被调用"<<endl;Daughter2(); //处于等待的Daughter2()自动调用Print();Daughter_b=1;}}else{if(Daughter1_lag==true){Daughter1_lag=false;//Daughter1等待取消cout<<"处于等待的Daughter1自动被调用"<<endl;Daughter1(); //处于等待的Daughter1()自动调用Print();Daughter_b=0;}else if(Daughter2_lag==true){Daughter2_lag=false;//Daughter2等待取消cout<<"处于等待的Daughter1自动被调用"<<endl;Daughter2(); //处于等待的Daughter2()自动调用Daughter_b=0;}}}break;case 1:cout<<"Mother调用."<<endl;if(Plate_Size==2){Mother_lag=true; //等待Print();if(Father_lag==false)MonFa_c=2;}else{Mother();Print();if((Son1_lag==true)&&(Son2_lag==true)){if(Son_a==1){Son1_lag=false;//Son1等待取消cout<<"处于等待的Son1自动被调用"<<endl;Son1(); //处于等待的Son1()自动调用Print();Son_a=2;}else{Son2_lag=false;//Son2等待取消cout<<"处于等待的Son2自动被调用"<<endl;Son2(); //处于等待的Son2()自动调用Print();Son_a=1;}}else{if(Son1_lag==true){Son1_lag=false; //Son1等待取消cout<<"处于等待的Son1自动被调用"<<endl;Son1(); //处于等待的Son1()自动调用Print();Son_a=0;}else if(Son2_lag==true){Son2_lag=false; //Son2等待取消cout<<"处于等待的Son2自动被调用"<<endl;Son2(); //处于等待的Son2()自动调用Print();Son_a=0;}}}break;case 2:cout<<"Son1调用."<<endl;if(orange==0){Son1_lag=true; //Son1处于等待Print();if(Son2_lag==false)Son_a=1; //用于判断Son1和Son2等待的先后性}else{Son1();Print();if((Father_lag==true)&&(Mother_lag==true)){if(MonFa_c==1)//Father和Mother同时处于等待,但Father先等待,因此先调用{Father_lag=false;cout<<"处于等待的Father自动被调用"<<endl;Father();Print();MonFa_c=2;}else //Father和Mother同时处于等待,但Mother先等待,因此先调用{Mother_lag=false;cout<<"处于等待的Mother自动被调用"<<endl;Mother();Print();MonFa_c=1;}}else{if(Father_lag==true) //只有Father处于等待,调用{Father_lag=false;cout<<"处于等待的Father自动被调用"<<endl;Father();Print();MonFa_c=0;}else if(Mother_lag==true)//只有Mothe处于等待,调用{Mother_lag=false;cout<<"处于等待的Mother自动被调用"<<endl;Mother();Print();MonFa_c=0;}}}break;case 3:cout<<"Son2调用."<<endl;if(orange==0){Son2_lag=true; //Son2处于等待Print();if(Son1_lag==false)Son_a=2;}else{Son2();Print();if((Father_lag==true)&&(Mother_lag==true)){if(MonFa_c==1)//Father和Mother同时处于等待,但Father先等待,因此先调用{Father_lag=false;cout<<"处于等待的Father自动被调用"<<endl;Father();Print();MonFa_c=2;}else //Father和Mother同时处于等待,但Mother先等待,因此先调用{Mother_lag=false;cout<<"处于等待的Mother自动被调用"<<endl;Mother();Print();MonFa_c=1;}}else{if(Father_lag==true)//只有Father处于等待,调用{Father_lag=false;cout<<"处于等待的Father自动被调用"<<endFather();Print();MonFa_c=0;}else if(Mother_lag==true) //只有Mother处于等待,调用{Mother_lag=false;cout<<"处于等待的Mother自动被调用"<<endl;Mother();Print();MonFa_c=0;}}}break;case 4:cout<<"Daughter1调用."<<endl;if(apple==0){Daughter1_lag=true; //Daughter1Print();if(Daughter2_lag==false)Daughter_b=1;}{Daughter1();Print();if((Father_lag==true)&&(Mother_lag==true)){if(MonFa_c==1) //Father和Mother同时处于等待,但Father先{ //等待,因此先调用Father_lag=false;cout<<"处于等待的Father自动被调用"<<endl;Father();Print();MonFa_c=2;}else //Father和Mother同时处于等待,但Mother先等待,因此先调用 {Mother_lag=false;cout<<"处于等待的Mother自动被调用"<<endl;Mother();Print();MonFa_c=1;}}else{if(Father_lag==true) //只有Father处于等待,调用{Father_lag=false;cout<<"处于等待的Father自动被调用"<<endl;Father();Print();MonFa_c=0;}else if(Mother_lag==true) //只有Mother处于等待,调用{Mother_lag=false;cout<<"处于等待的Mother自动被调用"<<endl;Mother();Print();MonFa_c=0;}}break; case 5:cout<<"Daughter2调用."<<endl;if(apple==0){Daughter2_lag=true; //Daughter2等待Print();if(Daughter1_lag==false)Daughter_b=2;}else{Daughter2();Print();if((Father_lag==true)&&(Mother_lag==true)){if(MonFa_c==1) //Father和Mother同时处于等待,但Father先等待,因此先调用{Father_lag=false;cout<<"处于等待的Father自动被调用"<<endl;Father();Print();MonFa_c=2;}else //Father和Mother同时处于等待,但Mother先等待,因此先调用{ Mother_lag=false;cout<<"处于等待的Mother自动被调用"<<endl;Mother();Print();MonFa_c=1;}}else{if(Father_lag==true)//只有Father处于等待,调用{ Father_lag=false;cout<<"处于等待的Father自动被调用"<<endl;Father();Print();MonFa_c=0;}else if(Mother_lag==true) //只有Mother处于等待,调用{ Mother_lag=false;cout<<"处于等待的Mother自动被调用"<<endl;Mother();Print();MonFa_c=0;}}}break;}}return 0;}第四章调式和操作说明4.1测试用例由于程序是模拟产生10次随机的操作,执行相应的函数来模拟进程同步。

相关文档
最新文档