已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 网络操作系统网络操作系统 课程设计报告课程设计报告 题 目 LinuxLinux 下读者与写者的问题实现下读者与写者的问题实现 姓 名 钱兵 学 号 10114036 同 组 者 张玉洁 专 业 网络工程 2 班 指导教师 陈卫 成 绩 网络工程系网络工程系 20132013 年年 1 1 月月1 1 日日 2 目录目录 1 设计目的与要求 P3 2 设计思想 P3 3 设计分析 P3 4 程序实现 P5 5 设计原理 P6 6 程序调试 P7 7 源程序代码 P8 8 程序测试结果 P12 9 心得与体会 P13 10 参考文献 P13 3 一 设计目的与要求一 设计目的与要求 l l 用信号量来实现读者写者问题 用信号量来实现读者写者问题 2 2 理解和运用信号量 理解和运用信号量 PVPV 原语 进程间的同步互斥关系等基本知识 原语 进程间的同步互斥关系等基本知识 读者写者问题的定义如下 有一个许多进程共享的数据区 这个数据区可以是一个文读者写者问题的定义如下 有一个许多进程共享的数据区 这个数据区可以是一个文 件或者主存的一块空间 有一些只读取这个数据区的进程 件或者主存的一块空间 有一些只读取这个数据区的进程 ReaderReader 和一些只往数据区写 和一些只往数据区写 数据的进程数据的进程 Writer Writer 此外还需要满足以下条件 此外还需要满足以下条件 1 1 任意多个读进程可以同时读这个文件 任意多个读进程可以同时读这个文件 2 2 一次只有一个写进程可以往文件中写 一次只有一个写进程可以往文件中写 3 3 如果一个写进程正在进行操作 禁止任何读进程度文件 如果一个写进程正在进行操作 禁止任何读进程度文件 我们需要分两种情况实现该问题 我们需要分两种情况实现该问题 读优先 要求指一个读者试图进行读操作时 如果这时正有其他读者在进行操作 他读优先 要求指一个读者试图进行读操作时 如果这时正有其他读者在进行操作 他 可直接开始读操作 而不需要等待 可直接开始读操作 而不需要等待 写优先 一个读者试图进行读操作时 如果有其他写者在等待进行写操作或正在进行写优先 一个读者试图进行读操作时 如果有其他写者在等待进行写操作或正在进行 写操作 他要等待该写者完成写操作后才开始读操作 写操作 他要等待该写者完成写操作后才开始读操作 2 2 设计思想设计思想 读者写者问题可以这样的描述 有一群写者和一群读者 写者在写同一 本书 读者也在读这本书 多个读者可以同时读这本书 但是 只能有一个写者 在写书 并且 读者比写者优先 也就是说 读者和写者同时提出请求时 读者优 先 当读者提出请求时需要有一个互斥操作 另外 需要有一个信号量 S 来确 定当前是否可操作 本设计方案就是通过利用记录型信号量对读者写者问题的解决过程进行模 拟演示 形象地阐述记录型信号量机制的工作原理 三 三 设计分析设计分析 3 1 在 linux 环境下 使用多线程和信号量机制实现经典的读者写者问题 每个线程代表一个读者或一个写者 每个线程按相应测试数据文件的要求 进 行读写操作 请用信号量机制分别实现读者优先和写者优先的读者 写者问题 4 读者 写者问题的读写操作限制 1 写 写互斥 即不能有两个写者同时进行写操作 2 读 写互斥 即不能同时有一个读者在读 同时却有一个写者在写 3 读 读允许 即可以有二个以上的读者同时读 将所有的读者和所有的写者分别放进两个等待队列中 当读允许时就让读者队列释放 一个或多个读者 当写允许时 释放第一个写者操作 读者写者问题的定义如下 有一个 许多进程共享的数据区 这个数据区可以是一个文件或者主存的一块空间 有一些只读取 这个数据区的进程 Reader 和一些只往数据区写数据的进程 Writer 此外还需要满足以 下条件 1 任意多个读进程可以同时读这个文件 2 一次只有一个写进程可以往文件中写 3 如果一个写进程正在进行操作 禁止任何读进程度文件 我们需要分两种情况实现该问 题 读优先 要求指一个读者试图进行读操作时 如果这时正有其他读者在进行操作 他 可直接开始读操作 而不需要等待 写优先 一个读者试图进行读操作时 如果有其他写 者在等待进行写操作或正在进行写操作 他要等待该写者完成写操作后才开始读操作 读者优先的附加限制 如果一个读者申请进行读操作时已有另一读者正在 进行读操作 则该读者可直接开始读操作 写者优先的附加限制 如果一个读者申请进行读操作时已有另一写者在等 待访问共享资源 则该读者必须等到没有写者处于等待状态后才能开始读操作 运行结果显示要求 要求在每个线程创建 发出读写操作申请 开始读写 5 操作和结束读写操作时分别显示一行提示信息 以确信所有处理都遵守相应的 读写操作限制 4 2 测试数据文件格式 测试数据文件包括 n 行测试数据 分别描述创建的 n 个线程是读者还是写者 以及读写操作的开始时间和持续时间 每行测试数据包括四个字段 各字段间 用空格分隔 第一字段为一个正整数 表示线程序号 第二字段表示相应线程 角色 R 表示读者是 W 表示写者 第三字段为一个正数 表示读写操作的开 始时间 线程创建后 延时相应时间 单位为秒 后发出对共享资源的读写申 请 第四字段为一个正数 表示读写操作的持续时间 当线程读写申请成功后 开始对共享资源的读写操作 该操作持续相应时间后结束 并释放共享资源 一个测试数据文件的例子 1 R 3 5 2 W 4 5 3 R 5 2 4 R 6 5 5 W 5 1 3 四四 程序实现程序实现 程序由两部分组成 1 读者 写者模块 包括系统调用接口 读者 写者活动描述主程序 系统接口主要功能是 通过管道向父进程发送系统调用命令 并读取父进程送来的返回值 读者 写者活动程序根据临界资源的共享 互斥原则编制 具体见源程序 2 主控模块 主控模块实现系统初始化系统调用命令接收与解释执行 系统调用功能的实 现 包括信号量机制 及读者 写者活动过程记录与显示 初始化系统环境 建立通信管道 启动读者 写者进程 接收系统调用命令 解释执行 系统初始化模块 6 管道建立模块 进程启动模块 命令解释模块 Wait Signal Wakeup Block 五 设计原理五 设计原理 3 1 1 读者优先算法 设置两个互斥信号量 rwmutex 用于写者与其他读者 写者互斥的访问共享数据 rmutex 用于读者互斥的访问 读者计数器 readcount semaphore rwmutex 1 rmutex 1 int readcount 0 reader i 读者进程 i 1 2 do P rmutex 读者互斥 readcount 读者数加 1 if readcount 1 P rwmutex 读者写者互斥 V rmutex 读者读数据 P rmutex Readcount if readcount 0 V rwmutex V rmutex while 1 writer j 写者进程 j 1 2 do 7 P rwmutex 写文件 V rwmutex while 1 3 2 1 写者优先算法 设置三个互斥信号量 rwmutex 用于写者与其他读者 写者互斥的访问共享数据 rmutex 用于读者互斥的访问 读者计数器 readcount nrmutex 用于写者等待已进入读者退出 所有读者退出前互斥写操作 semaphore rwmutex 1 rmutex 1 nrmutex 1 int readcount 0 reader i 读者进程 i 1 2 do P rwmutex P rmutex readcount if readcount 1 P nrmutex 有读者进入 互斥写操作 V rmutex V rwmutex 及时释放读写互斥信号量 允许其它读 写进程申请资源 读数据 P rmutex readcount if readcount 0 V nrmutex 所有读者退出 允许写更新 V rmutex while 1 writer j 写者进程 j 1 2 do P rwmutex 互斥后续其它读者 写者 P nrmutex 如有读者正在读 等待所有读者读完 写更新 V nrmutex 允许后续新的第一个读者进入后互斥写操作 V rwmutex 允许后续新读者及其它写者 while 1 六 程序调试 测试数据文件格式 测试数据文件包括 n 行测试数据 分别描述创建的 n 个线程是读者还是写者 以及读 写操作的开始时间和持续时间 每行测试数据包括四个字段 各字段间用空格分隔 第一 字段为一个正整数 表示线程序号 第二字段表示相应线程角色 R 表示读者是 W 表 示写者 第三字段为一个正数 表示读写操作的开始时间 线程创建后 延时相应时间 8 单位为秒 后发出对共享资源的读写申请 第四字段为一个正数 表示读写操作的持续 时间 当线程读写申请成功后 开始对共享资源的读写操作 该操作持续相应时间后结束 并释放共享资源 七 源程序代码七 源程序代码 include include include include include include define MAX PERSON 100 define c 0 读者 define p 1 写者 define END 1 define R c define W p typedef struct Person HANDLE m hThread 定义处理线程的句柄 int m nType 进程类型 读写 int m nStartTime 开始时间 int m nWorkTime 运行时间 int m nID 进程号 Person Person g Persons MAX PERSON int g NumPerson 0 long g CurrentTime 0 基本时间片数 int g PersonLists 进程队列 1 R 3 5 2 W 4 5 3 R 5 2 4 R 6 5 5 W 5 1 3 int g NumOfReading 0 int g NumOfWriteRequest 0 申请写进程的个数 HANDLE g hReadSemaphore 读者信号 HANDLE g hWriteSemaphore 写者信号 bool finished false 所有的读完成 bool wfinished false 所有的写完成 void CreatePersonList int pPersonList bool CreateReader int StartTime int WorkTime int ID bool CreateWriter int StartTime int WorkTime int ID DWORD WINAPI ReaderProc LPVOID lpParam 9 DWORD WINAPI WriterProc LPVOID lpParam int main g hReadSemaphore CreateSemaphore NULL 1 100 NULL 创建信号灯 当 前可用的资源数为 1 最大为 100 g hWriteSemaphore CreateSemaphore NULL 1 100 NULL 创建信号灯 当 前 可用的资源数为 1 最大为 100 CreatePersonList g PersonLists 创建所有的读者和写者 printf Created all the reader and writer n n g CurrentTime 0 while true g CurrentTime Sleep 300 300 ms printf CurrentTime d n g CurrentTime if finished return 0 return 0 void CreatePersonList int pPersonLists int i 0 int pList pPersonLists bool Ret while pList 0 END switch pList 1 case R Ret CreateReader pList 2 pList 3 pList 0 break case W Ret CreateWriter pList 2 pList 3 pList 0 break if Ret printf Create Person d is wrong n pList 0 pList 4 move to next person list DWORD WINAPI ReaderProc LPVOID lpParam 读过程 Person pPerson Person lpParam wait for the start time while g CurrentTime pPerson m nStartTime 10 printf Reader disRequesting n pPerson m nID printf n n n wait for the write request 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 Reader d is Reading the Shared Buffer n pPerson m nID printf n n n while g CurrentTime m nStartTime pPerson m nWorkTime printf Reader d is Exit n pPerson m nID printf n n n WaitForSingleObject g hReadSemaphore INFINITE g NumOfReading if g NumOfReading 0 ReleaseSemaphore g hWriteSemaphore 1 NULL 此时没有读者 可以写 ReleaseSemaphore g hReadSemaphore 1 NULL if pPerson m nID 4 finished true 所有的读写完成 ExitThread 0 return 0 DWORD WINAPI WriterProc LPVOID lpParam Person pPerson Person lpParam wait for the start time while g CurrentTime pPerson m nStartTime printf Writer d is Requesting n pPerson m nID printf n n n WaitForSingleObject g hWriteSemaphore INFINITE modify the writer s real start time pPerson m nStartTime g CurrentTime printf Writer d is Writting the Shared Buffer n pPerson m nID while g CurrentTime m nStartTime pPerson m nWorkTime 11 printf Writer d is Exit n pPerson m nID printf n n n g NumOfWriteRequest ReleaseSemaphore g hWriteSemaphore 1 NULL if pPerson m nID 4 finished true 所有的读写完成 ExitThread 0 return 0 bool CreateReader int StartTime int WorkTime int ID 写过程 DWORD dwThreadID if g NumPerson MAX PERSON return false Person pPerson pPerson m nID ID pPerson m nStartTime StartTime pPerson m nWorkTime WorkTime pPerson m nType c g NumPerson 创建一个新的线程 pPerson m hThread CreateThread NULL 0 ReaderProc LPVOID pPerson 0 if pPerson m hThread NULL return false return true bool CreateWriter int StartTime int WorkTi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 如何在企业管理中运用好激励理论的思考
- 中小型民营企业人力资源管理存在的问题与对策-图文
- 2025年园林设计师岗位招聘面试参考题库及参考答案
- 浅析兽用制品企业人力资源管理的要点
- 洁净纯净水公司人力资源部经理的绩效考核计划-图文
- 探析国有企业人力资源管理中的绩效考核问题与革新建议
- 企业绩效管理毕业论文范文
- 构建和保护心理契约的人力资源治理策略
- 人力资源部门的工作职责
- 公共管理学院本科生毕业论文正文及附件规范实施细则
- 村报账员基础知识培训课件
- 烟叶种植基础知识培训课件
- 2025中国人民财产保险股份有限公司招聘考试参考题库及答案解析
- 电气控制柜制作工艺与技术标准
- AI在港口和船舶制造业的应用现状与发展分析
- 肝动脉灌注化疗持续动脉给药及管路护理专家共识
- 机械设备租赁结算单范本
- 小篆峄山碑教学课件
- 疫苗管理冷链课件
- 2025营口劳动合同范本
- 办公室信息安全课件
评论
0/150
提交评论