进程同步模拟实验

  • 格式: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])