进程同步模拟实验
- 格式:docx
- 大小:157.40 KB
- 文档页数:7
第 1 页 进程同步模拟实验
姓名 学号 实验日期 成绩 院别 班级 实验场地
实验课程名称 计算机操作系统 实验项目名称 进程同步模拟实验
对于每一个实验项目,实验报告(含预习)一般应包含以下内容:第一部分——预习后的书面汇报。其主要内容应包含:*1、实验目的;*2、实验内容。第二部分——实验结果的书面汇报。其主要内容应包含: *3、实验源代码;*4、实验结果及分析(含实验测试输入数据,试验运行结果截图,用简洁的语言总结实验,汇报是否达到实验目的);*5、实验体会、问题讨论(谈体会或感想、提出建议或意见、讨论与实验有关的且自己感兴趣的问题、回答课后思考题)。
一、实验目的
通过实验模拟读者和写者之间的关系,了解并掌握他们之间的关系及其原理。由此增加对进程同步的问题的了解。具体如下:
1) 掌握基本的同步互斥算法,理解读者和写者模型;
2) 了解windows中多线程(多进程)的并发执行机制,线程(进程)间的同步和互斥;
3) 学习使用windows中基本的同步对象,掌握相应的API。
二、实验内容
用高级语言编写和调试一个采用“读写平等”策略的“读者-写者”问题的模拟程序。利用模拟信号量机制实现读者和写者问题;通过用户控制读进程和写进程,反应读者和写者问题中涉及的进程的同步与互斥。
1. 问题描述: 模拟用信号量机制实现读者和写者问题,即有两组并发进程:读者和写者,共享一组数据区,进行读写操作,要求任一时刻“写者”最多只允许一个,而“读者”则允许多个。
2. 规则说明:
允许多个读者同时执行读操作;
不允许读者写者同时操作;
不允许多个写者同时操作。
三、实验源程序(或实验步骤) 第 2 页
#include
int L;
int r_num;
int w_num;
int Wmutex=1;
int Rcount=0;
int Rmutex=1;
int r[10]={0,0,0,0,0,0,0,0,0,0};
int w[10]={0,0,0,0,0,0,0,0,0,0};
int w_wait[11]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
int r_wait[11]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
void write_p(int i);
void write_v(int i);
void radd_p(int i);
void radd(int i);
void read_p(int i);
void radd_v(int i);
void read(int i);
void rsub_p(int i);
void rsub(int i);
void read_v(int i);
void rsub_v(int i);
void write(int i);
void write_p(int i)//模拟写者对Wmutex的P操作,同时也作为写者进程的入口
{
Wmutex--;
if (Wmutex<0)
{
w_wait[-Wmutex-1]=i;
}
else
write(i);
}
void write(int i)
{
w[i]=4;
}
void write_v(int i)//模拟写者对Wmutex的V操作,同时也作为读者进程的入口
{
w[i]=0;
Wmutex++;
if(Wmutex<=0)
{
int x,y;
if((w_wait[0]>=0)&&(w_wait[0]
{
y=w_wait[0];
for(x=0;x
w_wait[x]=w_wait[x+1];
write(y);
}
else
{ 第 3 页 y=r_wait[0];
for(x=0;x
w_wait[x]=w_wait[x+1];
for(x=0;x
r_wait[x]=r_wait[x+1];
radd_v(y);
}
}
}
void radd_p(int i)//模拟读之前对Rmutex的操作,同时也作为读者进程的入口
{
Rmutex--;
if(Rmutex<0)
{
r_wait[-Rmutex]=i;
}
else
radd(i);
}
void radd(int i)//Rcount加一
{
Rcount++;
if(Rcount==1)
read_p(i);
else
radd_v(i);
}
void read_p(int i)//模拟读者对Rmutex的P操作
{
Wmutex--;
if(Wmutex<0)
{
w_wait[-Wmutex-1]=10;
r_wait[0]=i;
}
else
radd_v(i);
}
void radd_v(int i)//模拟读者对Rmutex的V操作
{
Rmutex++;
if(Rmutex<=0)
{
int x,y;
y=r_wait[0];
for(x=0;x
r_wait[x]=r_wait[x+1];
radd(y);
}
read(i);
}
void read(int i)//读操作
{ 第 4 页 r[i]=1;
}
void rsub_p(int i)//模拟读之后对Rmutex的P操作, 读操作完成时调用
{
r[i]=0;
Rmutex--;
rsub(i);
}
void rsub(int i)//Rcount减一
{
Rcount--;
if(Rcount==0)
read_v(i);
else
rsub_v(i);
}
void read_v(int i)//模拟读者对Rmutex的V操作
{
Wmutex++;
if(Wmutex<=0)
{
int x,y;
if((w_wait[0]>=0)&&(w_wait[0]
{
y=w_wait[0];
for(x=0;x
w_wait[x]=w_wait[x+1];
write(y);
}
else
{
y=r_wait[0];
for(x=0;x
w_wait[x]=w_wait[x+1];
for(x=0;x
r_wait[x]=r_wait[x+1];
radd_v(y);
}
}
rsub_v(i);
}
void rsub_v(int i)//模拟读之后对Rmutex的V操作
{
Rmutex++;
}
int main()
{
cout<<"请输入写者个数(1-10):"; 第 5 页 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 i,x,y,a[20];
while(1)
{
cout<<"----------------------";
for(x=0;x<20;x++)
a[x]=0;
cout<<"Wmutex="<
for(x=0;x
{
if(w[x]==1)
cout<<"----写者" <<(x+1)<<"号正在写----"<
}
for(x=0;x
{
if(r[x]==1)
cout<<"----读者" <<(x+1)<<"号正在写----"<
}
if(w_wait[0]==-1)
cout<<"--等待队列空闲--"<
else
{
cout<<"等待队列中有:";
for (x=0;x
{
if(w_wait[x]==10)
for(y=0;y<5;y++)
{
if(r_wait[y]!=1)
cout<<"----"<<"读者"<<(r_wait[y]+1);
}
if((w_wait[x]>=0)&&(w_wait[x]
cout<<"----"<<"写者"<<(w_wait[x]+1);
}
cout<
}
for(x=0;x
{
int L=0;
for(y=0;y
{
if(x==w_wait[y])