《OS课程设计读者写者.docx》由会员分享,可在线阅读,更多相关《OS课程设计读者写者.docx(28页珍藏版)》请在课桌文档上搜索。
1、老州衮通裔假操作系统课程设计课程:计算机操作系统题目:进程同步(读者一写者)班级:姓名:学号:指导老师:日期:2012年12月21日书目1题目12wa121问题描述122采纳信号fit机制13蝌蝴目的与功能23.1 设计目的23.2 设计功能24总体设计34功能流程图34.2 开发平台与源程序的主要部分44.3 数据结构44.4 模块说明44.5 源程序55潴试用例,运行结果与运行状况分析225.1 测试用例225.2 运行结果2353运行结果分析246总结与行261题目进程同步模拟设计一读者和写者问题2.1 问题描述模拟用信号侬机制实现读者和写者问题,即有两组并发进程:读者和写者,共享一组数
2、据区,进行读写操作,要求任一时刻“写者”最多只允许一个,而读者”则允很多个。2.1.1 要求允很多个读者同时执行读操作;不允许读者、写者同时操作;不允很多个写者同时操作。2.1.2 读者加写者的相互关系:2.2 采纳信号-机制1) WmUteX表示读写的互斥信号量,初值:Wmutex=1;2)公共变fitRcount表示“正在读”的进程数,初值:Rcount=0;3)Rmutex:表示对RCoUnt的互斥操作,初值:Rmutex-1o3课程设计目的与功能3.1 设计目的通过试验模拟读者和写者之间的关系,了解并驾驭他们之间的关系与其原理。由此增加对进程同步的问题的了解,详细如下:D驾驭基本的同步
3、互斥算法,理解读者和写者模型;2) 了解WindOWS中多线程(多进程)的并发执行机制,线程(进程)间的同步和互斥;3)学习运用WindoWS中基本的同步对象,亚驭相应的AP1.3.2 蚂娜利用模拟用信号量机制实现读者和写者问题:通过用户限制读进程和写进程,反应读者和写者问题中所涉与的进程的同步与互斥。4.1功能流程图结束4.2 开发平台与源程序的主要部分本试验用C+语旨在VisualC+6.0中编程。4.3 髓结构intJnUm;读者个数intw_num;/写者个数intWmUteX=1;表示允许写成允许读intRCOUnt=0;表示正在读的进程数intRmUteX=1;/表示对Rcount
4、的互斥操作intr100,0,0,0,0,0,0,0,0,0;/表示读者的状态,1表示正在读intw10=0,0,0,0,0,0,0,0,0,0;/表示写者的状态,1表示正在写表示等待队列,0-9表示写者,10时需引入读者的等待队列,-1表示空intw-waitll-l,-Irb-Irb-Irlr1.-1.-Irlh读者的等待队列,。-9表示对应的读者,-1为空intr_wait(U=-l,-l,-1,-1,-1,-1,-1,-1,-1,-IrU;4.4 模块说明四组P、V函数:D写者进程由3个函数组成voidWrite_p(inti)模拟写者对Wmutex的P操作,同时也作为写者进程的人口v
5、oidwrite(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_
6、v(inti)模拟读者对Wmutex的V操作voidrsub_v(inti)模拟读之后对Rmutex的V操作4.5 海程期#include#include#include#includeusingnamespacestd;intr_num;/读者个数intw_num;/写者个数intWmutex=I;表示允许写或允许读intRcount=O;表示正在读的进程数intRmutex=1;表示对Rcount的互斥操作intr(101=0,0,0,0,0,0,0,0,0,0h/表示读者的状态,】表示正在读intw10=0,0,0,0,0,0,0,0,0,0;表示写者的状态,1表示正在写intw.wai
7、t11l=-1,-lrl,-1,-1,-1,-1,-1,-1,-1,-U;表示等待队列。9表示写者,10时需引入读者的等待队列,-1表示空intJWaitUlEm-I11,-1,-1,-1,-11;读者的等待队列,0-9表示对应的读者,-1为空voidwrite.p(inti);模拟写者对WmUteX的P操作,同时也作为写者进程的入口voidwrite(inti);起先写操作voidwrite_v(inti);模拟笃者对WmUteX的V操作,写操作完成的时候调用voidradd_p(inti);模拟读之前对Rmutex的P操作,同时也作为读者进程的入口voidradd(inti);/Rcoun
8、t加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(WmutexO)/表示假如WmUteX0,则该写者
9、进入等待队w_wait-Wmutex-l=i;elsewrite(i);进行写操作voidwrite(inti)wi=l;模拟写者对Wmutex的V操作,写操作完成的时候调用voidWrite_v(inti)(wi=O;Wmutex+;if(Wmutex=O)/表示假如Wmutex=O)&(w_waitOw_num)j=w_waitO|;for(k=0;kw_num;k+)w_waitk=w_waitk+1;write(j);elsej=r-waitO;for(k=0;kw_num;k+)w_waitk=w_wait(k+1;for(k=0;kr_num;k+)r_waitk=r_wait(k
10、+1);radd.v(j);模拟读之前对Rmutex的P操作,同时也作为读者进程的入口Rmutex-;if(RmutexO)/表示假如RmUteX0,则进入等待队列JWaid-RmUteX=i;elseradd(i);对于Rcount加1的限制voidradd(inti)Rcount+;if(Rcount=l)read.p(i);elseradd_v(i);模拟读者对WmUteX的P操作:voidread_p(inti)Wmutex-;if(WmutexO)表示假如WmUteXV0,则进入等待队列w_wait-Wmutex-1)=10;r.wait0=i;elseradd-v(i);模拟读之前
11、对Rmutex的V操作voidradd_v(inti)Rmutex+;if(Rmutex=O)/表示假如Rmutex=0,则从等待队列中选择读者进入RCOUnt的临界区intk,j;j=r-waitO;for(k=0;kr_num;k+)r_waitk=r_waitk+1;radd(j);rcad(i);进行读操作voidread(inti)ri=l;模拟读之后对Rmutex的P操作,读操作完成的时候调用voidrsub_p(inti)(ri=O;Rmutex-;rsub(i);对RcoUnt减1的限制voidrsub(inti)Rcount;if(Rcount=0)read_v(i);els
12、ersub-v(i);模拟读者对Wmutex的V操作voidread_v(inti)Wmutex+;if(Wmutex=0)&(w_wait0w_num)j=w-waitO;for(k=0;kw_num;k+)w_waitk=w_waitIk+1;write(j);elsej=r.waitO;for(k=0;kw_num;k+)w_waitk=w_waitk+1;for(k=0;kr_num;k+)r_waitk=r_waitk+1;radd_v(j);rsub_v(i);模拟读之后对Rmutex的V操作voidrsub_v(inti)Rmutex+;intmain()coutttt读者一写者
13、问题演示coutw_num;while(w_num10)COUtw_num;/完成对写者个数的输入c。UtVV”请输入读者个数(1-10):;cinr-num;while(r_num10)coutr.num;完成对读者个数的输入intx,k,j,a20;while(l)coutM*endl;for(k=0;k20;k+)ak)=O;coutnWmutex=Wmutext,RcounttRmutex=Rmutexendl;coutendl;for(k=0;kw_num;k+)if(wlk=l)cout写者”v(k+l)正在写endl;for(k=0;kr_num;k+)if(rkl=l)cout
14、=读者vv(k+l)vv正在读=endl;if(w-waitO=-l)JCOUtVV等待队列中无对象endl;coutendl;elseCoUt”等待队列中有:”;for(k=0;kw_num;k+)if(w_waitk=10)for(j=0;j5;j+)cout读者if(w_waitk=0)8b&(w_waitkw_num)cout写者(w-wait(k+1)t;coutcndl;for(k=0;kw_num;k+)x=0;for(j=0;jw_num;j+)if(k=w-waitj)a(k=l;x=1;if(x=l)continue;cout(k+l)写者v(k+l);if(wk=O)Co
15、Utv中清,;elseCOUt完成;for(k=0;kr_num;k+)x=0;for(j=0;jr_num;j+)if(k=r_waitj)ak+w_num=l;x=1;if(x=l)continue;coutr,(k+l+w_num)读者(k+l);if(rk=O)couti,;elseCOUt完成;cout(w_num+r_num+1)结束vx;while(x(w_num+r_num+l)ax-ll=l)if(ax-l=l)CoUt该对象已在等待队列中,请重新输入门elseCOUtx;for(k=0;kw_num;k+)if(x=(k+l)if(wk=O)write.p(k);elsew
16、rite_v(k);break;for(k=0;k读者2读者5(6)读者3申请I(I)写者1申请(2)写者2申谓(3)写者院成(4)读者1申请(7)读者4申请(9)结束谚输入选项序号,3if*W11utex=0RCoUnt=2Rmutex=I;=田2Z在读=(5)读者编成F=X=读者5正在读=汽待队列中无对象(1)写者1申谓(2)写者2申请(3)写者3申谪(4)读者1申请I(6)读者3申请(7)读者4申请(8)读者5完成(9)结束帆输入选项序号,811utex=0Rcount=IRroutex=I=i精证在读=等待队列中无对象(5)读者院成(1)写者1申请(2)写者2申请(3)写者3申请(4)
17、读者1申请(6)读者3申请(7)读者4申请(8)读者5申请(9)结束,输入选项序号,5*O*f*t=tcl*C*1结果三:*珞打*料*共*打*择*办*共*林*北未*林东科林Rcount=ORnutcx=I等待队列中无对象(3)可者3申请(4)读者1申请(5)读者2申请(8)读者5申请(9)结束(1)写者1申请(2)写者2申请(6)读者3申请(7)读者4申请请输入选项序号:9Pressanykeytocontinue5.3运行储果分析1、输入写者个数:33、刚起先时Wmutex=1Rcount=ORmUtCX=I,写者1申请写操作,此时,信号fitWmUteX减1,所以WmUteX=O,写者1可
18、以干脆起先写操作4、写者3申请写操作此时,信号量Wmutex减1,所以WmUtCX=-I,写者1正在写,所以写者3进入等待队列5、读者2巾请读操作此时,信号砧Rmutex减1,所以Rmutex=O,Rcount力Il1,所以RCoUnt=1,又因为Rcount=1,所以WmUtCX减1,WmUtCX=-2,写者1正在写,所以读者2进入等待队列6、写者1完成写操作此时,信号量WmUteX加1,所以WmUteX=-I,写者3起先写操作7、读者5申请读操作此时,信yISRmutex减1,所以Rmutex=-1,读者2还在Rcount的临界区中,所以读者5等待8、写者3完成写操作此时,信号量Wmute
19、x加1,所以Wmutex=O,读者2从等待队列中取出,并且Rmutex加1,则RmUteX=O,读者2起先读操作,读者5进入Rcount的临界区,Rcount加l,Rcount=2,Rmutex加1,RmUteX=I,此时读者5可干脆起先读操作,所以此时,读者2和读者5正在进行读操作9、读者5完成读操作此时Rcount减1,RcoUnt=I,还剩读者2在进行读操作10、读者2完成读操作此时Rcount减1,Rcount=O1Wmutex力Il1,所以Wmutex=111、结束6总结与心得本课程设计是学生学习完计算机操作系统课程后,进行的一次全面的综合训练,通过课程设计,我更好地驾驭了操作系统的
20、原理与实现方法,加深对操作系统基础理论和重要算法的理解,加强了动手实力。在设计过程中,出现了很多问题,比如对涉与到的学问没方深化的理解,对其实现方法感到很模糊,有时不知道该用什么方案来解决该问题,但通过自己杳资料,进行深化的了解后,慢慢对其所用到的学问和方法有了清舱的相识、理解,能依据问题描述逐步对问题进行分析、抽象,并将其进行转化,最终通过编程实现该问题所描述的功能。这次自己的收获还是不小,首先使我提高了分析问题,并依据需求转化成相应的程序结构的实力;其次也丰富了自己编写程序,调试程序的阅历,这使得我编程时可能出现的错误的相识,并如何去避开产生了新的相识。总的来说,通过本次设计收获很大。首先
21、更加娴熟的驾驭了通过P、V原语和信号成解决一些问题的思想。其次,编程实力得到提高。在起先编程的时候发觉程序并不像想象中的那样简洁实现,最终最终通过把写者和读者进程分别分割为若干个函数,并通过其中的相互连接实现了模拟。同时运行时对操作界面中的选项动态的给出很重要,例如,若某个写者还没有申请写操作,则给出的该选项为写者i申请;若某个写者在等待队列中,则不给出该写者的选项;若某个写者正在进行写操作,则给出的该选项为写者i完成。读者和写者问题,始终认为这些东西很简洁,但是详细编程实现其模拟并不简洁。虽然这还不算真正的实践,但通过这次设计,向实践除近了一步。更加深刻的理解了操作系统中这些理论学问的意义。路漫漫其修远兮,吾将上下而求索!