下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、设计目的与内容一 实验目的l. 用信号量来实现读者写者问题。2. 理解和运用信号量、 PV 原语、进程间的同步互斥关系等基本知识。二、二实验内容读者写者问题的定义如下: 有一个许多进程共享的数据区, 这个数据区可以是一个文件或者主存的一块空间;有一些只读取这个数据区的进程(Reader)和一些只往数据区写数据的进程 (Writer),此外还需要满足以下条件:( 1)任意多个读进程可以同时读这个文件;( 2)一次只有一个写进程可以往文件中写;( 3)如果一个写进程正在进行操作,禁止任何读进程度文件。我们需要分两种情况实现该问题:读优先: 要求指一个读者试图进行读操作时, 如果这时正有其他读者在进
2、行操作, 他可 直接开始读操作,而不需要等待。写优先: 一个读者试图进行读操作时, 如果有其他写者在等待进行写操作或正在进行写 操作,他要等待该写者完成写操作后才开始读操作。设计分析在 Windows 7 环境下,创建一个包含 n 个线程的控制台进程。用这 n 个线程来表示 n 个读者或写者。 每个线程按相应测试数据文件的要求, 进行读写操作。 请用信号量机制分别 实现读者优先和写者优先的读者-写者问题。读者 -写者问题的读写操作限制:读者 -写者的读写限制(包括读者优先和写者优先)1)写 -写互斥,即不能有两个写者同时进行写操作2)读 -写互斥,即不能同时有一个读者在读,同时却有一个写者在写
3、3)读读允许,即可以有 2 个以上的读者同时读 将所有的读者和所有的写者分别放进两个等待队列中, 当读允许时就让读者队列释放一个或多个读者, 当写允许时,释放第一个写者操作。读者写者问题的定义如下:有一个许多 进程共享的数据区, 这个数据区可以是一个文件或者主存的一块空间; 有一些只读取这个数据区的进程(Reader)和一些只往数据区写数据的进程(Writer),此外还需要满足以下条件:1)任意多个读进程可以同时读这个文件;2) 一次只有一个写进程可以往文件中写;3)如果一个写进程正在进行操作,禁止任何读进程度文件。我们需要分两种情况实现该问题:读优先:要求指一个读者试图进行读操作时,如果这时
4、正有其他读者在进行操作,他可直接开始读操作,而不需要等待。写优先:一个读者试图进行读操作时,如果有其他写者在 等待进行写操作或正在进行写操作,他要等待该写者完成写操作后才开始读操作。这个项目设计是由我们这小组三人共同完成的,每个人都负责一些功能模块。我是这组的组长,我负责的是整体的一个框架,以及主函数的实现。然后将改组成员做出的功能模块添加到程序中。程序实现程序由两部分组成:1。 读者-写者模块:包括系统调用接口,读者-写者活动描述主程序。系统接口主要功能是 通过管道向父进程发送系统调用命令,并读取父进程送来的返回值。读者-写者活动程序根据临界资源的共享,互斥原则编制,具体见源程序。2。主控模
5、块:主控模块实现系统初始化系统调用命令接收与解释执行,系统调用功能的实现(包括信号量机制),及读者 -写者活动过程记录与显示。初始化系统环境建立通信管道启动读者-写者进程接收系统调用命令解释执行系统初始化模块管道建立模块进程启动模块 命令解释模块Wait()Signal()Wakeup()Block()程序调试测试数据文件格式 :测试数据文件包括 n 行测试数据,分别描述创建的 n 个线程是读者还是写者,以及读 写操作的开始时间和持续时间。 每行测试数据包括四个字段, 各字段间用空格分隔。 第一字 段为一个正整数,表示线程序号。第二字段表示相应线程角色, R 表示读者是, W 表示写 者。第三
6、字段为一个正数,表示读写操作的开始时间。线程创建后,延时相应时间(单位为 秒)后发出对共享资源的读写申请。 第四字段为一个正数,表示读写操作的持续时间。 当线 程读写申请成功后, 开始对共享资源的读写操作, 该操作持续相应时间后结束, 并释放共享 资源。结果分析和讨论在读者写者同时在队列中等待申请资时, 读者优先调用资源。 而且如果一个读者申请进 行读操作时已有另一读者正在进行读操作,则该读者可直接开始读操作,即读读允许。进程 1 是 R 操作,在时间 3 时进入队列 ,运行时间是 5,在它进入时没有进程占用资源, 它既占用资源;知道它释放资源,等候的进程有3, 4, 5;进程 2 是 W 操
7、作,在时间 16 时进入队列 ,运行时间是 5,在它进入时进程 4 占用资源, 它等待资源,当 4 释放时占用资源;进程3是R操作,在时间5时进入队列,运行时间是2,在它进入时进程1占用资源,它 等待资源,当进程 1 释放资源后,由于读者优先,进程 3, 5同时调运资源;进程4是R操作,在时间6时进入队列,运行时间是5,在它进入时进程1占用资源,它等待资源,当进程 1 释放资源后,由于读者优先,进程3,5 占用资源,它依然等待,直到进程 3, 5 都结束;进程 5 是 W 操作,在时间 4 时进入队列 ,运行时间是 3, 在它进入时进程 1 占用资源, 它等待资源,当进程 1 释放资源后,由于
8、读者优先,进程3,5 同时调运资源;心得体会这一次课程设计,让我体会很深刻。读者- 写者问题经典的线程同步问题的一个模型。经过读者写者问题的编写, 我对同步机构应用有了深入的了解。 懂得了运用信号量实现进程 间的互斥。 实现了不让共享资源同时修改。 用信号量上的原语操作使临界段问题的解决比较 简单明了了。读者写者问题的编写, 花的时间很多,也学到很多东西。 了解支持多道程序的 并发操作系统设计中解决资源共享时进程间的同步与互斥的信号量机制。 几天的试验, 虽然 难度有点大,但只要自己花时间去学习,还是会攻克困难的。总之,每一次课程设计不仅是我们学习的好机会, 而且是我们锻炼实际动手能力的平台,
9、 虽然有难度的东西总会让人很抵触, 比如在课设过程中有很多郁闷的时候, 一个小小的错误 一不小心就花去了自己一上午的时间, 所以在这个过程中能够磨练人的意志与耐心, 最后感 谢老师的指导与监督。源代码#include <windows.h>#include <ctype.h>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <malloc.h>#defineMAX_PERSON100#defineREADER0 / 读者#defineWRITE
10、R1 / 写者#defineEND-1#defineRREADER#defineWWRITERtypedef struct _Person HANDLE m_hThread;/定义处理线程的句柄intm_nType;/进程类型(读写)intm_nStartTime;/开始时间intm_nWorkTime;/运行时间intm_nID;/进程号Person;Person g_PersonsMAX_PERSON;intg_NumPerson = 0;longg_CurrentTime= 0;intg_PersonLists = /基本时间片数/进程队列1, R, 3, 5, 2, W, 4, 5,
11、3, R, 5, 2, 4, R, 6, 5, 5, W, 5.1, 3, END,;intg_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 StartTim
12、e,int WorkTime,int ID); bool CreateWriter(int StartTime,int WorkTime,int ID); DWORD WINAPIReaderProc(LPVOID lpParam);DWORD WINAPIWriterProc(LPVOID lpParam);int main() g_hReadSemaphore = CreateSemaphore(NULL,1,100,NULL);/创建信号灯,当前可用的资源数为 1,最大为 100g_hWriteSemaphore = CreateSemaphore(NULL,1,100,NULL); /
13、 创建信号灯, 当前可用的 资源数为 1,最大为 100CreatePersonList(g_PersonLists); / Create All the reader and writers printf("Created all the reader and writern.n");g_CurrentTime = 0; while(true) g_CurrentTime+; Sleep(300); / 300 ms printf("CurrentTime = %dn",g_CurrentTime);/ 显示时间片数if(finished)/ 读者完成
14、时结束return 0; / return 0;/创建所有读者与写者void CreatePersonList(int *pPersonLists)int i=0;int *pList = pPersonLists;bool Ret;while(pList0 != END)switch(pList1)case R:Ret = CreateReader(pList2,pList3,pList0);/351,w452,523,654 break;case W:Ret = CreateWriter(pList2,pList3,pList0); break;if(!Ret)printf("C
15、reate Person %d is wrongn",pList0); pList += 4; / move to next person list/读过程DWORD WINAPI ReaderProc(LPVOID lpParam)Person *pPerson = (Person*)lpParam;/ wait for the start timewhile(g_CurrentTime != pPerson->m_nStartTime)printf("Reader %d is Requesting .n",pPerson->m_nID);print
16、f("nn*/ wait for the write requestWaitForSingleObject(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
17、Buffer.n",pPerson->m_nID);printf("nn*while(g_CurrentTime <= pPerson->m_nStartTime + pPerson->m_nWorkTime)printf("Reader %d is Exit.n",pPerson->m_nID);printf("nn*WaitForSingleObject(g_hReadSemaphore,INFINITE);g_NumOfReading-;if(g_NumOfReading = 0)ReleaseSemapho
18、re(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 timewhile(g_CurrentTime != pPerson->m
19、_nStartTime)printf("Writer %d is Requesting .n",pPerson->m_nID);printf("nn);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_
20、nID);while(g_CurrentTime <= pPerson->m_nStartTime + pPerson->m_nWorkTime)printf("Writer %d is Exit.n",pPerson->m_nID);printf("nn);/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 = &g_Personsg_NumPerson; pPerson->m_nID = ID;pPerson->m_nStartTime = StartTime; pPerson->m_nWorkTime = Wor
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 排水管道根管修复技术方案
- 小学教室环保涂料选择与应用方案
- 2026年安庆太湖县公开招聘寺前镇村级后备干部笔试备考试题及答案解析
- 2026江西新余开物金服科技有限公司招聘笔试参考题库及答案解析
- 砌体结构防火技术方案
- 2026山东淄博市张店区卫生健康系统事业单位招聘卫生类专业技术人员11人笔试备考题库及答案解析
- 个案护理实践:循证护理的应用
- 采暖系统水质管理与处理方案
- 室内给水管道支架布置方案
- 中学教室墙面防火涂料施工方案
- 新能源题库完整版本
- 铝合金轮毂课件
- 中国舞蹈史完
- 钢骨混凝土(本科)课件
- 《SAM系统基本知识》课件
- 湘教版八年级上册初二数学全册单元测试卷(含期中期末试卷)
- 2023年常州市社区工作者招聘考试真题
- 机场人脸识别安检方案介绍
- 产业经济学-王俊豪主编
- GB/T 5782-2016六角头螺栓
- GB/T 4937.3-2012半导体器件机械和气候试验方法第3部分:外部目检
评论
0/150
提交评论