进程同步模型系统的设计吃水果样本
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计
课程设计任务书
学生姓名: 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;//互斥信号mutex
HANDLE empty;//信号量empty
HANDLE apple;//信号量apple
HANDLE orange;//信号量orange
const int content=2;//常变量mutex
4.3个函数声明
void putapple( );
void putorange( );
void getapple( );
void getorange( );
4.4主函数程序代码
{
mutex=CreateMutex(NULL,FALSE,NULL);//创立mutex
empty=CreateSemaphore(NULL,content,content,NULL);//创立empty
apple=CreateSemaphore(NULL,0,content,NULL);//创立apple
orange=CreateSemaphore(NULL,0,content,NULL);//创立oarnge
HANDLE 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秒之后便自动结束。
程序开始时,在main( )函数中创立各个线程,在创立之后,便开始按照同步进程执行规律进行执行,在每个线程中都设立有Sleep( )函数,用来进行最后成果输出界面控制,即每隔1.5秒便输出一种线程执行成果,这样依次进行。
由于线程调度没有明显显示成果,因此在4个函数中专门设立了输出语句以显式方式来体现各线程执行成果。
由于在时间上进行了设立,因此最后输出了3组线程执行成果,即从爸爸或者妈妈放第一种水果,始终到儿子或者女儿将盘子中最后一种水果取走。
6、自我评价与总结
6.1比较满意之处
在设计这个题目之前,由于对于进程同步实现办法不是很理解,对于如何详细实现进程同步有很大疑问,因此在网上进行了查找,但愿找到有关资料,但几经搜索都没有找到比较适合材料。
网上资料重要以P V原语实现为主,而本实验是以实现进程同步系统功能为主,因而对于实现功能有一定协助,但对于P原语语句与V原语语句详细实现并没有给出。
就是在这种虽然有一定基本,但并不能完全依托状况下,自己通过查找有关书籍,理解本系统中也许涉及到数据构造知识后,成功实现了进程同步模型系统功能。
自己对于从对进程同步只是有一种概念上结识,到最后将它功能实现这一过程感到满意与欣慰,由于这些都是通过自己努力一步一步实现。
在程序设计方面,本程序数据构造简朴,重要涉及线程、函数和进程同步中各种互斥信号和信号量。
程序数据构造精简,程序设计简介,一目了然。
麻雀虽小,但五脏俱全,凡是实现可以实现该设计功能构成某些所有涉及。
6.2局限性之处
一方面,虽然熟悉和理解了程序中各数据构造定义和创立,但是在某些细节问题上还是没有一种很明确结识,例如虽然懂得HANDLE句柄,在程序中可以用于创立线程,但对于其实现原理还不是很清晰,当前只是机械合法使用它。
另一方面对于Sleep( )函数理解也不够深刻,在本程序中使用次函数目重要是为了进行成果输出时可以将成果以此逐渐输出,而不是使成果一次性输出出来,对其在各线程之间是如何进行操作并不是很清晰。
最后在运营界面设计上有些过于简朴,输出信息并不是很详细,与网上某些比较成熟进程同步其她模型实现运营界面相比是比较简陋,各线程在使用过资源后,资源内部状况,各信号量变化并没有很详细显示出来,固然在后来设计中会更加完善。
6.3本次课程设计收获
本程序是用来实现进程同步模型系统,其核心某些就是如何运用P V原语原理以及C++编程语言将线程同步与互斥操作实现。
因此实现这一功能只需要将线程这一概念理解清晰并纯熟运用即可,并不需要其她非常复杂数据构造和编译环境。
对于我而言重点则在于对线程这一数据构造理解。
刚开始设计该程序时候,虽然拥有了了线程同步与互斥理论基本和P V原语实现原理,但对于这些知识详细实现还是没有头绪,在查阅了诸多关于生产者消费者某些源程序后,看到了关于线程等某些数据构造定义、创立和用法,但还是由于没有像书上那样进行解说因此并没有看懂,因此在找不到有关源程序后,我查阅了与VC++有关书籍,在仔细学习了线程这一数据构造之后,便对于那些典型生产者消费者问题有进一步理解。
这个程序编写是在《VC++ 进一步详解》这本书中关于简朴多线程程序一种例子基本上改编过来,这个例子只是实现了几种简朴多线程互斥操作,因此我运用P V原语原理在互斥基本上添加了同步操作成分。
固然也只是将最基本同步
操作实现语句添加了进去。
但是在调试编译之后便成功运营了。
这次课程设计让我初步理解了线程有关知识,并将进程同步这一进程之间操作实现了,对我自己来说是一种小小突破,理解了线程这一重要概念之后对于我此后更进一步理解计算机各种操作系统运营有了很大协助。
固然在此后一段时间里,我不但要充分理解课本上知识更要进一步扩展自己在这方面知识面,为后来自己可以纯熟应用做准备。
与此同步,我要多进行代码编写,这样不但可以锻炼自己解决实际问题能力,同步还可以锻炼自己从整体上分析和设计程序能力。
6.4其她办法
进程同步实现可以使用2种办法,一是在windows系统环境下使用线程来实现,二是在linux系统环境下使用进程来实现。
由于在我自己电脑上只安装了windows操作系统,因此使用是第一种办法。
固然如果安装了linux操作系统话,更应当在该系统下运用进程来实现,这样做可以更好理解和消化教师在课上所讲和各次实验内容所涉及到知识。
虽然实现环境和办法不同,但这2种办法都可以较好实现进程同步模型功能。
7、参照文献
(1)闵联营、何克右《C++程序设计教程》武汉理工大学出版社7月第1版(2)张尧学、史美林、张高《计算机操作系统教程》(第三版) 清华大学出版社.10月第3版
(3)宋坤、刘锐宁、李伟明《Visual C++开发技术大全》人民邮电出版社3月第1版
(4)孙鑫、余安萍《VC++ 进一步详解》电子工业出版社4月第1版。