当前位置:文档之家› 进程同步模型系统的设计吃水果样本

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

课程设计课程设计任务书学生姓名: 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个函数,来实现真正操作。

在本程序中还设立了mutex互斥信号、empty、apple和orange等信号量,用于各线程之间获取资源和放弃资源等线程之间操作控制,并且设立了盘子容量上线常量content。

其重要功能是用于实现爸爸和妈妈这2个互斥线程对于资源使用操作以及爸爸和女儿、妈妈和儿子这2组同步线程对于资源操作。

2、需求分析当计算机中两个或者各种进程在执行时需要使用公用缓冲区,并且对该缓冲区采用了互斥办法,这时如果并发执行这些进程时候就会导致CPU时间极大挥霍,这是操作系统设计规定不容许。

而这种现象在操作系统和顾客进程中大量存在。

因而为理解决这一问题,提出了同步概念,即把异部环境下一组并发进程,因直接制约而互相发送消息而进行互相合伙、互相等待,使得各进程按一定速度执行过程称为进程间同步。

在本系统中,爸爸与妈妈、儿子与女儿线程操作是互斥,但是爸爸与女儿、妈妈与儿子线程之间操作是同步。

因而要运用进程同步办法来实现这几者之间操作,固然其中也包括着互斥进程,由于盘子每次只能放入或者取出一种水果。

由于是在windows操作系统下实现,因此是采用线程办法实现。

3、整体功能及设计3.1数据构造设计在本次程序中一共涉及到线程、函数、互斥信号、信号量和常变量。

3.1.1线程线程是指进程内一种执行单元,也是进程内可调度实体。

单个进程在任何给定期刻,也许有不止一种线程在运营。

但进程启动同步启动了一种线程,该线程被称作主线程或执行线程。

一种进程除启动主线程外还可以启动各种线程,每个线程都共享进程地址空间,并且共享着进程地址空间及各种资源。

线程可以继续创立子线程。

如果主线程退出,主线程下所有子线程将失败。

线程创立格式如下:其中括号中则需要列出该函数各形参或者实参。

该函数返回值为线程句柄。

HANDLE CreateThread( );CreateThread函数参数阐明在本程序中使用了Father、Mother、Son和Daughter等共4个线程。

Father、Mother线程作用是模仿实现向盘子中放苹果或者橘子操作,当主程序执行之后创立了Father或者Mother线程,则该线程会独自占用整个资源,并执行putapple或者putorange函数来实现操作,在执行Father或者Mother线程时,一方面会将信号量empty减1,来阐明盘子中已经放置了一种水果,之后将互斥信号mutex置0,来阐明盘子已经被占用,其她进程无法占用。

当实现了putapple 或者putorange后,该线程会置mutex为1,来释放资源,表白该资源可以被其她线程所使用。

接下来将apple或者orange信号进行相应设立,表白在盘子中已经放置了苹果或者橘子,Daughter或者Son线程可以从盘子中取苹果或者橘子了。

Daughter 、Son线程作用是模仿实现从盘子中取出苹果或者橘子操作,当主程序中执行过Father或者Mother线程之后会释放资源,这时候Daughter或者Son 线程便得到了资源,在得到资源即盘子后会一方面将apple或者orange信号量进行设立,恢复本来数值以表白盘子中水果状况,并且将mutex互斥信号进行设立,表达资源正在被占用。

在实现了getapple或者getorange后,便对mutex互斥信号进行设立,以释放资源。

3.1.2函数若干个函数构成一种程序文献,若干个程序文献构成一种完整程序,因而函数是程序基本构成某些。

在本程序中共创立了putapple( )、putorange( )、getapple( )和getorange( )等4个功能函数,分别用来模仿实现放苹果、放橘子、取苹果和取橘子操作。

主函数main( )重要作用就是为Father、Mother、Son和Daughter 这四个线程服务,创立这几种线程,并在这些线程执行完毕后销毁它们。

主函数中Sleep( )函数,控制主线程休眠一段时间,并在此期间执行其她其她子线程,在休眠时间过后主线程执行完,整个程序执行完毕。

3.1.3互斥信号和信号量线程同步办法有诸多,最惯用有互斥(CMutex)、临界(CriticalSection)、信号量(Semaphore)和事件(Event)。

但本程序只用到了互斥和信号量。

其中mutex 是各线程之间互斥信号,当一种线程占用了资源之后,其她线程在没接受到告知时候即互斥信号为0时便无法使用资源。

empty、apple和orange为3个信号量,分别来表达资源使用状态,各线程依照这3个信号量来理解资源状态和使用资源。

这3个信号量变化范畴为0~ content,content为盘子容量,也是资源容量。

3.2程序实现框图3.2.1 main函数3.2.2 Father、Mother线程3.2.3 Son、Daughter线程4、编程实现4.1各线程声明:DWORD WINAPI Father(LPVOID lpParameter);//Father线程DWORD WINAPI Mother(LPVOID lpParameter);//Mother线程DWORD WINAPI Son(LPVOID lpParameter);//Son线程DWORD WINAPI Daughter(LPVOID lpParameter);//Daughter线程4.2 各信号量、互斥信号和常变量HANDLE mutex;//互斥信号mutexHANDLE empty;//信号量emptyHANDLE apple;//信号量appleHANDLE orange;//信号量orangeconst int content=2;//常变量mutex4.3个函数声明void putapple( );void putorange( );void getapple( );void getorange( );4.4主函数程序代码{mutex=CreateMutex(NULL,FALSE,NULL);//创立mutexempty=CreateSemaphore(NULL,content,content,NULL);//创立emptyapple=CreateSemaphore(NULL,0,content,NULL);//创立appleorange=CreateSemaphore(NULL,0,content,NULL);//创立oarngeHANDLE hThread1;HANDLE hThread2;HANDLE hThread3;HANDLE hThread4;hThread1=CreateThread(NULL,0,Father,NULL,0,NULL);//创立Father线程hThread2=CreateThread(NULL,0,Mother,NULL,0,NULL);//创立Mother线程hThread3=CreateThread(NULL,0,Son,NULL,0,NULL);//创立Son线程hThread4=CreateThread(NULL,0,Daughter,NULL,0,NULL);//创立Daughter线程CloseHandle(hThread1);//销毁Father线程CloseHandle(hThread2);//销毁Mother线程CloseHandle(hThread3);//销毁Son线程CloseHandle(hThread4);//销毁Daughter线程Sleep(35000);//主程序将在30秒后结束}4.5各线程程序代码DWORD WINAPI Father(LPVOID lpParameter)//Father线程实现{{WaitForSingleObject(empty,INFINITE);WaitForSingleObject(mutex,INFINITE);putapple( );Sleep(1500);ReleaseMutex(mutex);ReleaseSemaphore(apple,1,NULL);}}DWORD WINAPI Mother(LPVOID lpParameter)//Mother线程实现{while(1){WaitForSingleObject(empty,INFINITE);WaitForSingleObject(mutex,INFINITE);putorange( );Sleep(1500);ReleaseMutex(mutex);ReleaseSemaphore(orange,1,NULL);}}DWORD WINAPI Son(LPVOID lpParameter)//Son线程实现{while(1){WaitForSingleObject(orange,INFINITE);WaitForSingleObject(mutex,INFINITE);getorange( );Sleep(1500);ReleaseMutex(mutex);ReleaseSemaphore(empty,1,NULL);}}DWORD WINAPI Daughter(LPVOID lpParameter)//Daughter线程实现{while(1){WaitForSingleObject(apple,INFINITE);WaitForSingleObject(mutex,INFINITE);getapple( );Sleep(1500);ReleaseMutex(mutex);ReleaseSemaphore(empty,1,NULL);}}4.6各函数程序代码void putapple( )//Father放苹果{cout<<"爸爸要放苹果了!"<<endl;Sleep(1500);cout<<"苹果已经被放进去了!"<<endl; }void putorange( )//Mother放橘子{cout<<"妈妈要放橘子了!"<<endl;Sleep(1500);cout<<"橘子已经被放进去了!"<<endl; }void getapple( )//Daughter取苹果{cout<<"女儿要吃苹果了!"<<endl;Sleep(1500);cout<<"苹果已经被拿出来了!"<<endl; }void getorange( )//Son取橘子{cout<<"儿子要吃橘子了!"<<endl;Sleep(1500);cout<<"橘子已经被拿出来了!"<<endl;}5、运营成果与运营状况分析程序运营成果如下:各线程执行完一次成果:由于是设定了Sleep( )函数,因此程序在执行了35000毫秒,即35秒之后便自动结束。

相关主题