




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上操作系统课程设计课 题:读者写者问题姓 名:赫前进班 级:学 号指导教师:叶瑶提交时间:2012/12/30(一)实验目的1.进一步理解 “临界资源” 的概念;2.把握在多个进程并发执行过程中对临界资源访问时的必要约束条件;3.理解操作系统原理中 “互斥” 和 “同步” 的涵义。(二)实验内容利用程序设计语言编程,模拟并发执行进程的同步与互斥(要求:进程数目不少于 3 个)。(三)、程序分析读者写者问题的定义如下:有一个许多进程共享的数据区,这个数据区可以是一个文件或者主存的一块空间;有一些只读取这个数据区的进程(Reader)和一些只往数据区写数据的进程(Write
2、r),此外还需要满足以下条件:(1) 任意多个读进程可以同时读这个文件;(2) 一次只有一个写进程可以往文件中写;(3) 如果一个写进程正在进行操作,禁止任何读进程度文件。实验要求用信号量来实现读者写者问题的调度算法。实验提供了signal类,该类通过P( )、V( )两个方法实现了P、V原语的功能。实验的任务是修改Creat_Writer()添加写者进程,Creat_Reader()创建读者进程。Reader_goon()读者进程运行函数。读优先:要求指一个读者试图进行读操作时,如果这时正有其他读者在进行操作,他可直接开始读操作,而不需要等待。读者优先的附加限制:如果一个读者申请进行读操作时
3、已有另一读者正在进行读操作,则该读者可直接开始读操作。写优先:一个读者试图进行读操作时,如果有其他写者在等待进行写操作或正在进行写操作,他要等待该写者完成写操作后才开始读操作。写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。在Windows 7 环境下,创建一个控制台进程,此进程包含 n 个线程。用这 n 个线程来表示 n 个读者或写者。每个线程按相应测试数据文件(格式见下)的要求进行读写操作。用信号量机制分别实现读者优先和写者优先的读者/写者问题。运行结果显示要求:要求在每个线程创建、发出读写操作申请、开始
4、读写操作和结束读写操作时分别显示一行提示信息,以确定所有处理都遵守相应的读写操作限制。 测试数据文件包括 n 行测试数据,分别描述创建的 n 个线程是读者还是写者,以及读写操作的开始时间和持续时间。每行测试数据包括4个字段,各个字段间用空格分隔。Ø 第一个字段为一个正整数,表示线程序号Ø 第二个字段表示相应线程角色,R 表示读者,W 表示写者Ø 第三个字段为一个正数,表示读/写操作的开始时间:线
5、程创建后,延迟相应时间(单位为秒)后发出对共享资源的读/写请求Ø 第四个字段为一正数,表示读/写操作的持续时间:线程读写请求成功后,开始对共享资源的读/写操作,该操作持续相应时间后结束,并释放共享资源例如:1 R 3 52 W 4 53 R 5 24 R 6 55 W 5.1 3读者写者问题是操作系统中经典的互斥问题:一块数据被多个读者和写者的访问,需要考虑读写互斥、写写互斥(可以同时由多个读者读取)。具体的又可以分为读者优先和写者优先两类。读者优先算法:当新的读者到来的时候,若当前正有读者在进行读操作,则该读者无需等待前面的写操
6、作完成,直接进行读操作。设置两个互斥信号量:rwmutex 用于写者与其他读者/写者互斥的访问共享数据rmutex 用于读者互斥的访问读者计数器readcountvar rwmutex, rmutex : semaphore := 1,1 ;int readcount = 0;cobegin readeri begin / i=1,2,. P(rmutex);
7、60; Readcount+; If (readcount = 1) P(rwmutex); V(rmutex); 读数据; P(rmutex);
8、 Readcount-; If (readcount = 0) V(rwmutex); V(rmutex); End Writerj begin / j = 1,2,. P(rwmu
9、tex); 写更新; V(rwmutex); EndCoend写者优先:条件:1)多个读者可以同时进行读2)写者必须互斥(只允许一个写者写,也不能读者写者同时进行)3)写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者)设置三个互斥信号量:rwmutex 用于写者与其他读者/写者互斥的访问共享数据rmutex 用于读者互斥的访问读者计数器
10、readcountnrmutex 用于写者等待已进入读者退出,所有读者退出前互斥写操作var rwmutex, rmutex,nrmutex : semaphore := 1,1,1 ;int readcount = 0;cobegin readeri begin / i=1,2,. P(rwmutex); P(rmutex);
11、 Readcount+; If (readcount = 1) P(nrmutex); /有读者进入,互斥写操作 V(rmutex); V(rwmutex); / 及时释放读写互斥信号量,允许其它读、写进程申请资源
12、 读数据; P(rmutex); Readcount-; If (readcount = 0) V(nrmutex); /所有读者退出,允许写更新
13、V(rmutex); End Writerj begin / j = 1,2,. P(rwmutex); / 互斥后续其它读者、写者 P(nrmutex); /如有读者正在读,等待所有读者读完 写更新;
14、60; V(nrmutex); /允许后续新的第一个读者进入后互斥写操作 V(rwmutex); /允许后续新读者及其它写者 EndCoend/*-函数声明-*/void Creat_Writer(); /添加一个写者void Del_Writer(); /删除一个写者void Creat_Reader(); /添加一个读者void Reader_go
15、on(); /读者进程运行函数void R_Wakeup(); /唤醒等待读者void Del_Reader(); /删除一个读者void Show(); /显示运行状态 /*= class signal =*/class signal /信号量对象.private:int value;int queue; /用int型数据模拟等待队列.public:signal();signal(int n);int P(); /检查临界资源int V(); /释放临界资源int Get_Value();int Get_Queue();/#include<windows.h> #include&
16、lt;fstream>#include<cstdlib>#include<iostream>using namespace std;const int MaxThread=20; struct ThreadInfo int num; char type; double start; double time; thread_infoMaxThread;HANDLE hX; HANDLE hWsem; HANDLE threadMaxThread; int readcount; double totaltime; void WRITEUNIT(int iProcess
17、) printf("Thread %d begins to write.n",iProcess); Sleep(DWORD)(thread_infoiProcess-1.time*1000); printf("End of thread %d for writing.n",iProcess);void READUNIT(int iProcess) printf("Thread %d begins to read.n",iProcess); Sleep(DWORD)(thread_infoiProcess-1.time*1000); p
18、rintf("End of thread %d for reading.n",iProcess);DWORD WINAPI reader(LPVOID lpVoid) int iProcess = *(int*)lpVoid; Sleep(DWORD)(thread_infoiProcess-1.start*1000); DWORD wait_for=WaitForSingleObject(hX,INFINITE); printf("Thread %d requres reading.n",iProcess); readcount+; if(readco
19、unt=1)WaitForSingleObject(hWsem,INFINITE); ReleaseMutex(hX); READUNIT(iProcess); wait_for=WaitForSingleObject(hX,INFINITE); readcount-; if(readcount=0) ReleaseSemaphore(hWsem,1,0); ReleaseMutex(hX); return iProcess;DWORD WINAPI writer(LPVOID lpVoid) int iProcess = *(int*)lpVoid; Sleep(DWORD)(thread_
20、infoiProcess-1.start*1000); printf("Thread %d requres writing.n",iProcess); DWORD wait_for=WaitForSingleObject(hWsem,INFINITE); WRITEUNIT(iProcess); ReleaseSemaphore(hWsem,1,0); return iProcess; int main() int threadNum; int threadcount; ifstream file; hX=CreateMutex(NULL, FALSE, NULL); hW
21、sem=CreateSemaphore(NULL,1,1,NULL); /? readcount=0; threadcount=0; totaltime=0; file.open("thread.dat",ios:in); if(file=0) printf("File Open Error.n"); return 0; while(file>>threadNum) thread_infothreadNum-1.num=threadNum; file>>thread_infothreadNum-1.type; file>&g
22、t;thread_infothreadNum-1.start; file>>thread_infothreadNum-1.time; totaltime+=thread_infothreadNum-1.time; switch(thread_infothreadNum-1.type) case 'W': printf("Creating Thread %d for writing.n",thread_infothreadNum-1.num); threadthreadNum-1 = CreateThread(NULL, 0,writer, &am
23、p;thread_infothreadNum-1.num,0,0); break; case 'R': printf("Creating Thread %d for reading.n",thread_infothreadNum-1.num); threadthreadNum-1 = CreateThread(NULL, 0,reader, &thread_infothreadNum-1.num,0,0); break; threadcount+; file.close(); Sleep(DWORD)(totaltime*1000); return
24、1;/semaphore fmutex = 1 , rdcntmutex = 1 ;/ fmutex -> access to file; rdcntmutex -> access to readcount int readcount = 0 ;void reader() while ( 1 ) P(rdcntmutex); if ( readcount=0) P(fmutex); readcount = readcount + 1 ; V(rdcntmutex); / Do read operation P(rdcntmutex); readcount = readcount - 1 ; if ( readcount=0) V(fmutex); V(rdcntmutex); void writer()
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 煤矿安装综掘机施工方案
- 辽宁管道防腐施工方案
- 新乡停车场照明施工方案
- 全面提高云杉育苗质量和成活率的栽培技术研究
- 新未来大学英语 视听说教程1(智慧版) 听力脚本汇 Unit 1 -6
- 新未来大学英语 视听说教程1(智慧版) 听力脚本 Unit 2
- 变电站无人机智能识别技术
- 任务型教学法在高中语文教学中的应用研究
- 基于问题链的高中英语阅读教学实践探究
- 加强污染防治和生态建设的策略及实施路径
- 剪力墙止水对拉螺栓施工方案
- QES三体系内审检查表 含审核记录
- 2023年江苏省无锡市中考模拟英语试卷(附答案)
- 北京市新英才学校教职员工手册
- 带电核相试验报告
- 肾单位的结构(课堂PPT)
- 春季常见传染病预防知识PPT课件
- VDA2供货质量保证培训PPT课件
- 折叠纸盒结构设计
- 轧机安装方案
- 教师教学常规工作检查记录表
评论
0/150
提交评论