![OS课程设计读者写者_第1页](http://file4.renrendoc.com/view12/M00/0B/09/wKhkGWbFLVaAJ875AAB0_T5RUM4512.jpg)
![OS课程设计读者写者_第2页](http://file4.renrendoc.com/view12/M00/0B/09/wKhkGWbFLVaAJ875AAB0_T5RUM45122.jpg)
![OS课程设计读者写者_第3页](http://file4.renrendoc.com/view12/M00/0B/09/wKhkGWbFLVaAJ875AAB0_T5RUM45123.jpg)
![OS课程设计读者写者_第4页](http://file4.renrendoc.com/view12/M00/0B/09/wKhkGWbFLVaAJ875AAB0_T5RUM45124.jpg)
![OS课程设计读者写者_第5页](http://file4.renrendoc.com/view12/M00/0B/09/wKhkGWbFLVaAJ875AAB0_T5RUM45125.jpg)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/兰州交通大学操作系统课程设计课程:计算机操作系统题目:进程同步(读者--写者)班级:姓名:学号:指导教师:日期:2012年12月21日目录1题目 12设计概述 12.1问题描述 12.2采用信号量机制 13课程设计目的与功能 13.1设计目的 13.2设计功能 14总体设计思想概述 24.1功能流程图 24.2开发平台与源程序的主要部分 34.3数据结构 34.4模块说明 34.5源程序 35测试用例,运行结果与运行情况分析 125.1测试用例 125.2运行结果 125.3运行结果分析 146总结与心得 151题目进程同步模拟设计——读者和写者问题2设计概述2.1问题描述模拟用信号量机制实现读者和写者问题,即有两组并发进程:读者和写者,共享一组数据区,进行读写操作,要求任一时刻“写者”最多只允许一个,而“读者”则允许多个。2.1.1要求允许多个读者同时执行读操作;不允许读者、写者同时操作;不允许多个写者同时操作。2.1.2读者和写者的相互关系:2.2采用信号量机制1)Wmutex表示读写的互斥信号量,初值:Wmutex=1;2)公共变量Rcount表示“正在读”的进程数,初值:Rcount=0;3)Rmutex:表示对Rcount的互斥操作,初值:Rmutex=1。3课程设计目的与功能3.1设计目的通过实验模拟读者和写者之间的关系,了解并掌握他们之间的关系与其原理。由此增加对进程同步的问题的了解。具体如下:1)掌握基本的同步互斥算法,理解读者和写者模型;2)了解windows中多线程(多进程)的并发执行机制,线程(进程)间的同步和互斥;3)学习使用windows中基本的同步对象,掌握相应的API。3.2设计功能利用模拟用信号量机制实现读者和写者问题:通过用户控制读进程和写进程,反应读者和写者问题中所涉与的进程的同步与互斥。4总体设计思想概述4.1功能流程图开始开始输入读者和写者个数用户进行选择操作操作运行进程读者进程同时进行读操作,写者依次进入等待第一个写者进行写操作,后面进程依次进入等待状态多进程?NNo.1写者?YY用户进行选择操作操作结束N4.2开发平台与源程序的主要部分本实验用C++语言在VisualC++6.0中编程。4.3数据结构intr_num;//读者个数intw_num;//写者个数intWmutex=1;//表示允许写或允许读intRcount=0;//表示正在读的进程数intRmutex=1;//表示对Rcount的互斥操作intr[10]={0,0,0,0,0,0,0,0,0,0};//表示读者的状态,1表示正在读intw[10]={0,0,0,0,0,0,0,0,0,0};//表示写者的状态,1表示正在写//表示等待队列,0-9表示写者,10时需引入读者的等待队列,-1表示空intw_wait[11]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};//读者的等待队列,0-9表示对应的读者,-1为空intr_wait[11]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};4.4模块说明四组P、V函数:1)写者进程由3个函数组成voidwrite_p(inti)//模拟写者对Wmutex的P操作,同时也作为写者进程的入口voidwrite(inti)//开始写操作voidwrite_v(inti)//模拟写者对Wmutex的V操作,写操作完成的时候调用2)读者进程由8个函数组成voidradd_p(inti)//模拟读之前对Rmutex的P操作,同时也作为读者进程的入口voidradd(inti)//Rcount加1voidread_p(inti)//模拟读者对Wmutex的P操作voidradd_v(inti)//模拟读之前对Rmutex的V操作voidread(inti)//读voidrsub_p(inti)//模拟读之后对Rmutex的P操作,读操作完成的时候调用voidrsub(inti)//Rcount减1voidread_v(inti)//模拟读者对Wmutex的V操作voidrsub_v(inti)//模拟读之后对Rmutex的V操作4.5源程序#include<stdio.h>#include<windows.h>#include<process.h>#include<iostream>usingnamespacestd;intr_num;//读者个数intw_num;//写者个数intWmutex=1;//表示允许写或允许读intRcount=0;//表示正在读的进程数intRmutex=1;//表示对Rcount的互斥操作intr[10]={0,0,0,0,0,0,0,0,0,0};//表示读者的状态,1表示正在读intw[10]={0,0,0,0,0,0,0,0,0,0};//表示写者的状态,1表示正在写intw_wait[11]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};//表示等待队列,0-9表示写者,10时需引入读者的等待队列,-1表示空intr_wait[11]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};//读者的等待队列,0-9表示对应的读者,-1为空voidwrite_p(inti);//模拟写者对Wmutex的P操作,同时也作为写者进程的入口voidwrite(inti);//开始写操作voidwrite_v(inti);//模拟写者对Wmutex的V操作,写操作完成的时候调用voidradd_p(inti);//模拟读之前对Rmutex的P操作,同时也作为读者进程的入口voidradd(inti);//Rcount加1voidread_p(inti);//模拟读者对Wmutex的P操作voidradd_v(inti);//模拟读之前对Rmutex的V操作voidread(inti);//读voidrsub_p(inti);//模拟读之后对Rmutex的P操作,读操作完成的时候调用voidrsub(inti);//Rcount减1voidread_v(inti);//模拟读者对Wmutex的V操作voidrsub_v(inti);//模拟读之后对Rmutex的V操作//模拟写者对Wmutex的P操作,同时为写者进程也作写的入口voidwrite_p(inti){ Wmutex--; if(Wmutex<0)//表示如果Wmutex<0,则该写者进入等待队列 { w_wait[-Wmutex-1]=i; } else write(i);}//进行写操作voidwrite(inti){ w[i]=1;}//模拟写者对Wmutex的V操作,写操作完成的时候调用voidwrite_v(inti){ w[i]=0; Wmutex++; if(Wmutex<=0) //表示如果Wmutex<=0,则从等待队列中选择写者或读者进行操作 { intk,j; if((w_wait[0]>=0)&&(w_wait[0]<w_num)) { j=w_wait[0]; for(k=0;k<w_num;k++) w_wait[k]=w_wait[k+1]; write(j); } else { j=r_wait[0]; for(k=0;k<w_num;k++) w_wait[k]=w_wait[k+1]; for(k=0;k<r_num;k++) r_wait[k]=r_wait[k+1]; radd_v(j); } }}//模拟读之前对Rmutex的P操作,同时也作为读者进程的入口voidradd_p(inti){ Rmutex--; if(Rmutex<0)//表示如果Rmutex<0,则进入等待队列 { r_wait[-Rmutex]=i; } else radd(i);}//对于Rcount加1的控制voidradd(inti){ Rcount++; if(Rcount==1) read_p(i); else radd_v(i);}//模拟读者对Wmutex的P操作:voidread_p(inti){ Wmutex--; if(Wmutex<0)//表示如果Wmutex<0,则进入等待队列 { w_wait[-Wmutex-1]=10; r_wait[0]=i; } else radd_v(i);}//模拟读之前对Rmutex的V操作voidradd_v(inti){ Rmutex++; if(Rmutex<=0)//表示如果Rmutex<=0,则从等待队列中选择读者进入Rcount的临界区 { intk,j; j=r_wait[0]; for(k=0;k<r_num;k++) r_wait[k]=r_wait[k+1]; radd(j); } read(i);}//进行读操作voidread(inti){ r[i]=1;}//模拟读之后对Rmutex的P操作,读操作完成的时候调用voidrsub_p(inti){ r[i]=0; Rmutex--; rsub(i);}//对Rcount减1的控制voidrsub(inti){ Rcount--; if(Rcount==0) read_v(i); else rsub_v(i);}//模拟读者对Wmutex的V操作voidread_v(inti){ Wmutex++; if(Wmutex<=0)//表示如果Wmutex<=0,则从等待队列中选择写者或读者进行操作 { intk,j; if((w_wait[0]>=0)&&(w_wait[0]<w_num)) { j=w_wait[0]; for(k=0;k<w_num;k++) w_wait[k]=w_wait[k+1]; write(j); } else { j=r_wait[0]; for(k=0;k<w_num;k++) w_wait[k]=w_wait[k+1]; for(k=0;k<r_num;k++) r_wait[k]=r_wait[k+1]; radd_v(j); } } rsub_v(i);}//模拟读之后对Rmutex的V操作voidrsub_v(inti){ Rmutex++;}intmain(){ cout<<"\t\t\t==========读者--写者问题演示=========="<<endl; cout<<endl; cout<<"请输入写者个数(1-10):"; cin>>w_num; while(w_num<1||w_num>10) { cout<<"输入有误,请重新输入写者个数(1-10):"; cin>>w_num; }//完成对写者个数的输入 cout<<"请输入读者个数(1-10):"; cin>>r_num; while(r_num<1||r_num>10) { cout<<"输入有误,请重新输入读者个数(1-10):"; cin>>r_num; }//完成对读者个数的输入intx,k,j,a[20]; while(1) { cout<<"***********************************************************"<<endl; for(k=0;k<20;k++) a[k]=0; cout<<"Wmutex="<<Wmutex<<"\t"<<"Rcount="<<Rcount<<"\t"<<"Rmutex="<<Rmutex<<endl; cout<<endl; for(k=0;k<w_num;k++) { if(w[k]==1) cout<<"==========写者"<<(k+1)<<"正在写=========="<<endl; } for(k=0;k<r_num;k++) { if(r[k]==1) cout<<"==========读者"<<(k+1)<<"正在读=========="<<endl; } if(w_wait[0]==-1){ cout<<"等待队列中无对象········"<<endl; cout<<endl; } else { cout<<"等待队列中有:"; for(k=0;k<w_num;k++) { if(w_wait[k]==10) for(j=0;j<5;j++) { if(r_wait[j]!=-1) cout<<"-->"<<"读者"<<(r_wait[j]+1)<<"\t"; } if((w_wait[k]>=0)&&(w_wait[k]<w_num)) cout<<"-->"<<"写者"<<(w_wait[k]+1)<<"\t"; } cout<<endl; } for(k=0;k<w_num;k++) { x=0; for(j=0;j<w_num;j++) { if(k==w_wait[j]) { a[k]=1; x=1; } } if(x==1) continue; cout<<"("<<(k+1)<<")写者"<<(k+1); if(w[k]==0) cout<<"申请"; else cout<<"完成"; } for(k=0;k<r_num;k++) { x=0; for(j=0;j<r_num;j++) { if(k==r_wait[j]) { a[k+w_num]=1; x=1; } } if(x==1) continue; cout<<"("<<(k+1+w_num)<<")读者"<<(k+1); if(r[k]==0) cout<<"申请"; else cout<<"完成"; } cout<<"("<<(w_num+r_num+1)<<")结束"<<endl;cout<<"请输入选项序号:"; cin>>x; while(x<1||x>(w_num+r_num+1)||a[x-1]==1) { if(a[x-1]==1) cout<<"该对象已在等待队列中,请重新输入:"; else cout<<"输入有误,请重新输入:"; cin>>x; } for(k=0;k<w_num;k++) { if(x==(k+1)) { if(w[k]==0) write_p(k); else write_v(k); break; } } for(k=0;k<r_num;k++) { if(x==(k+1+w_num)) { if(r[k]==0) radd_p(k); else rsub_p(k); break; } } if(x==(w_num+r_num+1)) return0; }}5测试用例,运行结果与运行情况分析5.1测试用例本程序模拟读者和写者问题,每个读者和写者对读操作或写操作的申请和完成都由用户手动选择。测试用例如下:输入写者个数:3输入读者个数:53、写者1申请写操作(选择选项(1))4、写者3申请写操作(选择选项(3))5、读者2申请读操作(选择选项(5))6、写者1完成写操作(选择选项(1))7、读者5申请读操作(选择选项(8))8、写者3完成写操作(选择选项(3))9、读者5完成读操作(选择选项(8))10、读者2完成读操作(选择选项(5))11、结束(选择选项(9))5.2运行结果结果一:结果二:结果三:5.3运行结果分析1、输入写者个数:32、输入读者个数:53、刚开始时Wmutex=1Rcount=0Rmutex=1,写者1申请写操作,此时,信号量Wmutex减1,所以Wmutex=0,写者1可以直接开始写操作4、写者3申请写操作此时,信号量Wmutex减1,所以Wmutex=-1,写者1正在写,所以写者3进入等待队列5、读者2申请读操作此时,信号量Rmutex减1,所以Rmutex=0,Rcount加1,所以Rcount=1,又因为Rcount=1,所以Wmutex减1,Wmutex=-2,写者1正在写,所以读者2进入等待队列6、写者1完成写操作此时,信号量Wmutex加1,所以Wmutex=-1,写者3开始写操作7、读者5申请读操作此时,信号量Rmutex减1,所以Rmutex=-1,读者2还在Rcount的临界区中,所以读者5等待8、写者3完成写操作此时,信号量Wmutex加1,所以Wmutex=0,读者2从等待队列中取出,并且Rmutex加1,则Rmutex=0,读者2开始读操作,读者5进入Rcount的临界区,Rcount加1,Rcount=2,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年01月中国疾控中心信息中心公开招聘1人笔试历年典型考题(历年真题考点)解题思路附带答案详解
- 2024年12月江苏苏州市昆山市市场监督管理局公开招聘编外人员4人笔试历年典型考题(历年真题考点)解题思路附带答案详解
- 在区2025年三级干部大会上的讲话稿
- 急性脑梗规范治疗死课件
- 《时尚北京》杂志2023年第1期
- 母儿血型不合、胎儿窘迫、生长受限课件
- (高清版)DB37∕T 3023.1-2017 工作场所空气有毒物质测定 第1部分:甲酸 离子色谱法
- 《对比论证类型》课件
- 二零二五年度膨润土行业绿色生产技术引进合同4篇
- 《结肠癌护理查房》课件
- 2024版金矿居间合同协议书
- 2025内蒙古汇能煤化工限公司招聘300人高频重点提升(共500题)附带答案详解
- 公路工程工程量清单(全)
- 旧金山china town中文介绍课件
- 初中英语 沪教牛津版 9A U7-1 Reading Tom Sawyer paints the fence 课件
- 血液科品管圈汇报-PPT课件
- 骗提个人住房公积金检讨书
- 监控系统维保方案计划及报价
- E-learning平台使用手册(培训管理员版)
- 管道保温及面积计算公式
- 江西省日照小时数
评论
0/150
提交评论