进程之间的同步互斥与通信理发师问题操作系统_第1页
进程之间的同步互斥与通信理发师问题操作系统_第2页
进程之间的同步互斥与通信理发师问题操作系统_第3页
进程之间的同步互斥与通信理发师问题操作系统_第4页
进程之间的同步互斥与通信理发师问题操作系统_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

信息科学与工程学院软件实践实训报告PAGEPAGE3操作系统课程设计目录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便很好的解决了这一个问题,两个进程在操作缓存区之前必须先申请使用,如果信号量表示已有进程正在对缓存区进行操作则必须等待其完成方可。在做这个设计的时候也遇到了许多问题,例如信号量的设置。由于这个问题中不仅涉及到理发师与顾客之间的互斥同步问题,还设计到各个顾客进程之间的互斥同步问题,所以起初信号量设置不足而导致问题出错。总的来讲,此次课程设计对我们操作系统知识的巩固起了重要作用,让我们受到了很多启发,懂得了怎样更好的去学习操作系统课程。操作系统不在是一个模糊的概念存在,许多实际的例子,问题都能涉及到操作系统方面的知识。这也看出了操作系统对于整个计算机学科的重要性,他不单单作为一个学科存在,而是渗透到各个学科中,作为各个学科的基础甚至提升。虽然本次的设计不够完善,但我觉得自己获得的东西远远超过这个设计的内容。

论大学生写作能力写作能力是对自己所积累的信息进行选择、提取、加工、改造并将之形成为书面文字的能力。积累是写作的基础,积累越厚实,写作就越有基础,文章就能根深叶茂开奇葩。没有积累,胸无点墨,怎么也不会写出作文来的。写作能力是每个大学生必须具备的能力。从目前高校整体情况上看,大学生的写作能力较为欠缺。一、大学生应用文写作能力的定义那么,大学生的写作能力究竟是指什么呢?叶圣陶先生曾经说过,“大学毕业生不一定能写小说诗歌,但是一定要写工作和生活中实用的文章,而且非写得既通顺又扎实不可。”对于大学生的写作能力应包含什么,可能有多种理解,但从叶圣陶先生的谈话中,我认为:大学生写作能力应包括应用写作能力和文学写作能力,而前者是必须的,后者是“不一定”要具备,能具备则更好。众所周知,对于大学生来说,是要写毕业论文的,我认为写作论文的能力可以包含在应用写作能力之中。大学生写作能力的体现,也往往是在撰写毕业论文中集中体现出来的。本科毕业论文无论是对于学生个人还是对于院系和学校来说,都是十分重要的。如何提高本科毕业论文的质量和水平,就成为教育行政部门和高校都很重视的一个重要课题。如何提高大学生的写作能力的问题必须得到社会的广泛关注,并且提出对策去实施解决。二、造成大学生应用文写作困境的原因:(一)大学写作课开设结构不合理。就目前中国多数高校的学科设置来看,除了中文专业会系统开设写作的系列课程外,其他专业的学生都只开设了普及性的《大学语文》课。学生写作能力的提高是一项艰巨复杂的任务,而我们的课程设置仅把这一任务交给了大学语文教师,可大学语文教师既要在有限课时时间内普及相关经典名著知识,又要适度提高学生的鉴赏能力,且要教会学生写作规律并提高写作能力,任务之重实难完成。(二)对实用写作的普遍性不重视。“大学语文”教育已经被严重地“边缘化”。目前对中国语文的态度淡漠,而是呈现出全民学英语的大好势头。中小学如此,大学更是如此。对我们的母语中国语文,在大学反而被漠视,没有相关的课程的设置,没有系统的学习实践训练。这其实是国人的一种偏见。应用写作有它自身的规律和方法。一个人学问很大,会写小说、诗歌、戏剧等,但如果不晓得应用文写作的特点和方法,他就写不好应用文。(三)部分大学生学习态度不端正。很多非中文专业的大学生对写作的学习和训练都只是集中在《大学语文》这一门课上,大部分学生只愿意被动地接受大学语文老师所讲授的文学经典故事,而对于需要学生动手动脑去写的作文,却是尽可能应付差事,这样势必不能让大学生的写作水平有所提高。(四)教师的实践性教学不强。学生写作能力的提高是一项艰巨复杂的任务,但在教学中有不少教师过多注重理论知识,实践性教学环节却往往被忽视。理论讲了一大堆,但是实践却几乎没有,训练也少得可怜。阅读与写作都需要很强的实践操作,学习理论固然必不可少,但是阅读方法和写作技巧的掌握才是最重要的。由于以上的原因,我们的大学生的写作水平着实令人堪忧,那么如何走出这一困境,笔者提出一些建议,希望能对大学生写作水平的提高有所帮助。三、提高大学生应用写作能力的对策(一)把《应用写作》课设置为

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论