资源描述:
《操作系统实验指导进程同步模拟.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、《操作系统》实验指导一开课实验室:实验项目(一)进程同步模拟实验实验类型验证实验学时4一、实验目的通过实验模拟读者和写者之间的关系,了解并掌握他们之间的关系及其原理。由此增加对进程同步的问题的了解。具体如下:1)掌握基本的同步互斥算法,理解读者和写者模型;2)了解windows中多线程(多进程)的并发执行机制,线程(进程)间的同步和互斥;3)学习使用windows中基本的同步对象,掌握相应的API。二、设备与环境1.硬件设备:PC机一台2.软件环境:安装Windows操作系统或者Linux操作系统,并安装相关的程序开发环境,如CC++Java等编程语言环境。三、实验
2、要求用高级语言编写和调试一个采用“读写平等”策略的“读者-写者”问题的模拟程序。利用模拟用信号量机制实现读者和写者问题:通过用户控制读进程和写进程,反应读者和写者问题中所涉及的进程的同步与互斥。1.问题描述:模拟用信号量机制实现读者和写者问题,即有两组并发进程:读者和写者,共享一组数据区,进行读写操作,要求任一时刻“写者”最多只允许一个,而“读者”则允许多个。2.规则说明:允许多个读者同时执行读操作;不允许读者、写者同时操作;不允许多个写者同时操作。四、实验设计参考1.分析读者和写者的相互关系:1)“读-写”互斥,即不能同时有一个读者在读,同时去有一个写者在写;2)“写
3、-写”互斥,即不能有两个写者同时进行写操作;3)“读-读”允许,即可以有两个以上的读者同时进行读操作。2.采用的信号量机制1)Wmutex表示读写的互斥信号量,初值:Wmutex=1;2)公共变量Rcount表示“正在读”的进程数,初值:Rcount=0;3)Rmutex:表示对Rcount的互斥操作,初值:Rmutex=1。main(){intWmutex=1;intRmutex=1;intRcount=0;cobeginread1();…readi();write1();…writej();coend}读者进程:Readn(){P(Rmutex);Rcount++;
4、if(Rcount==1)P(Wmutex);V(Rmutex);读P(Rmutex);Rcount--;if(Rcount==0)V(Wmutex);V(Rmutex);while(false);写者进程:writem(){P(Wmutex);写V(Wmutex);}设计中首先用户输入读者个数r_num和写者个数w_num,来模拟用信号量机制实现r_num个读者和w_num个写者同时处理一个数据区的问题。所有的读者或写者对操作的申请和完成都是由用户控制,更容易反映读者和写者问题的规律。3.算法流程图开始输入读者和写者个数用户进行选择操作操作运行进程读者进程同时进行读操
5、作,写者依次进入等待第一个写者进行写操作,后面进程依次进入等待状态多进程?NNo.1写者?YY用户进行选择操作操作结束N4.数据结构说明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,-
6、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为空5.模块说明四组P、V函数:1)写者进程由3个函数组成voidwrite_p(inti);//模拟写者对Wmutex的P操作,同时也作为写者进程的入口voidwrite(inti);//开始写操作voidwrite_v(inti);//模拟写者对Wmutex的V操作,写操作完成的时候调用2)读者进程由
7、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操作v