




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
操作系统课程设计课 程 设 计课程设计任务书学生姓名: 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函数参数说明参 数描 述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.1 main函数 开始 创建互斥信号mutex 创建empty、apple和orange3个信号量创建mother线程,并执行该线程创建father线程,并执行该线程创建daughter线程,并执行该线程创建son线程,并执行该线程销毁各线程结束3.2.2 father、mother线程设置empty信号量,使其1设置mutex互斥信号,使其置0执行putapple( )或者putorange( )函数设置mutex互斥信号,使其恢复为0设置apple或者orange信号量,使其+13.2.3 son、daughter线程设置apple或者orange信号量使其恢复为原来的值,0设置mutex互斥信号,使其置0执行getapple( )或者getorange( )函数设置mutex互斥信号,使其置1设置empty信号量,使其恢复为24、编程实现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主函数的程序代码void main()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线程实现while(1)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+相关的书籍,在仔细学习了线程这一数据结
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 社区水域巡查管理办法
- 疫情期间聚众管理办法
- 纪检特别经费管理办法
- 税务风险等级管理办法
- 税收监管项目管理办法
- 企业安全用电专题培训课件
- 统编版 语文 四年级 下册《 黄继光 》教学教案
- 2025城管执法综合考试试卷
- 2025年重庆高级导游等级考试(导游综合知识)考前冲刺试题及答案
- 出纳岗位安全生产培训课件
- 2025四川泸州市江阳区医疗卫生辅助岗位招募25人考试模拟试题及答案解析
- 项目可行性研究报告评估咨询管理服务方案投标文件(技术方案)
- 矿山设备安全知识培训课件
- 2025年大学英语六级写作与翻译练习题及详解
- 2025年事业单位工勤技能-广东-广东水生产处理工一级(高级技师)历年参考题库典型考点含答案解析
- 基础装修专业知识培训课件
- 公共机构建筑能源审计和能耗基准值技术服务方案投标文件(技术标)
- 2025-2026学年人教PEP版(2024)小学英语四年级上册教学计划及进度表
- 数据中心机房空调系统设计方案
- 校长在2025年秋季开学第一次全体教师大会上的讲话:顺时而为造势而上燃光而行守念而稳
- 塔山煤矿班组建设模式课件
评论
0/150
提交评论