操作系统读者写着问题_第1页
操作系统读者写着问题_第2页
操作系统读者写着问题_第3页
操作系统读者写着问题_第4页
操作系统读者写着问题_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

课程设计报告课程名称 课题名称 专 业 通信工程 班 级 1001班 学号 201003040111 姓 名 刘新超 指导教师 田娟秀、颜国风、李杰君2013年7月5日湖南工程学院课程设计任务书课程名称 操作系统教程课题模拟读者写者问题专业班级 通信1001班 学生姓名 刘新超 学号 201003040111 指导老师 田娟秀、颜国风、李杰君审批 任务书下达日期2013年6月24日任务完成日期2013年7月5日一、设计内容与设计要求1设计内容:课题5:模拟实现读者写者问题读者写者问题是一个经典的并发程序设计问题,是经常出现的一种同步问题。所谓读者写者问题,是指保证一个writer进程必须与其他进程互斥地访问共享对象的同步问题。读者写者问题可以这样的描述,有一群写者和一群读者,写者在写同一本书,读者也在读这本书,多个读者可以同时读这本书,但是,只能有一个写者在写书,并且,读者比写者优先,也就是说,读者和写者同时提出请求时,读者优先。当读者提出请求时需要有一个互斥操作,另外,需要有一个信号量S来当前是否可操作。2选题方案:所选题目根据学号确定,学号模7加1,即(学号%7+1)。如你的学号为9,则所选题目号为:9%7+1=(题目3)。3设计要求:3.1课程设计报告规范(1) 需求分析程序的功能。^输入输出的要求。(2) 概要设计程序由哪些模块组成以及模块之间的层次结构、各模块的调用关系;每个模块的功能。课题涉及的数据结构和数据库结构;即要存储什么数据,这些数据是什么样的结构,它们之间有什么关系等。(3) 详细设计采用C语言定义相关的数据类型。写出各模块的类C码算法。画出各函数的调用关系图、主要函数的流程图。(4) 调试分析以及设计体会a.测试数据:准备典型的测试数据和测试方案,包括正确的输入及输出结果和

含有错误的输入及输出结果。程序调试中遇到的问题以及解决问题的方法。课程设计过程经验教训、心得体会。(5) 使用说明用户使用手册:说明如何使用你编写的程序,详细列出每一步的操作步骤。(6) 书写格式设计报告要求用A4纸打印成册:一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。(7) 附录源程序清单(带注释)3.2考核方式指导老师负责验收程序的运行结果,并结合学生的工作态度、实际动手能力、创新精神和设计报告等进行综合考评,并按优秀、良好、中等、及格和不及格五个等级给出每位同学的课程设计成绩。具体考核标准包含以下几个部分:(1) 平时出勤(占10%)(2) 系统需求分析、功能设计、数据结构设计及程序总体结构合理与否(占10%)(3) 程序能否完整、准确地运行,个人能否独立、熟练地调试程序(占40%)(4) 设计报告(占30%)注意:不得抄袭他人的报告(或给他人抄袭),一旦发现,成绩为零分。(5) 独立完成情况(占10%)。3.3课程验收要求(1) 运行所设计的系统。(2) 回答有关问题。(3) 提交课程设计报告。(4) 提交软盘(源程序、设计报告文档)。(5) 依内容的创新程度,完善程序情况及对程序讲解情况打分。二、进度安排第19周:星期一星期二星期三第19周:星期一星期二星期三8:00——12:008:00——12:0014:30——18:30上机上机上机TOC\o"1-5"\h\z\o"CurrentDocument"1课题的主要功能 III\o"CurrentDocument"2课题的功能模块的划分 IV\o"CurrentDocument"2.1线程的创建 IV\o"CurrentDocument"2.2实现信号量互斥和同步 IV\o"CurrentDocument"2.3信号量控制 IV\o"CurrentDocument"2.4读写过程 V\o"CurrentDocument"2.5结构体创建 V\o"CurrentDocument"2.6各个模块图 V\o"CurrentDocument"3主要功能实现 VI4程序调试 VII\o"CurrentDocument"总结 VIII\o"CurrentDocument"附件 IX\o"CurrentDocument"7评分表 XIII1课题的主要功能课题描述:模拟实现读者写者问题模拟操作:读者写者问题是一个经典的并发程序设计问题,是经常出现的一种同步问题。所谓读者写者问题,是指保证一个writer进程必须与其他进程互斥地访问共享对象的同步问题。读者写者问题可以这样的描述,有一群写者和一群读者,写者在写同一本书,读者也在读这本书,多个读者可以同时读这本书,但是,只能有一个写者在写书,并且,读者比写者优先,也就是说,读者和写者同时提出请求时,读者优先。当读者提出请求时需要有一个互斥操作,另外,需要有一个信号量S来当前是否可操作。

2课题的功能模块的划分2.1线程的创建线程的创建主要用到windowsAPICreateThread完成线程创建,在调用进程的地址空间创建一个个线程,以执行指定的函数;它的返回值为所创建线程的句柄。CreateThread(LPSECURITY_ATTRIBUTESIpThreadAttributes,//线程安全属性指针,默认为NULLDWORDdwStackSize,//堆栈大小LPTHREAD_START_ROUTINElpStartAddress,//线程函数LPVOIDlpParameter,//线程参数,默认为NULLDWORDdwCreationFlags, //线程创建属性,默认为0LPDWORDlpThreadId //线程ID);2.2实现信号量互斥和同步CreateSemaphore用于创建信号量,根据参数的不同可以利用它实现互斥和同步。ReleaseSemaphore用于释放信号量,使用后相应的信号量加1CreateSemaphore(LPSECURITY_ATTRIBUTESIpSemaphoreAttributes,LONG,lInitialCount,LONG,lMaximumCount,LONG,lInitialCount,LONG,lMaximumCount,LPCTSTRlpName);ReleaseSemaphore(HANDLEhSemaphore,LONGlRelseaseCount,LPLONGlpPreviousCount);//initialcount//maximumcount//objectname//handletosemaphore//contincrementamount//previouscount2.3信号量控制WaitForSingleObject可在指定的时间内等待指定对象为可用状态;DWORDWaitForSingleObject(HANDLEhHandle, //handletoobjectDWORDdwMilliseconds//time-outinterval);hHandle为等待的对象,也就是实现同步或者互斥的对象。该函数一执行,相应的信号量就减去1,如果信号量小于等于0,那么他一直在循环。等于执行P操作。ReleaseSemaphore(g_hWriteSemaphore,1,NULL);//此时没有读者,可以写

实现同步或者互斥的对象。该函数一执行,相应的信号量就加上1,如果信号量小于等于0,那么他一直在循环。等于执行V操作。2.4读写过程DWORDWINAPIWriterProc(LPVOIDIpParam)函数是表示写的过程,当有信号出发就可以进行写过程,当已经有一个写者正在写时,它和其他的写者,读者是互斥的。DWORDWINAPIReaderProc(LPVOIDlpParam)函数是表示读的过程,当有信号出发就可以进行读过程,当已经有一个读者正在读时,它和其他的写者是互斥的,和其他的读者是共用的。2.5 结构体创建typedefstruct_Person{HANDLEm_hThread;//定义处理线程的句柄intm_nType;//进程类型(读写)intm_nStartTime;//开始时间intm_nWorkTime;//运行时间intm_nID;//进程号}Person;创建一个结构体主要定义一个线程所要的各个参数属性,方便读取。intg_PersonLists[]={W,s项),s项),2,W,s_j(),s_j(),3,R,s_j(),s_j(),W,s_j(),,5,R,s_j(),s_j(),6,R,s_j(),s_j(),END,};〃队列在这里定义一个队列,可以初始化线程,创建线程是它的线程参数属性都是从队列里进行读取,这个一共有六个线程,三个读,三个写。另外,定义的到达时间,执行时间是用随机函数产生s_j()。2.6各个模块图创建信号量CreateSemaphorMain函数调CreateReader创建读者与写者CreatePersonList调用CreateWriter创建写着DWORD创建读调用DWINAPIDWORD创建读调用DWINAPIReaderProc写过程WORD调WINAPIReaderProc读过程图1各个模块图功能及调用关系3主要功能实现图3程序调试结果说明:根据程序执行的结果我们可以推导出创建的六个线程他们的执行顺序,执行时间。读者6先到申请资源此时6开始读取,当读到第2秒时,写者1开始申请资源,读者的优先级比较高,写者1等待。当读到第4秒时,读者3开始申请资源,读者与读者是共用关系,所以读者3开始读取,写者4也开始申请资源,读者的优先级比较高,写者4等待。当读到第5秒时,读者6执行时间到就退出,读者3继续读取,写者2也开始申请资源,读者的优先级比较高,写者2等待。当读到第8秒时,读者5申请资源,读者与读者是共用关系,所以读者5开始读取,读者3执行时间到就退出。当读到第10秒时,读者5执行时间到就退出。此时写者1开始写入。当读到第14秒时,写者1执行时间到就退出。此时写者4开始写入。当读到第20秒时,写者4执行时间到就退出。此时写者2开始写入。此时执行结束。得到的队列表:intg_PersonLists[]={W,2,3,W,6,3,R,4,4,W,4,5,R,8,2,R,1,4,END,}5总结操作系统课设,三天的时间,终于给完成了。在这三天的时间里,我完成了用操作系统知识做一个模拟读者写着问题的课设。从开始的无头无续,到中间时期的疑惑不解,再到最后的极大欢喜,感觉这个课设经历了整个人生的大起大落。无可厚非,这正是我们要走的路。这段时间挺难熬的,在自己的努力,以及老师还有同学的帮助下,我终于完成了这次艰难的课程设计。在这次设计中,我遇到了很多的问题,首先,线程的创建:CreateThread()函数的不理解包括:所要求的参数,传值参数的不明白,返回值不会用,线程创建属性不理解。其次。CreateSemaphore用于创建信号量,根据参数的不同可以利用它实现互斥和同步。WaitForSingleObject可在指定的时间内等待指定对象为可用状态,等于执行P操作。ReleaseSemaphore用于释放信号量,等于执行V操作。这些函数开始不懂。再次,创建的线程取值方式不正确。最后,就是得到的结果有些不是很正确,调试一下就行了这些问题一一解决后,整个课设的就完成了。通过这次课设我知道了有时候我们对一件事物一点都不理解,这没关系,我们要能耐得住寂寞,沉得下心,对我们未知的进行不断地摸索才能掌握新的知识;最后我发现我们要学习的东西还很多,要坚持努力,不断完善自己。最后,我要感谢我们的课设老师田娟秀老师和颜国风老师,在这三天对我们的指导,不顾炎炎烈日,对我们的认真负责,以及谆谆教诲。老师你们辛苦。6附件#include<windows.h>#include<ctype.h>#include<stdio.h>#include<string.h>#include<stdlib.h>#include<malloc.h>#include<time.h>#defineMAX_PERSON100#defineREADER0 〃读者#defineWRITER1 〃写者#defineEND-1#defineRREADER#defineWWRITERints(){inti;srand(unsigned(time(NULL)));i=1+rand()%12;return(i);}typedefstruct_Person{HANDLEm_hThread; 〃定义处理线程的句柄intm_nID;〃进程号intm_nType;〃进程类型(读写)intm_nStartTime;〃开始时间intm_nWorkTime;〃运行时间}Person;Persong_Persons[MAX_PERSON];intg_NumPerson=0;longg_CurrentTime=0;//基本时间片数intg_PersonLists[]={W,s(),s(),W,s(),s(),R,s(),s(),W,s(),s(),R,s(),s(),R,s(),s(),END,};intg_NumOfReading=0;intg_NumOfWriteRequest=0;//申请写进程的个数HANDLEg_hReadSemaphore;//读者信号HANDLEg_hWriteSemaphore;//写者信号boolfinished=false;//所有的读完成boolwfinished=false;〃所有的写完成voidCreatePersonList(int*pPersonList);boolCreateReader(intStartTime,intWorkTime,intID);boolCreateWriter(intStartTime,intWorkTime,intID);DWORDWINAPIReaderProc(LPVOIDlpParam);DWORDWINAPIWriterProc(LPVOIDlpParam);intmain(){g_hReadSemaphore=CreateSemaphore(NULL,1,100,NULL);g_hWriteSemaphore=CreateSemaphore(NULL,1,100,NULL);printf(" 初始化 \n");Sleep(1000);printf("开始.......\n");CreatePersonList(g_PersonLists);〃创建读者与写者g_CurrentTime=0;while(true){g_CurrentTime++;Sleep(500);printf("时间/s=%d\n",g_CurrentTime);if(finished)return0;}return0;}voidCreatePersonList(int*pPersonLists){inti=0;int*pList=pPersonLists;boolRet;while(pList[0]!=END){switch(pList[1]){caseR:Ret=CreateReader(pList[2],pList[3],pList[0]);break;caseW:Ret=CreateWriter(pList[2],pList[3],pList[0]);break;}if(!Ret)printf("创建%d失败\n”,pList[0]);pList+=4;//movetonextpersonlist}}boolCreateReader(intStartTime,intWorkTime,intID){if(g_NumPerson>=MAX_PERSON)returnfalse;Person*pPerson=&g_Persons[g_NumPerson];pPerson->m_nID=ID;pPerson->m_nStartTime=StartTime;pPerson->m_nWorkTime=WorkTime;pPerson->m_nType=READER;g_NumPerson++;pPerson->m_hThread=CreateThread(NULL,0,ReaderProc,(LPVOID)pPerson,0,NULL);//创建新线程if(pPerson->m_hThread==NULL)returnfalse;returntrue;}boolCreateWriter(intStartTime,intWorkTime,intID){if(g_NumPerson>=MAX_PERSON)returnfalse;Person*pPerson=&g_Persons[g_NumPerson];pPerson->m_nID=ID;pPerson->m_nStartTime=StartTime;pPerson->m_nWorkTime=WorkTime;pPerson->m_nType=WRITER;g_NumPerson++;pPerson->m_hThread=CreateThread(NULL,0,WriterProc,(LPVOID)pPerson,0,NULL);〃创建新线程if(pPerson->m_hThread==NULL)returnfalse;returntrue;}DWORDWINAPIReaderProc(LPVOIDlpParam)//读过程{Person*pPerson=(Person*)lpParam;while(g_CurrentTime!=pPerson->m_nStartTime)//等待开始{}printf("%d读者申请资源...\n”,pPerson->m_nID);WaitForSingleObject(g_hReadSemaphore,INFINITE); //等待对象被触发信号if(g_NumOfReading==0){WaitForSingleObject(g_hWriteSemaphore,INFINITE);}g_NumOfReading++;ReleaseSemaphore(g_hReadSemaphore,1,NULL);pPerson->m_nStartTime=g_CurrentTime;printf("%d 正在读取.....\n”,pPerson->m_nID);while(g_CurrentTime<=pPerson->m_nStartTime+pPerson->m_nWorkTime){}printf("%d读者退出\n",pPerson->m_n

温馨提示

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

评论

0/150

提交评论