OS课程设计报告.doc

上传人:李司机 文档编号:1119173 上传时间:2022-06-27 格式:DOC 页数:15 大小:102KB
返回 下载 相关 举报
OS课程设计报告.doc_第1页
第1页 / 共15页
OS课程设计报告.doc_第2页
第2页 / 共15页
OS课程设计报告.doc_第3页
第3页 / 共15页
OS课程设计报告.doc_第4页
第4页 / 共15页
OS课程设计报告.doc_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《OS课程设计报告.doc》由会员分享,可在线阅读,更多相关《OS课程设计报告.doc(15页珍藏版)》请在三一办公上搜索。

1、-. z.交通大学操作系统课程设计课程:计算机操作系统题目:进程同步(读者-写者)目录目录1 1题目题目1 12 2设计概述设计概述1 12.1问题描述12.2采用信号量机制13 3课程设计目的及功能课程设计目的及功能1 13.1设计目的13.2设计功能14 4总体设计思想概述总体设计思想概述2 24.1功能流程图24.2开发平台及源程序的主要局部34.3数据构造34.4模块说明3-. z.4.5源程序35 5测试用例,运行结果与运行情况分析测试用例,运行结果与运行情况分析12125.1测试用例125.2运行结果125.3运行结果分析146 6总结与心得总结与心得1515-. z.1 1题目题

2、目进程同步模拟设计读者和写者问题2 2设计概述设计概述2.12.1问题描述问题描述模拟用信号量机制实现读者和写者问题,即有两组并发进程:读者和写者,共享一组数据区,进展读写操作,要求任一时刻“写者最多只允许一个,而“读者则允许多个。2.1.12.1.1要求要求允许多个读者同时执行读操作;不允许读者、写者同时操作;不允许多个写者同时操作。2.1.22.1.2读者和写者的相互关系:读者和写者的相互关系:2.22.2采用信号量机制采用信号量机制1Wmute*表示读写的互斥信号量,初值: Wmute* =1;2公共变量Rcount表示“正在读的进程数,初值:Rcount =0;3Rmute*:表示对R

3、count的互斥操作,初值:Rmute*=1。3 3课程设计目的及功能课程设计目的及功能3.13.1设计目的设计目的通过实验模拟读者和写者之间的关系,了解并掌握他们之间的关系及其原理。由此增加对进程同步的问题的了解。具体如下:1掌握根本的同步互斥算法,理解读者和写者模型;2了解windows中多线程多进程的并发执行机制,线程进程间的同步和互斥;3学习使用windows中根本的同步对象,掌握相应的API。3.23.2设计功能设计功能利用模拟用信号量机制实现读者和写者问题:通过用户控制读进程和写进程,反响读者和写者问题中所涉及的进程的同步与互斥。-. z.4 4总体设计思想概述总体设计思想概述4.

4、14.1功能流程图功能流程图开场输入读者和写者个数用户进展选择操作操作运行进程读者进程同时进展读操作,写者依次进入等待第一个写者进展写操作,后面进程依次进入等待状态多进程.NNo.1写者.YY用户进展选择操作操作结 束N-. z.4.24.2开发平台及源程序的主要局部开发平台及源程序的主要局部本实验用C+语言在Visual C+6.0中编程。4.34.3数据构造数据构造int r_num;/读者个数int w_num;/写者个数int Wmute*=1;/表示允许写或允许读int Rcount=0;/表示正在读的进程数int Rmute*=1;/表示对Rcount的互斥操作int r10=0,

5、0,0,0,0,0,0,0,0,0;/表示读者的状态,1表示正在读int w10=0,0,0,0,0,0,0,0,0,0;/表示写者的状态,1表示正在写/表示等待队列,0-9表示写者,10时需引入读者的等待队列,-1表示空int w_wait11=-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1;/读者的等待队列,0-9表示对应的读者,-1为空int r_wait11=-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1;4.44.4模块说明模块说明四组P、V函数:1写者进程由3个函数组成void write_p(int i)/模拟写者对Wmute*的P操作,同时也

6、作为写者进程的入口void write(int i)/开场写操作void write_v(int i)/模拟写者对Wmute*的V操作,写操作完成的时候调用2读者进程由8个函数组成void radd_p(int i)/模拟读之前对Rmute*的P操作,同时也作为读者进程的入口void radd(int i)/Rcount加1void read_p(int i)/模拟读者对Wmute*的P操作void radd_v(int i)/模拟读之前对Rmute*的V操作void read(int i)/读void rsub_p(int i)/模拟读之后对Rmute*的P操作,读操作完成的时候调用void

7、 rsub(int i)/Rcount减1void read_v(int i)/模拟读者对Wmute*的V操作void rsub_v(int i)/模拟读之后对Rmute*的V操作4.54.5源程序源程序*include *include *include -. z.*include using namespace std;int r_num; /读者个数int w_num; /写者个数int Wmute*=1; /表示允许写或允许读int Rcount=0; /表示正在读的进程数int Rmute*=1; /表示对Rcount的互斥操作int r10=0,0,0,0,0,0,0,0,0,0;

8、 /表示读者的状态,1表示正在读int w10=0,0,0,0,0,0,0,0,0,0; /表示写者的状态,1表示正在写int w_wait11=-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1; /表示等待队列,0-9表示写者,10时需引入读者的等待队列,-1表示空int r_wait11=-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1;/读者的等待队列,0-9表示对应的读者,-1为空void write_p(int i); /模拟写者对Wmute*的P操作,同时也作为写者进程的入口void write(int i); /开场写操作void write_v(

9、int i); /模拟写者对Wmute*的V操作,写操作完成的时候调用void radd_p(int i); /模拟读之前对Rmute*的P操作,同时也作为读者进程的入口void radd(int i); /Rcount加1void read_p(int i); /模拟读者对Wmute*的P操作void radd_v(int i); /模拟读之前对Rmute*的V操作void read(int i); /读void rsub_p(int i); /模拟读之后对Rmute*的P操作,读操作完成的时候调用void rsub(int i); /Rcount减1void read_v(int i);

10、/模拟读者对Wmute*的V操作void rsub_v(int i); /模拟读之后对Rmute*的V操作/模拟写者对Wmute*的P操作,同时为写者进程也作写的入口void write_p(int i)Wmute*-;if(Wmute*0) /表示如果Wmute*0,则该写者进入等待队列w_wait-Wmute*-1=i;elsewrite(i);/进展写操作void write(int i)-. z.wi=1;/模拟写者对Wmute*的V操作,写操作完成的时候调用void write_v(int i)wi=0;Wmute*+;if(Wmute*=0) /表示如果Wmute*=0)&(w_w

11、ait0w_num)j=w_wait0;for(k=0;kw_num;k+) w_waitk=w_waitk+1;write(j);elsej=r_wait0;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);/模拟读之前对Rmute*的P操作,同时也作为读者进程的入口void radd_p(int i) Rmute*-;if(Rmute*0) /表示如果Rmute*0,则进入等待队列r_wait-Rmute*=i;elseradd(i);-. z./对于Rcount加1的控制

12、void radd(int i)Rcount+;if(Rcount=1)read_p(i);elseradd_v(i);/模拟读者对Wmute*的P操作:void read_p(int i)Wmute*-;if(Wmute*0) /表示如果Wmute*0,则进入等待队列w_wait-Wmute*-1=10;r_wait0=i;elseradd_v(i);/模拟读之前对Rmute*的V操作void radd_v(int i)Rmute*+;if(Rmute*=0) /表示如果Rmute*=0,则从等待队列中选择读者进入Rcount的临界区int k,j;j=r_wait0;for(k=0;kr_

13、num;k+) r_waitk=r_waitk+1;radd(j);read(i);/进展读操作void read(int i)-. z.ri=1;/模拟读之后对Rmute*的P操作,读操作完成的时候调用void rsub_p(int i) ri=0;Rmute*-;rsub(i);/对Rcount减1的控制void rsub(int i)Rcount-;if(Rcount=0)read_v(i);elsersub_v(i);/模拟读者对Wmute*的V操作void read_v(int i) Wmute*+;if(Wmute*=0) /表示如果Wmute*=0)&(w_wait0w_num)

14、j=w_wait0;for(k=0;kw_num;k+) w_waitk=w_waitk+1;write(j);elsej=r_wait0;for(k=0;kw_num;k+) w_waitk=w_waitk+1;for(k=0;kr_num;k+) r_waitk=r_waitk+1;-. z.radd_v(j);rsub_v(i);/模拟读之后对Rmute*的V操作void rsub_v(int i)Rmute*+;int main()coutttt=读者-写者问题演示=endl;coutendl;coutw_num;while(w_num10)coutw_num;/完成对写者个数的输入c

15、outr_num;while(r_num10)coutr_num;/完成对读者个数的输入 int *,k,j,a20;while(1)cout*endl;for(k=0;k20;k+) ak=0;coutWmute*=Wmute*tRcount=Rcountt Rmute*=Rmute*endl;coutendl;for(k=0;kw_num;k+)-. z.if(wk=1)cout=写者(k+1)正在写=endl;for(k=0;kr_num;k+)if(rk=1)cout=读者(k+1)正在读=endl;if(w_wait0=-1) cout等待队列中无对象endl;coutendl;el

16、se cout等待队列中有:;for(k=0;kw_num;k+)if(w_waitk=10)for(j=0;j5;j+)if(r_waitj!=-1)cout读者(r_waitj+1)=0)&(w_waitkw_num)cout写者(w_waitk+1)t;coutendl;for(k=0;kw_num;k+)*=0;for(j=0;jw_num;j+)if(k=w_waitj)-. z.ak=1;*=1;if(*=1) continue;cout(k+1)写者(k+1);if(wk=0) cout申请 ;else cout完成 ;for(k=0;kr_num;k+)*=0;for(j=0;

17、jr_num;j+)if(k=r_waitj)ak+w_num=1;*=1;if(*=1) continue;cout(k+1+w_num)读者(k+1);if(rk=0) cout申请 ;else cout完成 ;cout(w_num+r_num+1)完毕endl; cout*;while(*(w_num+r_num+1)|a*-1=1)if(a*-1=1)cout该对象已在等待队列中,请重新输入:;-. z.elsecout*;for(k=0;kw_num;k+)if(*=(k+1)if(wk=0)write_p(k);else write_v(k);break;for(k=0;kr_nu

18、m;k+)if(*=(k+1+w_num)if(rk=0) radd_p(k);else rsub_p(k);break;if(*=(w_num+r_num+1) return 0;5 5测试用例,运行结果与运行情况分析测试用例,运行结果与运行情况分析5.15.1测试用例测试用例本程序模拟读者和写者问题,每个读者和写者对读操作或写操作的申请和完由用户手动选择。测试用例如下:输入写者个数:3-. z.输入读者个数:53、写者1申请写操作选择选项14、写者3申请写操作选择选项35、读者2申请读操作选择选项56、写者1完成写操作选择选项17、读者5申请读操作选择选项88、写者3完成写操作选择选项39

19、、读者5完成读操作选择选项810、读者2完成读操作选择选项511、完毕选择选项95.25.2运行结果运行结果结果一:结果二:结果三:5.35.3运行结果分析运行结果分析1、输入写者个数:32、输入读者个数:53、刚开场时Wmute*=1 Rcount=0 Rmute*=1,写者1申请写操作,此时,信号量Wmute*减1,所以Wmute*=0,写者1可以直接开场写操作4、写者3申请写操作此时,信号量Wmute*减1,所以Wmute*=-1,写者1正在写,所以写者3进入等待队列5、读者2申请读操作此时,信号量Rmute*减1,所以Rmute*=0 ,Rcount加1,所以Rcount=1,又因为R

20、count=1,所以Wmute*减1,Wmute*=-2,写者1正在写,所以读者2进入等待队列6、写者1完成写操作此时,信号量Wmute*加1,所以Wmute*=-1,写者3开场写操作7、读者5申请读操作此时,信号量Rmute*减1,所以Rmute*=-1,读者2还在Rcount的临界区中,所以读者5等待8、写者3完成写操作-. z.此时,信号量Wmute*加1,所以Wmute*=0,读者2从等待队列中取出,并且Rmute*加1,则Rmute*=0,读者2开场读操作,读者5进入Rcount的临界区,Rcount加1,Rcount=2,Rmute*加1,Rmute*=1,此时读者5可直接开场读操

21、作,所以此时,读者2和读者5正在进展读操作9、读者5完成读操作此时Rcount减1,Rcount=1,还剩读者2在进展读操作10、读者2完成读操作此时Rcount减1,Rcount=0,Wmute*加1,所以Wmute*=111、完毕6 6总结与心得总结与心得本课程设计是学生学习完计算机操作系统课程后,进展的一次全面的综合训练,通过课程设计,我更好地掌握了操作系统的原理及实现方法,加深对操作系统根底理论和重要算法的理解,加强了动手能力。在设计过程中,出现了很多问题,比方对涉及到的知识没有深入的理解,对其实现方法感到很模糊,有时不知道该用什么方案来解决该问题,但通过自己查资料,进展深入的了解后,

22、渐渐对其所用到的知识和方法有了清晰的认识、理解,能根据问题描述逐步对问题进展分析、抽象,并将其进展转化,最后通过编程实现该问题所描述的功能。这次自己的收获还是不小,首先使我提高了分析问题,并根据需求转化成相应的程序构造的能力;其次也丰富了自己编写程序,调试程序的经历,这使得我编程时可能出现的错误的认识,并如何去防止产生了新的认识。总的来说,通过本次设计收获很大。首先更加熟练的掌握了通过P、V原语和信号量解决一些问题的思想。其次,编程能力得到提高。在开场编程的时候发现程序并不像想象中的那样容易实现,最后终于通过把写者和读者进程分别分割为假设干个函数,并通过其中的相互衔接实现了模拟。同时运行时对操作界面中的选项动态的给出很重要,例如,假设*个写者还没有申请写操作,则给出的该选项为写者i申请;假设*个写者在等待队列中,则不给出该写者的选项;假设*个写者正在进展写操作,则给出的该选项为写者i完成。读者和写者问题,一直认为这些东西很简单,但是具体编程实现其模拟并不容易。虽然这还不算真正的实践,但通过这次设计,向实践靠近了一步。更加深刻的理解了操作系统中这些理论知识的意义。路漫漫其修远兮,吾将上下而求索!

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号