版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
信息科学与工程学院软件实践实训报告PAGEPAGE12操作系统课程设计目录TOC\o"1-3"\h\z1.课程设计目的 32.设计要求 33.问题具体描述 34.设计分析 35.设计分工 46.数据结构说明 47.系统结构说明 48.系统调用说明 49.分工设计说明 510.算法流程图 511.分工代码 612.整体代码 713.程序运行 1014.总结 11课程设计目的1.内容围绕操作系统原理中最重要的基本概念和基本原理展开2.巩固对原理知识的学习效果3.加深对基本概念的理解4.学习如何将基本原理和实际设计、应用有机结合5.锻炼本专业的基本能力设计要求1:进程间通信、并发(同步/互斥)、文件读写2:内存管理、Dll、Windows消息机制、IO(尚未最终定型)问题具体描述1.完成N个生产者和M个消费者之间的并发控制,N、M不低于5,数据发送和接收缓冲区大小不小于10个。2.某个生产者进程生产的消息供K个消费者进程消费。K《=M。某些消费进程消费多个生产者生产的消息。生产者和消费者之间的对应关系可以在程序开始有一个文件中读入,也可以动态调整。3.每个生产进程生产M个消息后结束运行。如果一个消费者进程没有对应的生产者进程在运行后,也结束运行。设计分析课程设计的主要目的是了解并且掌握进程之间的同步互斥,和进程之间的通信问题。结合课本上的生产者与消费者问题可以从这方面来实现一个多进程的小系统,并且解决多个进程之间的通信,并发等问题,以此来达到课程设计的目的。理发师问题是将顾客看做生产者,将理发师作为消费者。设置一定数量的椅子的数目来作为缓存区的大小。顾客来到的时候坐在椅子上,将自己作为“产品”,理发师理发的时候从椅子上叫走顾客,相当于消费“产品”,从而达到了课程设计要求的前一个要求。顾客作为生产者,每到来一个就使计数器count增加1,以便让理发师理发(相当于消费)至最后一个顾客(相当于产品)。并且,第1个到来的顾客应负责唤醒理发师;如果不是第1个到达的顾客,则在有空椅子的情况下坐下等待,否则离开理发店(该消息可由计数器count获得)。主要有以下一些函数来实现整个问题的实现过程:用随机函数random()来产生进入理发店的顾客。 (2)定义理发师的理发函数cuthair()用来实现理发操作。(3)定义顾客被理发的函数gethaircut()用来实现顾客被理发的操作。(4)用顾客线程customer实现对顾客行为的控制。(5)用理发师线程barber实现对理发师行为的控制。(6)定义主函数main实现对两个线程的控制和执行操作。设计分工成员:李宁侯绍立分工:理发师进程、信号量的设置、理发师函数:xxx顾客进程、顾客函数、主函数:xx数据结构说明本程序用到了数据结构中的队列,理发的顾客由随机函数产生,顾客遵从先到先理发的原则,但队列的长度限制为输入的理发店中的椅子的个数,当理发店的椅子没有空位的时候,到来的顾客主动退出加入队列。理发师对队列中的顾客进行先到先服务的原则理发。7.系统结构说明(一)头文件声明#include"windows.h"#include"iostream.h"#include"math.h"(二)定义各种变量intlongwaiting(0);intchairs;charopen_door;charclose_door;intcount(0);intfinish(0);(三)信号量的定义HANDLEMutex=::CreateMutex(NULL,FALSE,"Mutex");HANDLEbarbers=::CreateSemaphore(NULL,1,1,"barbers");HANDLEcustomers=::CreateSemaphore(NULL,0,3,"customers");8.系统调用说明(1)CreateThread():创建线程(2)CreateMutex():找出当前系统是否已经存在指定进程的实例。如果没有则创建一个互斥体,用来同步。如果一个线程获取了互斥体,则要获取该互斥体的第二个线程将被挂起,直到第一个线程释放该互斥体。CreateMutex()函数可用来创建一个有名或无名的互斥量对象(3)CreateSemaphore():CreateSemaphore()是系统提供的API,包含在Windows.h中,应用在同步的处理中。作用是创建一个新的信号机,执行成功,返回信号机对象的句柄;零表示出错。一旦不再需要,一定记住用CloseHandle关闭信号机的句柄。它的所有句柄都关闭以后,对象自己也会删除。一旦值大于零,信号机就会触发(发出信号)。Semaphore是一个同步问题机制,不论是Event或Mutex,其他Process在执WaitForSingleObject时,就看当时的物件是Signal或UnSignal而决定是否等待,而Semaphore也相同,但是它要变成Signal/UnSignal的状态,却有些不同,它是提供一个计数值,它允许在这个计数值之内,任何执行到WaitForSingleObject的Thread都不会停下来,而且每执行WaitForSingleObject一次,计数值就减一,当计数值变成0时,该Semaphore才会处於UnSignal的状态,而某个ThreadReleaseSemaphore时,便会将计数值增加,以便其他的Thread或本身可得Signal的讯号,而使WaitForSingleObject停止等待。(4)ReleaseSemaphore():ReleaseSemaphore()函数的作用是增加信号机的计数。如果成功,就调用信号机上的一个等待函数来减少它的计数。(5)WaitForSingleObject():函数用来检测hHandle事件的信号状态,在某一线程中调用该函数时,线程暂时挂起,如果在挂起的dwMilliseconds毫秒内,线程所等待的对象变为有信号状态,则该函数立即返回;如果超时时间已经到达dwMilliseconds毫秒,但hHandle所指向的对象还没有变成有信号状态,函数照样返回。参数dwMilliseconds有两个具有特殊意义的值:0和INFINITE。若为0,则该函数立即返回;若为INFINITE,则线程一直被挂起,直到hHandle所指向的对象变为有信号状态时为止。(6)ResumeThread():线程恢复函数,使用该函数能激活线程的运行,使CPU分配资源让线程恢复运行。(7)ReleaseMutex():释放由线程拥有的一个互斥体(8)Sleep():睡眠等待9.分工设计说明需要用到的信号量:HANDLEMutex=::CreateMutex(NULL,FALSE,"Mutex");实现顾客与理发师对公用缓存区的互斥操作HANDLEbarbers=::CreateSemaphore(NULL,1,1,"barbers");HANDLEcustomers=::CreateSemaphore(NULL,0,3,"customers");::WaitForSingleObject(customers,INFINITE);等待顾客进程的V(customer)操作::WaitForSingleObject(Mutex,INFINITE);申请操作顾客与理发师公用的缓存区::ReleaseSemaphore(barbers,1,NULL);释放信号量barbers::ReleaseMutex(Mutex);释放信号量Mutex,允许顾客操作缓存区算法流程图程序开始程序开始键入店中的椅子数键入店中的椅子数是否开始接待顾客是否开始接待顾客尚未营业尚未营业Mutex理发师线程True顾客线程False椅等待是离开有顾客等待休息否理发师在睡觉则唤醒理发,否则继续是分工代码#include"windows.h"#include"iostream.h"#include"math.h"intlongwaiting(0);//等待理发的顾客人数intchairs;//店中椅子的总数目charopen_door;//开门charclose_door;//关门intcount(0);//顾客的序号intfinish(0);//已经理完发的顾客人数DWORDa;HANDLEMutex=::CreateMutex(NULL,FALSE,"Mutex");//用来实现进程的互斥HANDLEbarbers=::CreateSemaphore(NULL,1,1,"barbers");//定义信号量来进行线程间的同步HANDLEcustomers=::CreateSemaphore(NULL,0,3,"customers");//定义信号量来进行线程间的同步intrandom()//定义随机函数来产生顾客,并使两个顾客间的时间少于15秒{return(rand()*15000)/RAND_MAX;}voidcuthair()//理发师的理发函数,用时15秒{ ::Sleep(15000); cout<<"理发结束!"<<endl;}DWORDWINAPIbarber(LPVOIDpParm1)//理发师线程{while(true){ ::WaitForSingleObject(customers,INFINITE);//p(customers),等待顾客 ::WaitForSingleObject(Mutex,INFINITE);//等待互斥量waiting--;//等待的人数减1 ::ReleaseSemaphore(barbers,1,NULL);//释放信号量 ::ResumeThread(barbers);//唤醒顾客进程 ::ReleaseMutex(Mutex);//v(mutex); cuthair(); finish++;}return0;}整体代码#include"windows.h"#include"iostream.h"#include"math.h"intlongwaiting(0);//等待理发的顾客人数intchairs;//店中椅子的总数目charopen_door;//开门charclose_door;//关门intcount(0);//顾客的序号intfinish(0);//已经理完发的顾客人数DWORDa;HANDLEMutex=::CreateMutex(NULL,FALSE,"Mutex");//用来实现进程的互斥HANDLEbarbers=::CreateSemaphore(NULL,1,1,"barbers");//定义信号量来进行线程间的同步HANDLEcustomers=::CreateSemaphore(NULL,0,3,"customers");//定义信号量来进行线程间的同步intrandom()//定义随机函数来产生顾客,并使两个顾客间的时间少于15秒{return(rand()*15000)/RAND_MAX;}voidcuthair()//理发师的理发函数,用时15秒{ ::Sleep(15000); cout<<"理发结束!"<<endl;}voidgethaircut()//顾客被理发的函数{ ::Sleep(15001);//顾客被理发的函数,为了和理发师之间有所区别,比理发师理发时间长1毫秒 cout<<"第"<<finish<<"个顾客理发完毕,离开"<<endl;}DWORDWINAPIcustomer(LPVOIDpParm2)//顾客线程{ ::WaitForSingleObject(Mutex,INFINITE);//P(mutex)来进行互斥操作 count++;//来的是第几个顾客 cout<<"顾客敲门!第"<<count<<"个顾客到来"<<endl; if(waiting<chairs)//如果有空椅子 { if(waiting!=0) { cout<<"现在有"<<waiting<<"个人在等待理发"<<endl; } else cout<<"无人在等待理发"<<endl;//输出有多少人在等待 waiting++; cout<<"剩余"<<chairs-waiting+1<<"个座位"<<endl; cout<<"有空位,顾客已坐下"<<endl; ::ReleaseSemaphore(customers,1,NULL); //V(customer) ::ResumeThread(customers); //唤醒理发师进程 ::ReleaseMutex(Mutex); //释放互斥量,以便其他线程使用 ::WaitForSingleObject(barbers,INFINITE);//等待理发 gethaircut(); } else { cout<<"没有空椅子,第"<<count<<"个顾客离开理发店"<<endl;//没有椅子,顾客直接离开 ::ReleaseMutex(Mutex); }return0;}DWORDWINAPIbarber(LPVOIDpParm1)//理发师线程{while(true){ ::WaitForSingleObject(customers,INFINITE);//p(customers),等待顾客 ::WaitForSingleObject(Mutex,INFINITE);//等待互斥量waiting--;//等待的人数减1 ::ReleaseSemaphore(barbers,1,NULL);//释放信号量 ::ResumeThread(barbers);//唤醒顾客进程 ::ReleaseMutex(Mutex);//v(mutex); cuthair(); finish++;}return0;}intmain(intargc,char*argv[])//实现线程的操作{cout<<"输入理发店中的椅子个数:"; cin>>chairs; cout<<"店中有"<<chairs<<"把椅子"<<endl;//设置椅子数目 cout<<"是否开始接待顾客?Y/N"<<endl;//是否开门营业 cin>>open_door; while(open_door!='y') { cout<<endl<<"尚未营业!"<<endl; cout<<"是否开始接待顾客?Y/N"<<endl; cin>>open_door; } HANDLEhThread1; HANDLEhThread2; hThread2=::CreateThread(NULL,0,barber,NULL,0,NULL);//产生一个理发师进程 while(close_door!='y') { ::Sleep(random());//函数实现顾客随机到来 hThread1=::CreateThread(NULL,0,customer,NULL,a,NULL); cout<<endl<<"正在营业,请进!"<<endl; if(finish>=8&&waiting==0) //如果完成数超过8并且没有人等待 { cout<<"已经为"<<finish<<"个顾客理发了,是否停止营业?"<<endl;//提示是否关门cin>>close_door; returnclose_door; } }if(close_door=='y'){ cout<<"暂停营业!欢迎下次光临!"<<endl;return0;} return0;}程序运行开始输入椅子数目选择是否接待顾客接待顾客理发完毕总结通过这个课程设计,对于课本上的关于进程之间的同步、互斥有了更深层的认识,而且有了具体上直观上的理解。虽然对于第二个课程设计要求没有达到,但我也学到了许多。进程作为系统的基本的操作单位,其之间的互斥、同步是非常重要的。生产者与消费者这一个问题中,生产者与消费者公用一个缓存区,这就涉及到了两个进程对缓存区的互斥操作,否者将会产生许多不切实际的问题,这也就失去的系统操作的实际意义。而通过一个互斥信号量Mutex便很好的解决了这一个问题,两个进程在操作缓存区之前必须先申请使用,如果信号量表示已有进程正在对缓存区进行操作则必须等待其完成方可。在做这个设计的时候也遇到了许多问题,例如信号量的设置。由于这个问题中不仅涉及到理发师与顾客之间的互斥同步问题,还设计到各个顾客进程之间的互斥同步问题,所以起初信号量设置不足而导致问题出错。总的来讲,此次课程设计对我们操作系统知识的巩固起了重要作用,让我们受到了很多启发,懂得了怎样更好的去学习操作系统课程。操作系统不在是一个模糊的概念存在,许多实际的例子,问题都能涉及到操作系统方面的知识。这也看出了操作系统对于整个计算机学科的重要性,他不单单作为一个学科存在,而是渗透到各个学科中,作为各个学科的基础甚至提升。虽然本次的设计不够完善,但我觉得自己获得的东西远远超过这个设计的内容。
社会实践报告系别:班级:学号:姓名:作为祖国未来的事业的继承人,我们这些大学生应该及早树立自己的历史责任感,提高自己的社会适应能力。假期的社会实践就是很好的锻炼自己的机会。当下,挣钱早已不是打工的唯一目的,更多的人将其视为参加社会实践、提高自身能力的机会。许多学校也积极鼓励大学生多接触社会、了解社会,一方面可以把学到的理论知识应用到实践中去,提高各方面的能力;另一方面可以积累工作经验对日后的就业大有裨益。进行社会实践,最理想的就是找到与本专业对口单位进行实习,从而提高自己的实战水平,同时可以将课本知识在实践中得到运用,从而更好的指导自己今后的学习。但是作为一名尚未毕业的大学生,由于本身具备的专业知识还十分的有限,所以我选择了打散工作为第一次社会实践的方式。目的在于熟悉社会。就职业本身而言,并无高低贵贱之分,存在即为合理。通过短短几天的打工经历可以让长期处于校园的我们对社会有一种更直观的认识。实践过程:自从走进了大学,就业问题就似乎总是围绕在我们的身边,成了说不完的话题。在现今社会,招聘会上的大字报都总写着“有经验者优先”,可还在校园里面的我们这班学子社会经验又会拥有多少呢?为了拓展自身的知识面,扩大与社会的接触面,增加个人在社会竞争中的经验,锻炼和提高自己的能力,以便在以后毕业后能真正真正走入社会,能够适应国内外的经济形势的变化,并且能够在生活和工作中很好地处理各方面的问题,我开始了我这个假期的社会实践-走进天源休闲餐厅。实践,就是把我们在学校所学的理论知识,运用到客观实际中去,使自己所学的理论知识有用武之地。只学不实践,那么所学的就等于零。理论应该与实践相结合。另一方面,实践可为以后找工作打基础。通过这段时间的实习,学到一些在学校里学不到的东西。因为环境的不同,接触的人与事不同,从中所学的东西自然就不一样了。要学会从实践中学习,从学习中实践。而且在中国的经济飞速发展,又加入了世贸,国内外经济日趋变化,每天都不断有新的东西涌现,在拥有了越来越多的机会的同时,也有了更多的挑战,前天才刚学到的知识可能在今天就已经被淘汰掉了,中国的经济越和外面接轨,对于人才的要求就会越来越高,我们不只要学好学校里所学到的知识,还要不断从生活中,实践中学其他知识,不断地从各方面武装自已,才能在竞争中突出自已,表现自已。在餐厅里,别人一眼就能把我人出是一名正在读书的学生,我问他们为什么,他们总说从我的脸上就能看出来,也许没有经历过社会的人都有我这种不知名遭遇吧!我并没有因为我在他们面前没有经验而退后,我相信我也能做的像他们一样好.我的工作是在那做传菜生,每天9点钟-下午2点再从下午的4点-晚上8:30分上班,虽然时间长了点但,热情而年轻的我并没有丝毫的感到过累,我觉得这是一种激励,明白了人生,感悟了生活,接触了社会,了解了未来.在餐厅里虽然我是以传菜为主,但我不时还要做一些工作以外的事情,有时要做一些清洁的工作,在学校里也许有老师分配说今天做些什么,明天做些什么,但在这里,不一定有人会告诉你这些,你必须自觉地去做,而且要尽自已的努力做到最好,一件工作的效率就会得到别人不同的评价。在学校,只有学习的氛围,毕竟学校是学习的场所,每一个学生都在为取得更高的成绩而努力。而这里是工作的场所,每个人都会为了获得更多的报酬而努力,无论是学习还是工作,都存在着竞争,在竞争中就要不断学习别人先进的地方,也要不断学习别人怎样做人,以提高自已的能力!记得老师曾经说过大学是一个小社会,但我总觉得校园里总少不了那份纯真,那份真诚,尽管是大学高校,学生还终归保持着学生的身份。而走进企业,接触各种各样的客户、同事、上司等等,关系复杂,但我得去面对我从未面对过的一切。记得在我校举行的招聘会上所反映出来的其中一个问题是,学生的实际操作能力与在校理论学习有一定的差距。在这次实践中,这一点我感受很深。在学校,理论的学习很多,而且是多方面的,几乎是面面俱到;而在实际工作中,可能会遇到书本上没学到的,又可能是书本上的知识一点都用不上的情况。或许工作中运用到的只是很简单的问题,只要套公式似的就能完成一项任务。有时候我会埋怨,实际操作这么简单,但为什么书本上的知识让人学得这么吃力呢?这是社会与学校脱轨了吗?也许老师是正确的,虽然大学生生活不像踏入社会,但是总算是社会的一个部分,这是不可否认的事实。但是有时也要感谢老师孜孜不倦地教导,有些问题有了有课堂上地认真消化,有平时作业作补充,我比一部人具有更高的起点,有了更多的知识层面去应付各种工作上的问题,作为一名大学生,应该懂得与社会上各方面的人交往,处理社会上所发生的各方面的事情,这就意味着大学生要注意到社会实践,社会实践必不可少。毕竟,很快我就不再是一名大学生,而是社会中的一分子,要与社会交流,为社会做贡献。只懂得纸上谈兵是远远不及的,以后的人生旅途是漫长的,为了锻炼自己成为一名合格的、对社会有用的人才.很多在学校读书的人都说宁愿出去工作,不愿在校读书;而已在社会的人都宁愿回校读书。我们上学,学习先进的科学知识,为的都是将来走进社会,献出自己的一份力量,我们应该在今天努力掌握专业知识,明天才能更好地为社会服务。实践心得:虽然这次的实践只有短短的几天,而且从
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026广东梅州市丰顺县广顺建设投资有限公司招聘5人备考题库及答案详解1套
- 2026广东崇左凭祥市信访局编外人员招聘1人备考题库含答案详解
- 2026年黑河五大连池市社区卫生服务中心公开招聘工作人员3人备考题库及答案详解(基础+提升)
- 2026四川美术学院考核招聘31人备考题库附答案详解(轻巧夺冠)
- 2026西北政法大学专职辅导员招聘7人备考题库附答案详解(典型题)
- 2026中国铁路成都局集团有限公司招聘高校毕业生354人备考题库(三)及参考答案详解一套
- 诊疗区域卫生清洁规范
- 猕猴桃采摘分级操作技术标准
- 人员密集场所疏散逃生演练
- 联苯菊酯在茶叶生产中的安全性多维探究:从成分影响到人体健康风险评估
- 《人工智能导论:模型与算法》全套课件
- 草原防火宣传课件
- (零诊)成都市2023级(2026届)高中毕业班摸底测试英语试卷(含答案)
- 2025年中海油招聘笔试参考题库附带答案详解
- 2025年全国新高考I卷高考全国一卷真题英语试卷(真题+答案)
- 实验室认证质量管理制度
- 合同转包协议书范本
- 零基预算研究分析
- 客舱危情沟通总体方案武文燕课件
- 超星尔雅学习通《网络创业理论与实践(中国电子商务协会)》2025章节测试附答案
- 脑出血的护理讲课
评论
0/150
提交评论