实验四、同步机构

上传人:小** 文档编号:62379843 上传时间:2018-12-20 格式:PDF 页数:12 大小:282.17KB
返回 下载 相关 举报
实验四、同步机构_第1页
第1页 / 共12页
实验四、同步机构_第2页
第2页 / 共12页
实验四、同步机构_第3页
第3页 / 共12页
实验四、同步机构_第4页
第4页 / 共12页
实验四、同步机构_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《实验四、同步机构》由会员分享,可在线阅读,更多相关《实验四、同步机构(12页珍藏版)》请在金锄头文库上搜索。

1、实验四、同步机构 一、实习内容 模拟实现用同步机构避免发生进程执行时可能出现的与时间有关的 错误。 二、实习目的 进程是程序在一个数据集合上运行的过程,进程是并发执行的,也 即系统中的多个进程轮流地占用处理器运行。 我们把若干个进程都能进行访问和修改的那些变量称为公共变量。 由于进程是并发地执行的,所以,如果对进程访问公共变量不加限制, 那么就会产生“与时间有关”的错误,即进程执行后所得到的结果与访问 公共变量的时间有关。为了防止这类错误,系统必须要用同步机构来控 制进程对公共变量的访问。一般说,同步机构是由若干条原语同步 原语所组成。本实习要求学生模拟PV操作同步机构的实现,模拟 进程的并发

2、执行,了解进程并发执行时同步机构的作用。 三、实习题目 模拟PV操作同步机构,且用PV操作解决生产者消费者问题。 提示: (1) PV操作同步机构,由P操作原语和V操作原语组成,它们的定义 如下: P操作原语P (s):将信号量s减去1,若结果小于0,则执行原语的进 程被置成等待信号量s的状态。 V操作原语V (s):将信号量s加1,若结果不大于0,则释放一个等待 信号量s的进程。 这两条原语是如下的两个过程: procedure p (var s: semaphore); begin s: = s-1; if s #include“math.h“ #include #include #def

3、ine num 10 typedefstruct PCB char state;/E-运行,R-就绪,W-等待,C-完成 int cause;/1-等待信号量S1,2-等待信号量s2 int pause;/保存断点信息 char* procedure; PCB; PCB pro;PCB *pronode= PCB con;PCB *connode= char i100; char x,c;/x接受输入字符,c接受输出字符 char Bnum+1;/存放缓冲区中的商品 intin,out; intPC,sum;/程序计数器 int a,s1,s2;/s2-缓冲区种商品的数量,s1-缓冲区中还可放

4、入的商品数量 inttag,retag;/tag=0-CPU未中断;tag=1-cpu中断 int stop;/stop=0-开中断;stop=1-关中断 int (*PA5)(int *s,PCB* P); /生产者指令数组 int (*SA5)(int *s,PCB* p); /消费者指令数组 int W(int* s,PCB* q) tag=0; q-state=w; printf(“当前%s进程已被更新为阻塞态n“,q-procedure); if(strcmp(q-procedure,“生产者“)=0) printf(“原因为等待信号量s2nn“); else printf(“原因为

5、等待信号量s1nn“); q-cause=2; stop=0; return 0; int R(int* s,PCB* q) printf(“进程%s已被更新为就绪态n“,q-procedure); if(strcmp(q-procedure,“生产者“)=0) printf(“原因为信号量s2已满足nn“);q-state=r; else printf(“原因为信号量s1已满足nn“);q-state=r; q-state=r; q-cause=0; return 0; int p(int* m,PCB *q) stop=1; *m=*m-1; if(*mpause=PC; return 0

6、; intprov(int *m,PCB *q) stop=1; *m=*m+1; if(*mpause=PC; return 0; intconv(int *m,PCB *q) stop=1; *m=*m+1; if(*mpause=PC; return 0; int Put(int *s,PCB* pro) in=(in+1)%10; Bin=c; pro-pause=PC; return 0; int Get(int *s,PCB* con) out=(out+1)%10; x=Bout; con-pause=PC; return 0; int consume(int *s,PCB* q

7、) printf(“消费者取出商品%cnn“,x); q-pause=PC; if(x=isum-1) return 1; return 0; int produce(int *s,PCB *q) a+; if(a=sum) retag=1;return 0; else c=ia; printf(“生产者放入商品%cnn“,c); q-pause=PC; return 0; intGoto(int *s,PCB *q) q-pause=PC; PC=0; return 0; intIniPro() PA0=produce; PA1=p; PA2=Put; PA3=prov; PA4=Goto;

8、 return 0; /消费者程序首地址数组初始化 intIniCon() SA0=p; SA1=Get; SA2=conv; SA3=consume; SA4=Goto; return 0; /生产者程序首地址数组初始化 intcodepro(int *s1,int *s2,PCB *pro,PCB* con) switch(PC) case 0:PAPC(break; case 1:PAPC(s1,pro);break; case 2:PAPC(break; case 3:PAPC(s2,con);break; case 4:PAPC(s1,pro);break; return 0; in

9、tcodecon(int *s1,int *s2,PCB *pro,PCB* con) switch(PC) case 0:SAPC(s2,con);break; case 1:SAPC(break; case 2:SAPC(s1,pro);break; case 3:SAPC(s2,con);break; case 4:SAPC(s2,con);break; return 0; int control(int *s1,int *s2,PCB* pro,PCB *con) int random=rand()%2; if(random=0 codepro(s1,s2,pro,con); if(p

10、ro-state!=w) PC=(pro-pause+1)%5; codepro(s1,s2,pro,con); else if(random=1 | retag=1) codecon(s1,s2,pro,con); if(con-state!=w) PC=(con-pause+1)%5; codecon(s1,s2,pro,con); return 0; intInitpcb(PCB *pro)/进程初始化 pro-pause=-1; pro-state=r; pro-cause=0; return 0; void init()/初始化 s2=0,s1=10,in=0,out=0; PC=0

11、,a=-1,tag=0,stop=0,retag=0; printf(“请输入产品名,用字符串表示:n“); gets(i); sum=strlen(i); int main() init(); pro.procedure=“生产者“; con.procedure=“消费者“; Initpcb( Initpcb( IniPro(); IniCon(); int a=control( while(Bout!=isum-1) control( control( printf(“程序结束!n“); return 0; 六、实验结果 用空操作代替PV操作后的结果如下: int NOP(int *s,P

12、CB* p)p-pause=PC;return(0);/生产者、消费者的空指 令(替换P操作) intNOPproV(int *s,PCB* p)pronode-pause=PC;return(0);/生产者空指 令(替换V操作) intNOPconV(int *s,PCB* p)connode-pause=PC;return(0);/消费者空指 令(替换V操作) intIniPro() PA0=produce; PA1=NOP; PA2=Put; PA3=NOPproV; PA4=Goto; return 0; /消费者程序首地址数组初始化 intIniCon() SA0=NOP; SA1=Get; SA2=NOPconV; SA3=consume; SA4=Goto; return 0; /生产者程序首地址数组初始化

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号