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

上传人:hh****2 文档编号:201170969 上传时间:2023-04-18 格式:DOCX 页数:17 大小:200.63KB
收藏 版权申诉 举报 下载
模拟PV操作同步机构且用PV操作解决生产者——消费者问题_第1页
第1页 / 共17页
模拟PV操作同步机构且用PV操作解决生产者——消费者问题_第2页
第2页 / 共17页
模拟PV操作同步机构且用PV操作解决生产者——消费者问题_第3页
第3页 / 共17页
资源描述:

《模拟PV操作同步机构且用PV操作解决生产者——消费者问题》由会员分享,可在线阅读,更多相关《模拟PV操作同步机构且用PV操作解决生产者——消费者问题(17页珍藏版)》请在装配图网上搜索。

1、细心整理试验四:同步机构试验报告学 院: 专业班级: 姓 名: 学 号:一、试验内容:模拟实现用同步机构幸免发生进程执行时可能出现的刚好间有关的错误。二、试验目的:进程是程序在一个数据集合上运行的过程,进程是并发执行的,也即系统中的多个进程轮番地占用处理器运行。我们把假设干个进程都能进展访问和修改的那些变量称为公共变量。由于进程是并发地执行的,所以,假如对进程访问公共变量不加限制,那么就会产生“刚好间有关”的错误,即进程执行后所得到的结果及访问公共变量的时间有关。为了防止这类错误,系统必须要用同步机构来限制进程对公共变量的访问。一般说,同步机构是由假设干条原语同步原语所组成。本试验要求学生模拟

2、PV操作同步机构的实现,模拟进程的并发执行,了解进程并发执行时同步机构的作用。三、试验题目:模拟PV操作同步机构,且用PV操作解决生产者消费者问题。四、此次用到的数据构造学问如下: typedef struct Pcb char name10; /进程名char state10; /运行状态char reason10; /假设堵塞,其缘由int breakp; /断点爱惜struct Pcb *next; /堵塞时的依次进程名状态等待缘由断点后继进程 Pcb,*link; 进程限制块构造 定义两个进程: link p1;/生产者进程,link c1;/消费者进程。pc程序计数器和link re

3、ady; 就绪队列,link b_s1; s1堵塞队列,link b_s2; s2堵塞队列。五、试验源代码:分为四个头文件。1、a.h头文件代码如下:#include #include #include /* malloc()等 */ #include /* INT_MAX等 */ #include /* EOF(=Z或F6),NULL */ #include /* atoi() */ #include /* eof() */ #include /* floor(),ceil(),abs() */ #include /* exit() */ #include using namespace s

4、td; #include #define BUF 10 /缓存的大小 #define MAX 20 /最大可以输入的字符2、b.h头文件代码如下:/数据构造的定义和全局变量typedef struct Pcb char name10; /进程名char state10; /运行状态char reason10; /假设堵塞,其缘由int breakp; /断点爱惜struct Pcb *next; /堵塞时的依次Pcb,*link;int s1,s2; /信号量link p1;/生产者进程link c1;/消费者进程char strMAX; /输入的字符串char bufferBUF; /缓冲池

5、int len; /输入长度int sp=0; /string的指针int in=0; /生产者指针int out=0; /消费者指针char temp; /供打印的临时产品char rec_pMAX;/生产记录int rp1=0;/生产记录指针char rec_cMAX;/消费记录int rp2=0;/消费记录指针link ready; /就绪队列link b_s1; /s1堵塞队列link b_s2; /s2堵塞队列int pc; /程序计数器int count; /字符计数器int con_cnt; /消费计数器3、c.h头文件代码如下:void init(); /初始化void p(i

6、nt s); /P操作void v(int s); /V操作void block(int s);/堵塞函数void wakeup(int s);/唤醒函数void control(); /处理机调度void processor();/处理机执行void print(); /打印函数void init() /初始化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-n

7、ext=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;/堵塞进程为NULLpc=0;con_cnt=0; /消费计数器void p(int s)if(s=1) /p(s1)s1-;if(s1breakp=pc

8、; /保存断点else /p(s2)s2-;if(s2breakp=pc; /保存断点void v(int s)if(s=1) /v(s1)s1+;if(s1breakp=pc; /保存断点else /v(s2)s2+;if(s2breakp=pc; /保存断点void block(int s)/堵塞函数的定义link p;int num1=0;int num2=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

9、_s1)b_s1=p1;elsep=p1;p1-next=NULL;printf(t* p1生产进程堵塞了!n);ready-breakp=pc; /保存断点ready=ready-next;/在就绪队列中去掉,指向下一个num1+;else/消费进程strcpy(c1-state,Block);strcpy(c1-reason,S2);p=b_s2;while(p)num2+;p=p-next;/p的值为NULL,表示队尾if(!b_s2)b_s2=c1;elsep=c1;ready-breakp=pc; /保存断点ready=ready-next;/在就绪队列中去掉,指向下一个c1-nex

10、t=NULL;printf(t* c1消费进程堵塞了!n);num2+;printf(t* 堵塞的生产进程个数为:%dn,num1);printf(t* 堵塞的消费进程个数为:%dn,num2);void wakeup(int s)/唤醒函数的定义link p;link q=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;p-next=NULL;printf(t*

11、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);void control() /处理器调度程序int rd;int num=0;link p=ready; if(ready=NULL) /假设无就绪进程,完毕return;while(p) /统计就绪进程个数num+;p

12、=p-next;/最终p变为NULLprintf(t* 就绪进程个数为:%dn,num);time_t t; 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;void processor() /模拟处理器指令执行if(strcmp(r

13、eady-name,Producer)=0) /当前进程为生产者switch(pc) case 0:/produceprintf(t* 生产者生产了字符%cn,strsp);rec_prp1=strsp;/添加到生产记录 sp=(sp+1)%len;pc+;ready-breakp=pc; /保存断点break;case 1: /p(s1)pc+;p(1);break;case 2: /putbufferin=rec_prp1; /放到缓冲区printf(t* %c字符成功入驻空缓存!n,bufferin);rp1+; in=(in+1)%BUF;pc+;ready-breakp=pc; /保

14、存断点break;case 3: /v(s2)pc+;printf(t* 释放一个s2信号n);v(2);break;case 4:/goto01 printf(t* 生产进程goto 0 操作n);pc=0;count-; /剩余字符个数减1printf(t* 剩余字符count=%d个n,count);ready-breakp=pc; /保存断点if(countstate,Stop);strcpy(p1-reason,Null);ready-breakp=-1;ready=ready-next;/在就绪队列中去掉 else /当前进程为消费者switch(pc)case 0: /p(s2)

15、pc+;p(2); break;case 1: /getprintf(t* 消费者取字符!n);temp=bufferout;out=(out+1)%BUF;pc+;ready-breakp=pc; /保存断点break;case 2: /v(s1)pc+;printf(t* 释放一个s1n);v(1);break;case 3: /consumeprintf(t* 消费了字符%cn,temp);rec_crp2=temp;/添加到消费记录rp2+;con_cnt+;if(con_cnt=len)strcpy(c1-state,Stop);/完成态c1-breakp=-1;return;pc+

16、;ready-breakp=pc; /保存断点break;case 4: /goto0printf(t* 消费进程goto 0 操作n);pc=0;ready-breakp=pc; /保存断点void print()int i,j;printf(生产者消费者模拟n);printf(* 模拟过程的字符串为:t);printf(%sn,&str);printf(* 已生产:);for(j=0;j=rp1;j+)printf(%c,rec_pj);printf(n* 空缓存:);for(j=rp2;j=rp1;j+)printf(%c,bufferj);printf(n* 已消费:);for(j=0

17、;jname,p1-state,p1-reason,p1-breakp);printf(%st%st%stt%dn,c1-name,c1-state,c1-reason,c1-breakp);printf(n);printf(1.接着 0.退出n);scanf(%d,&i);if(i=0)exit(0);4、main头文件代码如下:#include a.h#include b.h#include c.hvoid main()printf(*生产者消费者模拟n);printf(n);printf(*请输入字符串:n);scanf(%s,str); /string数组存放将要产生的字符len=strlen(str);count=len; /输入字符的个数init(); /初始化while(con_cntlen) /消费完全部的字符为完毕system(cls); /清屏操作printf(模拟指令流程n);control(); /处理器调度程序processor(); /模拟处理器指令执行print(); /输出显示各个信息printf(n程序完毕!n);六、运行结果截图:

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!