东华大学操作系统读者写者实验报告.docx_第1页
东华大学操作系统读者写者实验报告.docx_第2页
东华大学操作系统读者写者实验报告.docx_第3页
东华大学操作系统读者写者实验报告.docx_第4页
东华大学操作系统读者写者实验报告.docx_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

航空售票信息管理系统东华大学计算机学院操作系统实验报告实验名称: 读者写者问题 姓 名: 姜元杰 学号: 111310228 班级: 计算机1102 指导老师: 李继云 报告日期: 2013/10/12 一、 实验概述1. 实验目标在Windows系统平台下,了解Windows编程基本知识,通过创建线程等一系列操作实现进程同步经典问题读者写者问题。2. 实验要求在Windows7环境下,创建一个控制台进程,此进程包含n个线程。用这n个线程来表示n个读者或写者。每个线程按相应测试数据文件(后面有介绍)的要求进行读写操作。用信号量机制分别实现读者优先和写者优先的读者-写者问题。读者-写者问题的读写操作限制(包括读者优先和写者优先):1) 写-写互斥,即不能有两个写者同时进行写操作。2) 读-写互斥,即不能同时有一个线程在读,而另一个线程在写。,3) 读-读允许,即可以有一个或多个读者在读。读者优先的附加限制:如果一个读者申请进行读操作时已有另一个读者正在进行读操作,则该读者可直接开始读操作。写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。运行结果显示要求:要求在每个线程创建、发出读写操作申请、开始读写操作和结束读写操作时分别显示一行提示信息,以确定所有处理都遵守相应的读写操作限制。二、 实验内容1. 设计思路通过仔细分析问题,实验实现内容分别为读者优先部分与写者优先部分。通过建立统一的线程数组存储所有待创建线程,并在系统后台分别存于可以将所有读者和所有写者分别存于一个读者等待队列和一个写者等待队列中,每当读允许时,就从读者队列中释放一个或多个读者线程进行读操作;每当写允许时,就从写者队列中释放一个写者进行写操作。通过程序代码实现读读允许,读写互斥,写写互斥。对于读者优先部分,引入Mutex信号量和临界区对象RP_Writer实现。读者优先指的是除非有写者在写文件,否则读者不需要等待。所以可以用一个整型变量read_Count记录当前的读者数目,用于确定是否需要释放正在等待的写者线程(当read_Count=O时,表明所有的读者读完,需要释放写者等待队列中的一个写者)。每一个读者开始读文件时,必须修改read_Count变量。因此需要一个互斥对象Mutex来实现对全局变量read_Count修改时的互斥。另外,为了实现写-写互斥,需要增加一个临界区对象RP_Writer。当写者发出写请求时,必须申请临界区对象的所有权。通过这种方法,也可以实现读-写互斥,当read_ Count=l时(即第一个读者到来时),读者线程也必须申请临界区对象的所有权。当读者拥有临界区的所有权时,写者阻塞在临界区对象RP_Writer上。当写者拥有临界区的所有权时, 第一个读者判断完 read_Count=1后阻塞在write上,其余的读者由于等待对read_Count的判断,阻塞在Mutex上。对于写者部分,与读者优先类似;不同之处在于一旦一个写者到来,它应该尽快对文件进行写操作,如果有一个写者在等待,则新到来的读者不允许进行读操作。为此应当添加一个整型变量write_Count,用于记录正在等待的写者的数目,当write_Count=0时,才可以释放等待的读者线程队列。增加一个互斥对象Mutex3,维护对全局变量write_Count的互斥修改。为了实现写者优先,应当添加一个临界区对象CS_Reader,当有写者在写文件或等待时,读者必须阻塞在CS_Reader上,同时读者线程除了要对全局变量read_Count实现操作上的互斥外,还必须有一个互斥对象对阻塞CS_Reader这一过程实现互斥。2. 主要数据结构 int readCount:访问资源的读者线程数目;int writeCount:访问资源的写者线程数目;CRITICAL_SECTION RP_Writer:临界区对象,读者优先中用于阻塞写者;CRITICAL_SECTION CS_Writer:临界区对象,写者优先中实现写写互斥;CRITICAL_SECTION CS_Reader:临界区对象,写者优先中用于阻塞读者,体现写者优先struct Thread:线程信息结构体结构表示,成员变量包括int Number, char Type,double RunTime, WaitTime,分别代表线程序号,线程种类(读者或写者),等待时间,作业时间。HANDLE Mutex1:互斥信号量,用于实现写者优先。HANDLE Mutex2:互斥信号量,用于维护read_Count修改。HANDLE Mutex3:互斥信号量,用于维护write_Count修改。3. 主要代码结构int main() main函数菜单界面void ReaderPriority(char *file) 读者优先主控程序void RP_ReaderThread(void *p) 读者优先-读者线程void RP_WriterThread(void *p) 读者优先-写者线程void WriterPriority(char *file) 写者优先主控程序void WP_ReaderThread(void *p) 写者优先-读者线程void WP_WriterThread(void *p) 写者优先-写者线程4. 主要代码段分析a) 创建文件输入流inFile读入文件2. 读者优先读者线程部分:WaitForMutex = WaitForSingleObject(Mutex, -1);/ P(h_mutex)readCount+;if(readCount = 1)/ 读者线程进入临界区,实现读者优先EnterCriticalSection(&RP_Writer);ReleaseMutex(Mutex);/ V(h_mutex)printf(Reader thread %d begins to read file.n,Number);/ 读者线程开始作业Sleep(RunTime);/ 作业时间printf(Reader thread %d finished reading file.n,Number);/ 作业完成WaitForMutex=WaitForSingleObject(Mutex,-1);/ P(h_mutex) 读者线程对象已触发readCount-;/ 读者线程退出if(readCount = 0)/ 所有读者线程都已作业完毕,释放临界区对象,写者可作业LeaveCriticalSection(&RP_Writer);ReleaseMutex(Mutex);/ V(h_mutex)3. 写者优先写者线程部分:printf (Writer thread %d sents the reading require.n, Number);/ 读者线程从创建m_delay秒后,发送读申请WaitForMutex3 = WaitForSingleObject(Mutex3, -1);/ P(Mutex3) 维护writeCount修改/ P(h_mutex)writeCount+;if(writeCount = 1)/ 临界区有写者线程作业时,阻塞一切读者线程EnterCriticalSection(&CS_Reader);ReleaseMutex(Mutex3);/ V(Mutex3)EnterCriticalSection(&CS_Writer);/ 写写互斥printf(Writer thread %d begin to write the file.n,Number);Sleep(RunTime);printf(writer thread %d finishing writing file.n,Number);LeaveCriticalSection(&CS_Writer);WaitForMutex3 = WaitForSingleObject(Mutex3,-1);/ 维护writeCount修改writeCount-;if(writeCount=0)/ 当所有写者线程作业完毕,释放读者线程临界区对象LeaveCriticalSection(&CS_Reader); ReleaseMutex(Mutex3);/ V(Mutex3)三、 实验结果1. 基本数据基本数据:TestData.dat(见附件)数据文件包括n行测试数据,分别描述创建的n个线程是读者还是写者,以及读写操作的开始时间和持续时间。每行测试数据包括四个字段,各个字段间用空格分隔。第一字段为一个正整数,表示线程序号。第二字段表示相应线程角色,R表示读者,w表示写者。第三字段为一个正数,表示读写操作的开始时间:线程创建后,延迟相应时间(单位为秒)后发出对共享资源的读写申请。第四字段为一个正数,表示读写操作的持续时间。当线程读写申请成功后,开始对共享资源的读写操作,该操作持续相应时间后结束,并释放共享资源。 数据文件内容:1 R 3 52 W 4 53 R 5 24 R 6 55 W 5.1 32. 源代码行数:代码共303行。3. 完成实验投入时间:累计共7小时4. 讨论次数:3次5. 测试数据分析:分析详情见1.基本数据6. 测试结果分析:程序菜单界面:1)读者优先:读者优先结果分析:根据测试数据及读者优先原则可知,线程1R在第3s先执行,当它执行1s后,线程2W发出申请,但被阻塞,实现读写互斥。然后线程3R,线程4R在第5、6s时发出申请并被准许访问数据区,实现了多个读者同时读数据允许。而在5.1s发出写申请的线程5W则被阻塞。当读者线程根据时间都完成后,写者线程2W先被唤醒,并且在它完成之前,写者线程5W仍然是阻塞状态,从而实现了写写互斥。2)写者分析:写者优先结果分析:根据测试数据及写者优先原则可知,线程1R在第3s先执行,当它执行1s后,线程2W发出申请,但被阻塞,实现读写互斥。然后线程3R、线程5W、线程4R在第5s、5.1s、6s时发出申请,均被阻塞。当线程1R完成后,线程2W开始执行,执行完成。本来是线程4R先申请,但是有写者线程5W等待,根据写者优先,线程4R被阻塞,先执行线程5W,执行完成后,再根据时间先后执行线程3R、4R。此时也实现了多个读者同时读数据的操作。四、 实验体会1. 实验过程中遇到问题及解决过程1) 问题:1:开始进行实验内容时,由于不熟悉Windows编程知识,起手困难。因此开始便通过不断调阅参考资料和上网查询,熟悉线程创建,信号量机制等知识在Windows编程下的基本函数调用及用法,得以顺利进行实验代码编写。2) 问题2:由于参考代码“实验一.cpp”在VC6.0平台下编写,故一开始导入VS2010中,由于系统兼容等复杂原因,导致代码无法编译通过,最终放弃VS2010,转入VC6.0平台,解决问题。2. 实验过程中产生错误及原因分析错误1:在写者优先代码部分中代码部分,出现低级错误,原因分析如下:代码截图:(注:红色矩形框标记错误处)原因分析:在写者优先主控程序中错误调用读者优先-读者线程RP_ReadThread(void*p),导致线程最终死锁,运行错误信息如下:3. 实验体会和收获“实践是检验真理的唯一标准”,经过实验后,对于这句话理解尤为深刻。本次实验内容和所需知识都属于操作系统初级阶段,尤其是在具体系统平台下进行具体实现,许多Windows编程的所需知识在实验开始阶段非常匮乏,因此在熟悉常用Window函数及具体实现调用方面花了大量功夫,之后通过阅读参考代码和参考文献,并在实验期间与同学数次讨论后,个人进一步对于信号量机制和进程相关同步问题加深了理解。 五、 参考文献

温馨提示

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

评论

0/150

提交评论