进程同步模型系统的设计吃水果.docx
- 文档编号:2856189
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:13
- 大小:137.80KB
进程同步模型系统的设计吃水果.docx
《进程同步模型系统的设计吃水果.docx》由会员分享,可在线阅读,更多相关《进程同步模型系统的设计吃水果.docx(13页珍藏版)》请在冰豆网上搜索。
进程同步模型系统的设计吃水果
课程设计
课程设计任务书
学生姓名:
Miss屠专业班级:
08计科
指导教师:
王海英工作单位:
计算机科学与技术学院
题目:
进程同步模型系统的设计——吃水果问题
初始条件:
1.预备内容:
阅读操作系统的进程管理章节内容,对进程的同步和互斥,以及信号量机制度有深入的理解。
2.实践准备:
掌握一种计算机高级语言的使用。
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
1.为下面吃水果的问题创建进程并利用通信API实现进程之间的同步模型。
能够处理以下的情形:
桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。
爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,两个儿子专门等待吃盘子中的橘子,两个女儿专门等吃盘子中的苹果。
2.设计报告内容应说明:
⑴课程设计目的与功能;
⑵需求分析,数据结构或模块说明(功能与框图);
⑶源程序的主要部分;
⑷运行结果与运行情况分析;
⑸自我评价与总结:
)你认为你完成的设计哪些地方做得比较好或比较出色;
)什么地方做得不太好,以后如何改正;
)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);
)完成本题是否有其他的其他方法(如果有,简要说明该方法);
时间安排:
设计安排一周:
周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线程
线程是指进程内的一个执行单元,也是进程内的可调度实体。
单个进程在任何给定时刻,可能有不止一个线程在运行。
但进程启动的同时启动了一个线程,该线程被称作主线程或执行线程。
一个进程除启动主线程外还可以启动多个线程,每个线程都共享进程的地址空间,并且共享着进程的地址空间及各种资源。
线程可以继续创建子线程。
如果主线程退出,主线程下的所有子线程将失败。
线程的创建格式如下:
其中括号中则需要列出该函数的各形参或者实参。
该函数的返回值为线程的句柄。
HANDLECreateThread();
CreateThread函数参数说明
参数
描述
lpThreadAttibutes
指向安全属性的指针
dwStackSize
初始线程栈大小
lpStratAddress
指向线程函数的指针
lpParameter
新线程参数
dwCreationFlags
创建标志
lpThreadId
指向存放线程ID的指针
在本程序中使用了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.1main函数
3.2.2Father、Mother线程
3.2.3Son、Daughter线程
4、编程实现
4.1各线程的声明:
DWORDWINAPIFather(LPVOIDlpParameter);//Father线程
DWORDWINAPIMother(LPVOIDlpParameter);//Mother线程
DWORDWINAPISon(LPVOIDlpParameter);//Son线程
DWORDWINAPIDaughter(LPVOIDlpParameter);//Daughter线程
4.2各信号量、互斥信号和常变量
HANDLEmutex;//互斥信号mutex
HANDLEempty;//信号量empty
HANDLEapple;//信号量apple
HANDLEorange;//信号量orange
constintcontent=2;//常变量mutex
4.3个函数的声明
voidputapple();
voidputorange();
voidgetapple();
voidgetorange();
4.4主函数的程序代码
voidmain()
{
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
HANDLEhThread1;
HANDLEhThread2;
HANDLEhThread3;
HANDLEhThread4;
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各线程的程序代码
DWORDWINAPIFather(LPVOIDlpParameter)//Father线程实现
{
while
(1)
{
WaitForSingleObject(empty,INFINITE);
WaitForSingleObject(mutex,INFINITE);
putapple();
Sleep(1500);
ReleaseMutex(mutex);
ReleaseSemaphore(apple,1,NULL);
}
}
DWORDWINAPIMother(LPVOIDlpParameter)//Mother线程实现
{
while
(1)
{
WaitForSingleObject(empty,INFINITE);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 进程 同步 模型 系统 设计 水果