还剩15页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
实验序号操作系统实验
(二)学号姓名队别实验地点指导教员实验时间实验项目名称读者写者问题《操作系统》实验报告实验目的综合运用多进程并发控制,进程同步互斥,信号量机制等原理解决问题
一、实验目的及要求实验要求本题目安排16学时,要求党员根据题目要求,写出算法,在VC平台上进行程序设计和调试,在运行成功的基础上,整理出源程序和运行结果.写出设计报告
二、实验设备(环境)实验设备WINDOWS2000环境、VC平台、WIN32API
三、实验内容与步骤实验内容与步骤可以将所有读者和写者分别存于一个读者等待队列和一个写者等待队列,每当读允许时,就从读者队列中释放一个或多个读者线程进行读操作;每当写允许时,就从写者队列中释放一个写者进行写操作.a)读者优先读者优先指的是除非有写者在写文件,否则读者不需要等待.所以可以用一个整形变量记录当前读者的数目,用于确定是否需要释放正在等待的写者线程.每一个读者开始读文件时,必须修改变量.因此需要一个互斥对象mutex来实现对全局变量修改时的互斥.另外,为了实现写互斥,需要增加一个临界区对象write.当写者发出写请求时,必须申请临界区对象的所有权.通过这种方法,也可以实现读写互斥,当read_count=l时,读者线程也必须申请临界区对象的所有权.当读者拥有临界区所有权时,写者阻塞在临界区对象write上.当写者拥有临界区所有权时,第一个读者判断完”read count==l”后阻塞在write上,其printf^Reader%d isRequesting...\n\pPerson-m_nID;printf〃\n\n************************************************\n〃;//wait forthe writerequestWaitForSingleObjectg hReadSemaphore,INFINITE;if g_NumOfReading==0WaitForSingleObjectg_hWriteSemaphore,INFINITE;}g_NumOfReading++;ReleaseSemaphoreg_hReadSemaphore,1,NULL;pPerson-m_nStartTime=g_CurrentTime;printf^Reader%d isReading theSharedBuffer...\n〃,pPerson-m_nID;printf〃\n\n************************************************\n〃;whileg_CurrentTime=pPerson-m_nStartTime+pPerson-m nWorkTime}printf^Reader%d isExit...\n〃,pPerson-m_nID;pp jntf〃\n\n************************************************\n〃;WaitForSingleObjectg_hReadSemaphore,INFINITE;g_NumOfRead ing一一;if g_NumOfReading==0{ReleaseSemaphore g_hWriteSemaphore,1,NULL;〃此时没有读者,可以写ReleaseSemaphoreg_hReadSemaphore,1,NULL;ifpPerson-m_nID==4finished=true;〃所有的读写完成ExitThreadO;return0;DWORD WINAPIWriterProc LPVOIDIpParamPerson*pPerson=Person*IpParam;//wait forthe start timewhileg_CurrentTime!=pPerson-m_nStartTime printfZ/Writer%d isRequesting...\n\pPerson-m_nID;printf〃\n\n************************************************\n〃;WaitForSingleObjectg_hWriteSemaphore,INFINITE;//modify thewriters realstarttimepPerson-m_nStartT ime=g_CurrentTime;printf Writer%d isWritting theSharedBuffer...\n〃,pPerson-m_nID;whileg_CurrentTime=pPerson-m_nStartTime+pPerson-m_nWorkTime printfZ/Writer%d isExit...\n〃,pPerson-m_nID;printf〃\n\n************************************************\n〃;//g_NumOfWriteRequest一一;ReleaseSemaphoreg hWriteSemaphore,1,NULL;ifpPerson-m_nID==4finished=true;〃所有的读写完成ExitThread0;return0;bool CreateReaderint StartTime,int WorkTime,int IDDWORDdwThreadID;ifg_NumPerson=MAX_PERSON returnfalse;Person*pPerson=g_Persons[gNumPerson];pPerson-m_nID=ID;pPerson-m_nStartTime=StartTime;pPerson-m_nWorkTime=WorkTime;pPerson-m_nType=READER;g_NumPerson++;//Create anNew ThreadpPerson-m_hThread=CreateThreadNULL,0,ReaderProc,LPVOIDpPerson,0,dwThreadID;if pPerson-m_hThread==NULLreturn false;return true;}bool CreateWriterintStartTime,int WorkTime,int IDDWORDdwThreadID;ifg_NumPerson=MAX_PERSONreturn false;Person*pPerson=g_Persons[g_NumPerson];pPerson-m_nID=ID;pPerson-m_nStartT ime=StartTime;pPerson-m_nWorkTime=WorkTime;pPerson-m_nType=WRITER;g_NumPerson++;//Create anNew ThreadpPerson-m_hThread=CreateThreadNULL,0,WriterProc,LPVOIDpPerson,0,dwThreadI D;if pPerson-m_hThread==NULLreturn false;return true;
五、分析与讨论通过这次课程设计,让我对课本上的理论知识有了更深刻的认识,通过自己的动手实践,把理论知识真正的化为了自己可以应用的技能.在这次实验中也遇到了不少困难,往往一个小小的错误,就会导致整个程序不能正常运行,寻找错误、发现错误和修改错误,每一次改进都需要花费大量的时间和精力,每取得一次小的成功都离最后的成功更近了一步,每一次改正也会带来巨大的欣喜,这正是一个进步和提高的过程.在这个过程中获得了很多收获.
六、教员评语成绩签名日期余的读者由于等待对read_count的判断,阻塞在mutex上.b)写者优先写者优先与读者优先类似.不同之处在于一旦一个写者到来,它应该尽快对文件进行写操作,如果有一个写者在等待,则新到来的读者不允许进行读操作.为此应当添加一个整形变量write_count,用于记录正在等待的写者的数目,当write_count=0时,才可以释放等待的读者线程队列.为了对全局变量write_count实现互斥,必须增加一个对象mutex
3.为了实现写者优先,应当添加一个临界区对象read,当有写者在写文件或等待时,读者必须阻塞在read上.读者线程除了要对全局变量read_count实现操作上的互斥外,还必须有一个互斥对象对阻塞read这一过程实现互斥.这两个互斥对象分别命名为mutexl和mutex2o
四、实验结果与数据处理源代码#include windows.h#include ctype.h#include stdio.httinclude string.h ttincludestdlib.h^include malloc.h#define MAXPERSON100#define READER0〃读者#define WRITER1〃写者#define END-1#define READER#define WRITERtypedefstruct PersonHANDLEm hThread;〃定义处理线程的句柄int m_nType;〃进程类型(读写)int m_nStartTime;〃开始时间int m_nWorkTime;//运行时间int m_nID;//进程号}Person;Person gPersons[MAXPERSON];int g_NumPerson=0;long g_CurrentTime=0;//基本时间片数int g_PersonLists[]={〃进程队列1,W,4,5,2,W,16,4,3,R,5,2,4,W,6,5,5,R,4,3,END,;int g_NumOfReading=0;int g_NumOfWr iteRequest=0;〃申请写进程的个数HANDLE g hReadSemaphore;〃读者信号HANDLE ghWriteSemaphore;〃写者信号bool finished=false;〃所有的读完成//bool wfinished=false;〃所有的写完成void CreatePersonListint*pPersonList;bool CreateReaderintStartTime,int WorkTime,int ID;bool CreateWriterintStartTime,int WorkTime,int ID;DWORD WINAPIReaderProc LPVOIDIpParam;DWORD WINAPIWriterProcLPVOID IpParam;int mainghReadSemaphore=CreateSemaphore NULL,1,100,NULL;〃创建信号灯,当前可用的资源数为,最大为g_hWriteSemaphore=CreateSemaphore NULL,1,100,NULL;〃创建信号灯,当前可用的资源数为,最大为CreatePersonListg_PersonLists;//Create Allthe readerand writersprintfCreated allthe readerand writer\n...\n〃;g_CurrentTime=0;whiletrueg_CurrentTime++;Sleep300;//300msprintf z/CurrentTime=%d\nz/,g_CurrentTime;if finishedreturn0;system pause;}//return0;void CreatePersonListint*pPersonLists inti=0;int*pList=pPersonLists;bool Ret;whilepList
[0]!=END switchpList
[1]case R:Ret=CreateReaderpList
[2],pList
[3],pList
[0];//351,w452,523,654break;case W:Ret=CreateWriter pList
[2],pList
[3],pList
[0];break;if!Ret printfCreate Person%d iswrong\nzz,pList
[0];pList+=4;//move tonext personlistDWORD WINAPIReaderProc LPVOIDIpParam〃读过程Person*pPerson=Person*IpParam;//wait forthe starttime whileg_CurrentTime!=pPerson-m_nStartTime。
个人认证
优秀文档
获得点赞 0