版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程设计任务书学院信息学院专业计算机科学与技术学生姓名学号题目读者与写者问题(进程同步问题)内容及要求:内容:读者与写者问题(进程同步问题)实验目得:了解进程同步得概念,理解信号量机制得原理,掌握信号量解决同步问题得方法,进而学会进程得同步与互斥。设计要求:编程模拟教材中讨论读者与写者得问题,要求能显示结果。任务交付:1、程序源代码;2课程设计论文及电子文档。进度安排:16周——确定题目,查找资料,上机编程;20周——上机编程调试,验收答辩,提交课程序设计报告书。指导教师(签字):年月日学院院长(签字):年月日
目录TOC\o"1—3”\h\z\uHYPERLINK\l”_Toc282439119"一、课程设计目得及要求 PAGEREF_Toc282439119\h1HYPERLINK\l”_Toc282439120"二、相关知识 PAGEREF_Toc282439120\h1HYPERLINK\l”_Toc282439121”三、题目分析 PAGEREF_Toc282439121\h2HYPERLINK\l”_Toc282439122"四、概要设计 PAGEREF_Toc282439122\h4HYPERLINK\l”_Toc282439123"五、代码及流程 PAGEREF_Toc282439123\h5HYPERLINK六、运行结果ﻩPAGEREF_Toc282439124\h11HYPERLINK\l"_Toc282439125"七、设计心得 PAGEREF_Toc282439125\h12HYPERLINK\l"_Toc282439126”八、参考文献 PAGEREF_Toc282439126\h12一、课程设计目得及要求读者与写者问题(进程同步问题)用n个线程来表示n个读者或写者。每个线程按相应测试数据文件得要求,进行读写操作。请用信号量机制分别实现读者优先与写者优先得读者-写者问题。读者—写者问题得读写操作限制:1)写—写互斥;2)读-写互斥;3)读-读允许;写者优先得附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。二、相关知识WindowsAPI:在本实验中涉及得API有:1线程控制:CreateThread完成线程创建,在调用进程得地址空间上创建一个线程,以执行指定得函数;它得返回值为所创建线程得句柄。HANDLECreateThread(LPSECURITY_ATTRIBUTESlpThreadAttributes, //SDDWORDdwStackSize,ﻩ ﻩ ﻩ //initialstacksizeLPTHREAD_START_ROUTINElpStartAddress,ﻩ//threadfunctionLPVOIDlpParameter,ﻩﻩ ﻩﻩﻩ //threadargumentDWORDdwCreationFlags, ﻩ ﻩ ﻩ//creationoptionLPDWORDlpThreadIdﻩ ﻩﻩﻩﻩ//threadidentifier);2ExitThread用于结束当前线程.VOIDExitThread(DWORDdwExitCode //exitcodeforthisthread);3Sleep可在指定得时间内挂起当前线程。VOIDSleep(DWORDdwMilliseconds//sleeptime);4信号量控制:WaitForSingleObject可在指定得时间内等待指定对象为可用状态;DWORDWaitForSingleObject(HANDLEhHandle, //handletoobjectDWORDdwMillisecondsﻩ//time-outinterval); hHandle为等待得对象,也就就是实现同步或者互斥得对象。该函数一执行,相应得信号量就减去1,如果信号量小于等于0,那么她一直在循环。5实现信号量互斥与同步CreateSemaphore用于创建信号量,根据参数得不同可以利用它实现互斥与同步.ReleaseSemaphore用于释放信号量,使用后相应得信号量加1HANDLECreateSemaphore( LPSECURITY_ATTRIBUTESlpSemaphoreAttributes,//SDﻩLONG,lInitialCount,ﻩ//initialcountﻩLONG,lMaximumCount,ﻩ//maximumcount LPCTSTRlpNameﻩ//objectnameﻩ); ReleaseSemaphore( HANDLEhSemaphore,ﻩ//handletosemaphore LONGlRelseaseCount,ﻩ //contincrementamountﻩLPLONGlpPreviousCountﻩﻩ//previouscountﻩ);三、题目分析将所有得读者与所有得写者分别放进两个等待队列中,当读允许时就让读者队列释放一个或多个读者,当写允许时,释放第一个写者操作。(1)构筑读者进程与写者进程间得临界区ﻩ题目中说得一批数据被多个读者、写者共享使用,允许多个读者同时访问这些数据,但就是如果有一个写者在访问数据时,就不允许其她读者或写者使用,所以,对这一批数据既要保证读者与写者互斥使用,也要保证写者与写者互斥使用.也就就是说,在读者进程程序中,使用数据得程序段应该构成临界区;在写者进程程序中,使用数据得程序段应该构成临界区。(2)判定就是否就是第一个读者 根据上面得分析,希望在读者进程中有一个办法能判定请求进入临界区得就是否就是第一个读者。如果就是第一个读者,就对信号量wsem做P操作,以取得与写者得同步.为此,设置一个变量rfirst,初值为0、任何一个读者运行时,都现在rfirst上加1,然后判定她就是否取值为1、如果就是1,则做P(wrt),否则不做。(3)判定就是否就是第一个写者 原理同(2)判定就是否为第一个读者.(4)写者优先问题得解决需要用到得如下得信号量与变量rsem:初值为1得互斥信号量,在至少有一个写者准备访问数据时就不允许随后来得读者访问数据wserm:初值为1得互斥信号量,之后有一个写者访问数据时其她写者与读者就被阻止对数据得访问ReadMutex:创建写者得互斥信号量,初值为1WriteMutex:创建读者得互斥信号量,初值为1z:初值为1得互斥信号量,在至少有一个写着准备访问数据、且后面已经来一个读者时再来得读者将在这个信号量上等待rifrrst:读者计数变量,初值为0wfirst:写者计数变量,初值为0写者优先得PV原语:reader(i):{P(z);P(rsem);P(ReadMutex);rfirst=rfirst+1;if(rfirst==1)P(wsem);V(ReadMutex);V(rsem);V(z);读取所需数据;P(ReadMutex);rfirst=rfirst-1;if(rfirst==0)V(wsem);V(ReadMutex);}Writer():{P(WriteMutex);wfirst=wfirst+1;if(wfirst==1)P(rsem);V(WritedMutex);P(wsem);改写所需数据;V(wsem);P(WriteMutex);wfirst=wfirst—1;if(wfirst==0)V(rsem);V(WriteMutex);}读者写者图3、1读者-写者得完整流程框图(5)读者优先 与写者优先算法相反,有一个读者优先得算法,即只要有读者在读数据,写者被拒绝在临界区外面,如果有源源不断得写者来,但就是只要写者不就是第一个,那么写者将会永远被拒绝在临界区外面。wrt::初值为1得互斥信号量,只要有一个写者访问数据,则其她写者与读者就要被阻止对数据得访问。mutex:保证读者互斥操作first得信号量,初值为1first:读者计数变量,初值为0读者优先得PV原语:write():{ P(wrt); 对数据进行修改;ﻩV(wrt);}read():{ P(mutex);ﻩfirst=first+1; if(first==1) ﻩP(wrt);ﻩV(mutex); 读取所需数据 P(mutex); first=first+1;ﻩif(first==0)V(wrt); V(mutex);}四、概要设计(1)控制流程用CheckPersonList(PersonLists)函数检查PersonLists中就是否有为创建得进程(读写者)。如果有则创建相应得读写线程(2)创建读写者ﻩ用boolCreateReader(intStartTime,intWorkTime)函数创建读者写者相应得线程,其中由windows提供得函数为CreateThread(NULL,0,ReaderProc,(LPVOID)pPerson,0,&dwThreadID);返回得就是DWORD型变量。 在CreateReader(intStartTime,intWorkTime)中还会初始化相应得读写者得基本信息,例如何时申请数据何时读数据何时关闭线程等等。(3)读写者进程 参见图2、1读者-写者得完整流程图.(4)同步与互斥WaitForSingleObject(信号量名字,infinite)与ReleaseSemaphore(信号量名字,1,null)用于实现同步于互斥,执行WaitForSingleObject(信号量名字,infinite)信号量相应得信号量减1,执行ReleaseSemaphore(信号量名字,1,null)恢复1。五、代码及流程//写者优先算法#include〈windows、h>#include<ctype、h〉#include〈stdio、h〉#include<string、h>#include<stdlib、h>ﻩ#include<malloc、h>#defineMAX_PERSON10#defineREADER0#defineWRITER1#defineEND-1#defineRREADER#defineWWRITERtypedefstruct_Person{ HANDLEThread; intType; intStartTime;ﻩintWorkTime; intID;}Person;PersonPersons[MAX_PERSON];intNumPerson=0;longCurrentTime=0;intPersonLists[]={ 1,R,1,3, 2,W,2,5,/*读写互斥*/ 3,W,5,5,/*写写互斥*/ 4,R,3,5,/*写读互斥*/ﻩ5,R,15,2,/*读读不互斥*/ﻩEND,};intrfirst=0;intwfirst=0;intNumOfReaders=0;intNumOfWriters=0;HANDLErsem;/*初值为1得互斥信号量,在至少有一个写者准备访问数据时就不允许随后来得读者访问数据*/HANDLEwsem;/*初值为1得互斥信号量,之后有一个写者访问数据时其她写者与读者就被阻止对数据得访问*/HANDLEz;/*初值为1得互斥信号量,在至少有一个写着准备访问数据、且后面已经来一个读者时再来得读者将在这个信号量上等待*/HANDLEReadMutex;/*创建写者得互斥信号量,初值为1*/HANDLEWriteMutex;/*创建读者得互斥信号量,初值为1*/voidCheckPersonList(int*pPersonList);/*查瞧人数,为创建读写者线程*/boolCreateReader(intStartTime,intWorkTime);boolCreateWriter(intStartTime,intWorkTime);DWORDWINAPIReaderProc(LPVOIDlpParam);/*读者进程程序*/DWORDWINAPIWriterProc(LPVOIDlpParam);/*写着进程程序*/#include"Writerprior、h"intmain(){ ﻩrsemﻩﻩ=CreateSemaphore(NULL,1,1,NULL);ﻩwsem ﻩ=CreateSemaphore(NULL,1,1,NULL); z =CreateSemaphore(NULL,1,1,NULL);ReadMutexﻩ=CreateSemaphore(NULL,1,1,NULL);WriteMutexﻩ=CreateSemaphore(NULL,1,1,NULL);ﻩCurrentTime=0;ﻩwhile(true)//模拟20个时钟周期ﻩ{ﻩﻩCheckPersonList(PersonLists); ﻩCurrentTime++; ﻩSleep(600);ﻩﻩprintf("当前时间=%d:\n",CurrentTime);ﻩ if(CurrentTime==20) ﻩ break;ﻩ}ﻩsystem(”pause"); CloseHandle(rsem);ﻩCloseHandle(wsem); CloseHandle(z);ﻩCloseHandle(ReadMutex); CloseHandle(WriteMutex);ﻩreturn0;}voidCheckPersonList(int*pPersonLists){ﻩinti=0;ﻩint*pList=pPersonLists; boolP;ﻩwhile(pList[0]!=END)ﻩ{ if(pList[2]==CurrentTime)ﻩ { switch(pList[1]) ﻩ { ﻩcaseR:ﻩ ﻩ P=CreateReader(pList[2],pList[3]);//创建一个读者 ﻩbreak; ﻩ caseW: ﻩﻩ P=CreateWriter(pList[2],pList[3]);//创建一个写者ﻩ ﻩ break;ﻩﻩﻩ} ﻩif(!P)ﻩﻩﻩﻩprintf("CreatePerson%diswrong\n”,pList[0]);ﻩﻩ} pList+=4;//数组得指针指向第二个人 }}DWORDWINAPIReaderProc(LPVOIDlpParam){ Person*pPerson=(Person*)lpParam;ﻩpPerson-〉ID=++NumOfReaders;ﻩWaitForSingleObject(z,INFINITE);//P(z),其余读者在此排队ﻩprintf("\t\t读者%d申请读数据、、、\n”,pPerson—>ID); WaitForSingleObject(rsem,INFINITE);//P(rsem),一个读者与一个写着再次竞争数据得使用权 //printf(”Reader%disrequestingtheSharedBuffer、、、\n",pPerson->ID);WaitForSingleObject(ReadMutex,INFINITE);//P(ReadMutex),读者请求进入rfirst临界区ﻩrfirst++;if(rfirst==1)//就是否就是第一个读者{WaitForSingleObject(wsem,INFINITE);//读者在此处与写者进行同步}ReleaseSemaphore(ReadMutex,1,NULL);//退出rfirst临界区,V(ReadMutex) ReleaseSemaphore(rsem,1,NULL); ReleaseSemaphore(z,1,NULL);//V(z)ﻩ//读取所需数据,将现在时间赋值给读者,用以计算结束时间 printf(”\t\t读者%d申请成功\n",pPerson-〉ID); pPerson-〉StartTime=CurrentTime; printf("\t\t读者%d正在读数据、、、\n”,pPerson->ID);ﻩwhile(CurrentTime〈pPerson->StartTime+pPerson—>WorkTime)ﻩ{ﻩ //模拟读数据 } printf("\t\t读者%d读完数据退出\n",pPerson-〉ID);ﻩWaitForSingleObject(ReadMutex,INFINITE); rfirst--;if(rfirst==0)//就是最后一个读者?ReleaseSemaphore(wsem,1,NULL);//没有读者了,写者放行ReleaseSemaphore(ReadMutex,1,NULL);//退出读者临界区 ExitThread(0);//关闭读者线程 return0;}DWORDWINAPIWriterProc(LPVOIDlpParam)//写者进程程序{ﻩPerson*pPerson=(Person*)lpParam; pPerson-〉ID=++NumOfWriters;printf("\t\t写者%d正在申请写数据、、、\n",pPerson—>ID);WaitForSingleObject(WriteMutex,INFINITE);//请求进入写者临界区ﻩwfirst=wfirst++;ﻩif(wfirst==1) { ﻩWaitForSingleObject(rsem,INFINITE);//一个写者在此与读者取得同步 }ﻩReleaseSemaphore(WriteMutex,1,NULL);//退出rfirst临界区ﻩWaitForSingleObject(wsem,INFINITE);//其她写者在此等候进入写临界区ﻩ//读取所需数据,将现在时间赋值给读者,用以计算结束时间 pPerson—〉StartTime=CurrentTime;ﻩprintf("\t\t写者%d正在写数据、、、\n",pPerson->ID); while(CurrentTime<pPerson—〉StartTime+pPerson->WorkTime)ﻩ{ //模拟写数据ﻩ} printf("\t\t写者%d写完数据退出\n”,pPerson—>ID);ﻩReleaseSemaphore(wsem,1,NULL);//退出进入写临界区 WaitForSingleObject(WriteMutex,INFINITE);//请求进入wfirst临界区ﻩwfirst=wfirst-—; if(wfirst==0)//就是最后一个写者? {ﻩ ReleaseSemaphore(rsem,1,NULL);//没有写者了,向读者放行ﻩ} ReleaseSemaphore(WriteMutex,1,NULL);//退出wfirst临界区 ExitThread(0);//关闭写者线程 return0;}boolCreateReader(intStartTime,intWorkTime){ DWORDdwThreadID; Person*pPerson=&Persons[NumPerson];ﻩpPerson-〉StartTime =StartTime;ﻩpPerson->WorkTime =WorkTime; pPerson—〉Type ﻩ=READER; NumPerson++;ﻩ//创建一个读者得新线程 pPerson->Thread=CreateThread(NULL,0,ReaderProc,(LPVOID)pPerson,0,&dwThreadID);ﻩif(pPerson—〉Thread==NULL) ﻩreturnfalse; returntrue;}boolCreateWriter(intStartTime,intWorkTime){ﻩDWORDdwThreadID; if(NumPerson〉=MAX_PERSON)ﻩ returnfalse; Person*pPersonﻩ =&Persons[NumPerson]; pPerson-〉StartTime =StartTime;ﻩpPerson->WorkTimeﻩ=WorkTime;ﻩpPerson->Type =WRITER; Num
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 恶性腹水患者护理
- 玉林师范学院《市场查与预测实训》2022-2023学年第一学期期末试卷
- 玉林师范学院《工业机器人技术与应用》2023-2024学年第一学期期末试卷
- 玉林师范学院《传感器原理实验》2021-2022学年第一学期期末试卷
- 迪声艺术培训学校简介
- 班级多媒体使用培训
- 二零二四年二手车位交易合同样本6篇
- 2024年运动神经元病研究进展
- 2024室内装修粉刷服务具体协议条款版
- 创新创业基础第六章 创业项目来源与产品设计保护
- 一年级家长会精编课件
- 牛养殖场标准化红牛养殖场建设项目施工图纸
- 掼蛋实战技巧100例
- 影子老师-陪读协议-模板
- 教学课件 第三讲-国际体系及其变革趋势
- 教科版小学二年级科学下册-《皮肤很重要》原创课件
- 源代码管理规范
- Unit+1+Knowing+me,+knowing+you+Developing+ideas课件【知识精讲精研】高中英语外研版(2019)必修第三册
- T SISTB002-2020 智慧楼宇评价指标体系3.0
- 例谈思政教育在中学数学中的融合与实施 论文
- 形势与政策(吉林大学)智慧树知到课后章节答案2023年下吉林大学
评论
0/150
提交评论