实验四--同步机构Word文档格式.doc
- 文档编号:13199013
- 上传时间:2022-10-08
- 格式:DOC
- 页数:8
- 大小:82.50KB
实验四--同步机构Word文档格式.doc
《实验四--同步机构Word文档格式.doc》由会员分享,可在线阅读,更多相关《实验四--同步机构Word文档格式.doc(8页珍藏版)》请在冰豆网上搜索。
//0:
信号S1,1:
信号S2;
intinteruptpoint;
//设置断点
};
constintnum=5;
constintsales=10;
structPCB;
//进程控制块
voidce();
voidp(int&
s,intp,PCB*d);
//P操作
voidv(int&
//V操作
(2)流程图
程序总体结构框图:
初始化:
初始化信号量S1,S2(S1=10,S2=0),对生产者、消费者进程的PCB初始化。
初始化流程图:
运行部分框图:
(3)源代码(附注释)
//#include"
stdafx.h"
#include<
iostream>
cstdlib>
string>
usingnamespacestd;
/*int_tmain(intargc,_TCHAR*argv[])
return0;
}*/
intproduce(int&
C,intc)//生产产品c
C=c;
returnC;
}
ints1,s2,pa[num],sa[num],pc;
PCBproducer,customer,*currp;
voidinitial()//初始化程序
strcpy_s(producer.p_name,"
producer"
);
producer.m=1;
//初始化生产者为就绪状态
producer.interuptpoint=0;
strcpy_s(customer.p_name,"
customer"
customer.m=1;
//初始化消费者为就绪状态
customer.interuptpoint=0;
currp=&
producer;
s1=10;
s2=0;
for(inti=0;
i<
num-1;
i++)
{
pa[i]=i;
sa[i]=pa[i];
}
pc=0;
voidcpuwork()
currp->
interuptpoint=pc;
//令当前执行指令送到断点中
intn;
while(producer.m==1||customer.m==1)//判断当前执行是生产者,还是消费者
cout<
<
"
选择生产者进程或消费者进程(0表示生产者,1表示消费者):
;
cin>
>
n;
if(n==0)//0为表示生产者
{
if(producer.m==1)
currp=&
else//否则消费者为就绪状态,执行消费者进程
{
cout<
进程producer被挂起,无法执行,执行进程customer"
endl;
customer;
}
} else
if(n==1)//1为表示消费者
if(customer.m==1)
currp=&
else//否则生产者为就绪状态,执行消费者进程
{
cout<
进程customer被挂起,无法执行,执行进程producer"
}
currp->
m=0;
//令当前进程处于执行状态
pc=currp->
interuptpoint;
ce();
//执行
voidce()
inti,j,q,pt,xx,ss,nq,shangpin[sales],xiaofei[sales];
intC;
charw;
xx=0;
ss=0;
nq=0
i=pc
if(strcmp(currp->
p_name,"
)==0)//pa[i]存放生产者程序中的一条模拟指令执行的入口地址
j=pa[i];
q=0;
else//sa[i]存放消费者程序中的一条模拟指令执行的入口地址
j=sa[i];
q=1;
pc=i+1;
switch(j)//j表示当前程序中的一条模拟指令执行的入口地址
case0:
if(q==0)//输入一个字符放入中
cout<
请生产一件产品(即输入一个数字):
cin>
pt;
produce(C,pt);
//pp=pt;
currp->
m=1;
产品已经生产"
}
else//执行消费者的P操作
nq=2;
p(s2,nq,currp);
break;
case1:
if(q==0)//执行生产者的P操作
nq=1;
p(s1,nq,currp);
else//执行消费者的取商品操作,X:
B[out];
out:
=(out+1)mod10
取一个产品"
xiaofei[xx]=shangpin[ss];
xx=(xx+1)%sales;
case2:
if(q==0)//执行生产者的产品上架操作,B[IN]:
produce;
IN:
=(IN+1)mod10
有一个产品上架"
shangpin[ss]=produce(C,pt);
ss=(ss+1)%sales;
else//执行消费者的V操作
v(s1,nq,currp);
case3:
if(q==0)//执行生产者的V操作
v(s2,nq,currp);
else//执行消费者的consume操作,打印或显示X中的字符
消费了一个产品"
produce(C,pt)<
case4:
//返回到L0指令执行
default:
;
cout<
生产者运行是否结束(Y/y,N/n):
//判断生产者运行是否结束
cin>
w;
if(w=='
y'
||w=='
Y'
)
producer.m=3;
s,intp,PCB*d)//P操作
s=s-1;
测试信号量s"
p<
if(s<
0)
d->
m=2;
waitreason=p;
d->
p_name<
进入等待!
else
无需等待。
s,intp,PCB*d)//V操作
s=s+1;
=0)
if(producer.waitreason==p)
producer.m=1;
elseif(customer.waitreason==p)
customer.m=1;
if(strcmp(currp->
)==0)
释放进程customer"
else
释放进程producer"
无进程释放!
voidmain()
initial();
cpuwork();
五.实验小结
通过用PV操作解决生产者——消费者问题的设计,使我更加深刻的了解了PV操作的过程。
当进程处于等待态时,在进程控制块PCB中要说明进程等待的原因;
当进程处于等待态或就绪态时,PCB中保留了断点信息,一旦进程再度占有处理器,则就从断点位置继续运行;
当进程处于完结状态,表示进程执行结束。
在这次实验中,巩固了C语言编程知识,并且对用同步机构避免并发进程执行时可能出现的与时间有关的错误,及对PV操作的状况有了更形象的认识。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 同步 机构