ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:20.85KB ,
资源ID:7439403      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-7439403.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(模拟PV操作同步机构且用PV操作解决生产者消费者问题.docx)为本站会员(b****6)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

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

1、模拟PV操作同步机构且用PV操作解决生产者消费者问题模拟V操作同步机构且用V操作解决生产者消费者问题。 作者: 日期:实验四:同步机构实验报告学 院: 专业班级: 姓 名:学 号:一、实验内容:模拟实现用同步机构避免发生进程执行时可能出现的与时间有关的错误。二、实验目的:进程是程序在一个数据集合上运行的过程,进程是并发执行的,也即系统中的多个进程轮流地占用处理器运行。我们把若干个进程都能进行访问和修改的那些变量称为公共变量。由于进程是并发地执行的,所以,如果对进程访问公共变量不加限制,那么就会产生“与时间有关”的错误,即进程执行后所得到的结果与访问公共变量的时间有关。为了防止这类错误,系统必须

2、要用同步机构来控制进程对公共变量的访问。一般说,同步机构是由若干条原语同步原语所组成。本实验要求学生模拟PV操作同步机构的实现,模拟进程的并发执行,了解进程并发执行时同步机构的作用。三、实验题目:模拟V操作同步机构,且用PV操作解决生产者消费者问题。四、此次用到的数据结构知识如下: tpdf strctPc ch name0; /进程名ar stt10; 运行状态ca reaso10; /若阻塞,其原因 int rek; /断点保护sutPc *ex; /阻塞时的顺序进程名状态等待原因断点后继进程 Pb,lk; 进程控制块结构 定义两个进程: li p1;/生产者进程,link c1;/消费者

3、进程。pc程序计数器和lnk ready; 就绪队列,ink b_s1; s阻塞队列,link _2; 2阻塞队列。五、实验源代码:分为四个头文件。1、a.头文件代码如下:#instrig. #inclde ncle /* maloc()等 */ #cde * INTMAX等 */ incudestdio /*EO(=或F6),NUL */#icuestdlih /* atoi() */ includeio.h o() */#ludemath /*floor(),ei(),bs() */ #include / xit() #inlude usng namspace td; #iclde nam

4、e,rducer);stpy(p1-e,Re); stcpy(p1-eaon,ul); p1brek0; p1-nex=ULL;c1=(link)mallo(sof(c));/建立新的结点,并初始化为消费者stcpy(c1-ae,onsumr);spy(1ate,Rdy); strpy(-reason,Null); c1-brep; c1-nxt=NL; eady=p1;ready-nex=;/初始化为生产进程在前,消费进程在后c1-next=NULL; b_s1=NU;_s=NL;/阻塞进程为NULLpc=;co_nt=0; /消费计数器voi p(in s) i(s=1)/p(s) s-;

5、i(s10) lk(1);/阻塞当前生产进程 sepr(t* s信号申请成功!); eaybrep=p;/保存断点 else /p(s2) s-;if(s) lo(2);/阻塞当前消费进程le pitf(t* s2信号申请成功!); ready-brakppc; /保存断点 d v(int) if(s=1) /(s)s1+;i(sbeak=pc;/保存断点els /(s2) s+;if(s2breakppc; /保存断点voi bock(int s)阻塞函数的定义in p;t num1=0; int num=0;(s=1)/生产进程srcp(p1-state,Bloc);/改变状态 strcp

6、y(p1-reaon,S1);/说明原因 p=bs; while(p) num1+; ppnex;/p的值为LL,表示队尾 if(!b_1) _1p1; els p; 1next=NL; pritf(t p1生产进程阻塞了!n);readyrekp=pc; /保存断点ra=redy-ext;/在就绪队列中去掉,指向下一个 nm1+;ele/消费进程 scy(c1-stte,ck); strcp(c-rasn,S2);p=b_s2; hle() um2+; p-nxt;/p的值为NLL,表示队尾 if(!b_2) b_s=1; else =1; redy-reakp=pc; /保存断点read=

7、ready-nex;/在就绪队列中去掉,指向下一个c1-nxt=NLL;prnt(t c1消费进程阻塞了!);n+; pintf(t* 阻塞的生产进程个数为:%dn,num1); pritf(t*阻塞的消费进程个数为:%dn,um2);vid wakep(int s)/唤醒函数的定义 link p; link qedy; if(s=1)/唤醒b_s1队首进程,生产进程队列 pb_s1;_s1=b_s1-next;/阻塞指针指向下一个阻塞进程 sp(-at,ady); stcpy(p-reas,Nul); while(q)/插入就绪队列 q=q-nx; q=; p-nxt=NUL;pintf(t

8、 p生产进程唤醒了!n);ele/唤醒_s2队首进程,消费进程队列 p=_s2; b2=b_s2next;/阻塞指针指向下一个阻塞进程 spy(-ste,Rea);strcp(p-reason,Nul);hl(q-next)/插入就绪队列 q=q-next; q-nex=p; p-netNULL; prnt(t* c1消费进程唤醒了!); vidconrol()/处理器调度程序it r;itum=0; link peady; if(eay=NUL)/若无就绪进程,结束 rurn; whle(p) /统计就绪进程个数 um+; =p-xt;/最终p变为NUL print(t 就绪进程个数为:%,

9、um); im_t; srand((nsigned) time(&);rdrand()%num;/随机函数产生随机数 if(rd=)p=ready; radyreaynext; edy-nex=p;-next=NULL;sy(reay-state,Ru); rcy(eay-nxt-state,ead); else trpy(rdy-sate,Run);preadbeakp;voidpressor()/模拟处理器指令执行i(strcmp(rady-ae,Producer)=0) /当前进程为生产者 swith(c) cae0:/rodu prntf(t* 生产者生产了字符%cn,strsp);

10、ec_r1=strsp;/添加到生产记录 s=(+)%ln; c+; reay-brea=pc; /保存断点 rak; se 1: /p(s1) c+; p(1);rk; as : /p buferin=rec_rp; /放到缓冲区 prntf(t* c字符成功入驻空缓存!n,ffri); rp1+; in=(in+1)%UF; c+; eady-breapc; /保存断点 break; cse 3: v()p+;rinf(* 释放一个s2信号n); (2);break; case 4:/goto prit(t*生产进程oto 0 操作n); pc=0; cut; /剩余字符个数减1prif(

11、剩余字符ount=%d个n,coun); ready-bakpc; /保存断点 if(countsate,Sop); rcp(p1-rason,Null); ready-reakp=-1;rady=eady-xt;/在就绪队列中去掉 else /当前进程为消费者witc(pc) ce 0: /p(2) pc+; p(2); brea; ase: /et prntf(消费者取字符!); tembuffeout; ou=(out+1)UF; p+; read-beakp=pc; /保存断点 beak; ase 2: v(s1) pc+;rintf( 释放一个s); v(1); rak; ae :

12、/conseprnf(*消费了字符cn,ep); rc_crptemp;/添加到消费记录 rp2; conct+;f(conntlen) strcpy(-stte,Stop);/完成态 c1-ak=-1; return; c+; reay-beakp=c; /保存断点 a; case 4: /goo0 prnf(t* 消费进程oo0 操作n); pc=0; redybrep=p; /保存断点 vod pri() int,; rintf(生产者消费者模拟n); pintf(* 模拟过程的字符串为:);pnf(%sn,str);print(* 已生产:); for(0;=rp1;j+) pintf

13、(%,rc_pj); prinf(n*空缓存:);for(j=rp2;jrp1;j+) printf(%c,bferj);ritf(* 已消费:); fo(j=0;jsate,p-reaon,1-eak); pf(t%t%sttdn,c1-nm,c1-state,1-reasn,c1-break); printf(n); prnf(1.继续 .退出n); san(%d,&i); f(i=) exi(0); 4、main头文件代码如下:#incld a#ncludeb.hinue.oidai() prinf(*生产者消费者模拟n);printf();prntf(请输入字符串:n); scanf(%s,str); /str数组存放将要产生的字符en=strlen(st);cot=n; /输入字符的个数 it(); /初始化 while(con_ctlen) /消费完所有的字符为结束 syse(cls); /清屏操作 pintf(模拟指令流程);control(); /处理器调度程序 pocessor(); /模拟处理器指令执行prnt(); /输出显示各个信息 rtf(n程序结束!n);六、运行结果截图:

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2