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-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1