下载此文档

模拟PV操作同步机构且用PV操作解决生产者——消费者问题.doc


文档分类:行业资料 | 页数:约16页 举报非法文档有奖
1/16
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/16 下载此文档
文档列表 文档介绍
该【模拟PV操作同步机构且用PV操作解决生产者——消费者问题 】是由【泰山小桥流水】上传分享,文档一共【16】页,该文档可以免费在线阅读,需要了解更多关于【模拟PV操作同步机构且用PV操作解决生产者——消费者问题 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
实验四:同步机构实验报告
学院:
专业班级:
姓名:
学号:
一、实验内容:
模拟实现用同步机构防范发生进度执行时可能出现的与时间有关的错误。
二、实验目的:
进度是程序在一个数据会集上运转的过程,进度是并发执行的,也即系统中的多个进度轮流地占用办理器运转。
我们把若干个进度都能进行接见和更正的那些变量称为公共变量。因为进度是并发地执行的,因此,假如对进度接见公共变量不加限制,那么就会产生“与
时间有关”的错误,即进度执行后所获取的结果与接见公共变量的时间有关。为了防范这种错误,系统一定要用同步机构来控制进度对公共变量的接见。一般说,
同步机构是由若干条原语——同步原语——所构成。本实验要修业生模拟PV操作同步机构的实现,模拟进度的并发执行,认识进度并发执行时同步机构的作用。
三、实验题目:
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
四、此次用到的数据结构知识以下:
typedefstructPcb{
charname[10];
//进度名
charstate[10];
//运转状态
charreason[10];
//若堵塞,其原由
intbreakp;
//断点保护
structPcb*next;
//堵塞时的序次
}Pcb,*link;
进度名
状态
等候原由
断点
后继进度
进度控制块结构
定义两个进度:linkp1;//生产者进度,linkc1;//花费者进度。pc程序计数器和linkready;就绪队列,linkb_s1;s1堵塞队列,linkb_s2;s2堵塞队列。
五、实验源代码:
分为四个头文件。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
1、:#include<>#include<>#include<>/*malloc()#include<>/*INT_MAX#include<>/*EOF(=^Z#include<>/*atoi()*/

等*/
等*/
或F6),NULL*/
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
#include<>/*eof()*/
#include<>/*floor(),ceil(),abs()*/
#include<>/*exit()*/
#include<iostream>
usingnamespacestd;
#include<>
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
#defineBUF10//

缓存的大小
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
#defineMAX20//

最大可以输入的字符
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
2、:
数据结构的定义和全局变量
typedefstructPcb{
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
charname[10];

//

进度名
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
charstate[10];

//

运转状态
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
charreason[10];

//

若堵塞,其原由
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
intbreakp;

//

断点保护
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
structPcb*next;//
堵塞时的序次
}Pcb,*link;
ints1,s2;//
信号量
linkp1;//
生产者进度
linkc1;//
花费者进度
charstr[MAX];//
输入的字符串
charbuffer[BUF];//
缓冲池
intlen;//
输入长度
intsp=0;//string
的指针
intin=0;//
生产者指针
intout=0;//
花费者指针
chartemp;//
供打印的暂时产品
charrec_p[MAX];//
生产记录
intrp1=0;//
生产记录指针
charrec_c[MAX];//
花费记录
intrp2=0;//
花费记录指针
linkready;//
就绪队列
linkb_s1;//s1
堵塞队列
linkb_s2;//s2
堵塞队列
intpc;//
程序计数器
intcount;//
字符计数器
intcon_cnt;//
花费计数器
3、:
voidinit();
//
初始化
voidp(ints);
//P
操作
voidv(ints);
//V
操作
voidblock(ints);//
堵塞函数
voidwakeup(ints);//
唤醒函数
voidcontrol();
//
办理机调换
voidprocessor();//
办理机执行
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
voidprint();//打印函数
voidinit(){//初始化
s1=BUF;
s2=0;
p1=(link)malloc(sizeof(Pcb));//建立新的结点,并初始化为生产者
strcpy(p1->name,"Producer");
strcpy(p1->state,"Ready");
strcpy(p1->reason,"Null");
p1->breakp=0;
p1->next=NULL;
c1=(link)malloc(sizeof(Pcb));//建立新的结点,并初始化为花费者
strcpy(c1->name,"Consumer");
strcpy(c1->state,"Ready");
strcpy(c1->reason,"Null");
c1->breakp=0;
c1->next=NULL;
ready=p1;
ready->next=c1;//初始化为生产进度在前,花费进度在后c1->next=NULL;
b_s1=NULL;
b_s2=NULL;//堵塞进度为NULL
pc=0;
con_cnt=0;//花费计数器
}
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
voidp(ints){
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
if(s==1){//p(s1)
s1--;
if(s1<0)
block(1);//堵塞当前生产进度
else{
printf("\t*s1信号申请成功!\n");
ready->breakp=pc;//保存断点
}
}
else{//p(s2)
s2--;
if(s2<0)
block(2);//堵塞当前花费进度
else{
printf("\t*s2信号申请成功!\n");
ready->breakp=pc;//保存断点
}
}
}
voidv(ints){
if(s==1){//v(s1)
s1++;
if(s1<=0)
wakeup(1);//唤醒生产进度
ready->breakp=pc;//保存断点
}
else{//v(s2)
s2++;
if(s2<=0)
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
wakeup(2);//唤醒花费进度
ready->breakp=pc;//保存断点
}
}
voidblock(ints){//堵塞函数的定义
linkp;
intnum1=0;
intnum2=0;
if(s==1){//生产进度
strcpy(p1->state,"Block");//改变状态
strcpy(p1->reason,"S1");//说明原由
p=b_s1;
while(p){
num1++;
p=p->next;//p的值为NULL,表示队尾
}
if(!b_s1)
b_s1=p1;
else
p=p1;
p1->next=NULL;
printf("\t*p1生产进度堵塞了!\n");
ready->breakp=pc;//保存断点ready=ready->next;//在就绪队列中去掉,指向下一个num1++;
}
else{//花费进度
strcpy(c1->state,"Block");
strcpy(c1->reason,"S2");
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
p=b_s2;
while(p){
num2++;
p=p->next;//p的值为NULL,表示队尾
}
if(!b_s2)
b_s2=c1;
else
p=c1;
ready->breakp=pc;//保存断点
ready=ready->next;//在就绪队列中去掉,指向下一个
c1->next=NULL;
printf("\t*c1花费进度堵塞了!\n");
num2++;
}
printf("\t*堵塞的生产进度个数为:%d\n",num1);
printf("\t*堵塞的花费进度个数为:%d\n",num2);
}
voidwakeup(ints){//唤醒函数的定义
linkp;
linkq=ready;
if(s==1){//唤醒b_s1队首进度,生产进度队列
p=b_s1;
b_s1=b_s1->next;//堵塞指针指向下一个堵塞进度
strcpy(p->state,"Ready");
strcpy(p->reason,"Null");
while(q)//插入就绪队列
q=q->next;
q=p;
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
p->next=NULL;
printf("\t*p1生产进度唤醒了!\n");
}
else{//唤醒b_s2队首进度,花费进度队列
p=b_s2;
b_s2=b_s2->next;//堵塞指针指向下一个堵塞进度
strcpy(p->state,"Ready");
strcpy(p->reason,"Null");
while(q->next)//插入就绪队列
q=q->next;
q->next=p;
p->next=NULL;
printf("\t*c1花费进度唤醒了!\n");
}
}
voidcontrol()//办理器调换程序
{
intrd;
intnum=0;
linkp=ready;
if(ready==NULL)//若无就绪进度,结束
return;
while(p)//统计就绪进度个数
{
num++;
p=p->next;//最后p变成NULL
}
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
printf("\t*就绪进度个数为:%d\n",num);
time_tt;
srand((unsigned)time(&t));
rd=rand()%num;//随机函数产生随机数
if(rd==1){
p=ready;
ready=ready->next;
ready->next=p;
p->next=NULL;
strcpy(ready->state,"Run");
strcpy(ready->next->state,"Ready");
}
else
strcpy(ready->state,"Run");
pc=ready->breakp;
}
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
voidprocessor(){//模拟办理器指令执行
if(strcmp(ready->name,"Producer")==0)//
switch(pc)

当行进度为生产者
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
{
case0://produce
printf("\t*生产者生产了字符%c\n",str[sp]);
rec_p[rp1]=str[sp];//增加到生产记录
sp=(sp+1)%len;
pc++;
ready->breakp=pc;//保存断点
break;
case1://p(s1)
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
pc++;
p(1);
break;
case2://put
buffer[in]=rec_p[rp1];//放到缓冲区
printf("\t*%c字符成功入驻空缓存!\n",buffer[in]);
rp1++;
in=(in+1)%BUF;
pc++;
ready->breakp=pc;//保存断点
break;
case3://v(s2)
pc++;
printf("\t*开释一个s2信号\n");
v(2);
break;
case4://goto01
printf("\t*生产进度goto0操作\n");
pc=0;
count--;//节余字符个数减1
printf("\t*节余字符count=%d个\n",count);
ready->breakp=pc;//保存断点
if(count<=0){//生产结束
printf("\t*生产者结束生产!\n");
strcpy(p1->state,"Stop");
strcpy(p1->reason,"Null");
ready->breakp=-1;
ready=ready->next;//在就绪队列中去掉
}
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。
模拟PV操作同步机构,且用PV操作解决生产者——花费者问题。

模拟PV操作同步机构且用PV操作解决生产者——消费者问题 来自淘豆网www.taodocs.com转载请标明出处.

非法内容举报中心
文档信息