OS实验指导一——进程同步模拟

  • 格式:doc
  • 大小:77.00 KB
  • 文档页数:10
{
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];
{
w[i]=1;
}
模拟写者对Wmutex的V操作,写操作完成的时候调用:
void write_v(int i)
{
w[i]=0;
Wmutex++;
if(Wmutex<=0)表示如果Wmutex<=0,则从等待队列中选择写者或读者进行操作
{
int k,j;
if((w_wait[0]>=0)&&(w_wait[0]<w_num))
模拟写者对Wmutex的P操作,同时为写者进程也作写的入口:
void write_p(int i)
{
Wmutex--;
if(Wmutex<0)表示如果Wmutex<0,则该写者进入等待队列
{
w_wait[-Wmutex-1]=i;
}
else
write(i);
}
进行写操作:
void write(int i)
void read(int i);//读
void rsub_p(int i);//模拟读之后对Rmutex的P操作,读操作完成的时候调用
void rsub(int i);//Rcount减1
void read_v(int i);//模拟读者对Wmutex的V操作
void rsub_v(int i);//模拟读之后对Rmutex的V操作
{
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];
Rcount++;
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)Rmutex:表示对Rcount的互斥操作,初值:Rmutex=1。
main()
{int Wmutex=1;
int Rmutex=1;
int Rcount=0;
cobegin
read1();

readi();
write1();

writej();
coend}
读者进程:
Readn()
{ P(Rmutex);
void radd(int i)
{
Rcount++;
if(Rcount==1)
read_p(i);
else
radd_v(i);
}
模拟读者对Wmutex的P操作:
void read_p(int i)
{
Wmutex--;
if(Wmutex<0)表示如果Wmutex<0,则进入等待队列
{
w_wait[-Wmutex-1]=10;
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);
}
if((w_wait[k]>=0)&&(w_wait[k]<w_num))
3.算法流程图
int r_num;//读者个数
int w_num;//写者个数
int Wmutex=1;//表示允许写或允许读
int Rcount=0;//表示正在读的进程数
int Rmutex=1;//表示对Rcount的互斥操作
int r[10]={0,0,0,0,0,0,0,0,0,0};//表示读者的状态,1表示正在读
{
if(r[k]==0) radd_p(k);
else rsub_p(k);
break;
}
}
if(x==(w_num+r_num+1)) return 0;
void radd_p(int i);//模拟读之前对Rmutex的P操作,同时也作为读者进程的入口
void radd(int i);//Rcount加1
void read_p(int i);//模拟读者对Wmutex的P操作
void radd_v(int i);//模拟读之前对Rmutex的V操作
《操作系统》实验指导一
实验项目
(一)进程同步模拟实验
实验类型
验证
实验学时
2
一、实验目的
通过实验模拟读者和写者之间的关系,了解并掌握他们之间的关系及其原理。由此增加对进程同步的问题的了解。具体如下:
1)掌握基本的同步互斥算法,理解读者和写者模型;
2)了解windows中多线程(多进程)的并发执行机制,线程(进程)间的同步和互斥;
3)学习使用windows中基本的同步对象,掌握相应的API。
二、设备与环境
1.硬件设备:PC机一台
2.软件环境:安装Windows操作系统或者Linux操作系统,并安装相关的程序开发环境,如C \C++\Java等编程语言环境。
三、实验要求
用高级语言编写和调试一个采用“读写平等”策略的“读者-写者”问题的模拟程序。利用模拟用信号量机制实现读者和写者问题:通过用户控制读进程和写进程,反应读者和写者问题中所涉及的进程的同步与互斥。
1.问题描述:
模拟用信号量机制实现读者和写者问题,即有两组并发进程:读者和写者,共享一组数据区,进行读写操作,要求任一时刻“写者”最多只允许一个,而“读者”则允许多个。
2.规则说明:
允许多个读者同时执行读操作;
不允许读者、写者同时操作;
不允许多个写者同时操作。
四、实验设计参考
1.分析读者和写者的相互关系:
r_wait[0]=i;
}
else
radd_v(i);
}
模拟读之前对Rmutex的V操作:
void radd_v(int i)
{
Rmutex++;
if(Rmutex<=0)表示如果Rmutex<=0,则从等待队列中选择读者进入Rcount的临界区
{
int k,j;
j=r_wait[0];
for(k=0;k<r_num;k++) r_wait[k]=r_wait[k+1];
radd(j);
}
read(i);
}
进行读操作:
void read(int i)
{
r[i]=1;
}
模拟读之后对Rmutex的P操作,读操作完成的时候调用:
void rsub_p(int i)
{
r[i]=0;
Rmutex--;
rsub(i);
}
对Rcount减1的控制:
void rsub(int i)
radd_v(j);
}
}
rsub_v(i);
}
模拟读之后对Rmutex的V操作:
void rsub_v(int i)
{
Rmutex++;
}
int main()
{
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;
}//完成对读者个数的输入
int x,k,j,a[20];