1、在系统初始化时应把semaphore定义为某个类型,为简单起见,在模拟实习 中可把上述的semaphore直接改成integer。(2) 生产者一一消费者问题。假定有一个生产者和一个消费者,生产者每次生产一件产品,并把生产的产 品存入共享缓冲器以供消费者取走使用。消费者每次从缓冲器内取出一件产品去 消费。禁止生产者将产品放入已满的缓冲器内,禁止消费者从空缓冲器内以产品。 假定缓冲器内可同时存放10件产品。那么,用PV操作来实现生产者和消费者 之间的同步,生产者和消费者两个进程的程序如下:B:arraP0.9ofproducts;s1,s2;semaphore;s1:=10,s2:=0;IN,o
2、ut:i nteger;IN:out:cobegi nprocedureproducer;c:products;begi nL1:Produce(c);P(s1);BIN:=C;=(IN+1)mod10;V(s2);gotoL1end;procedurec on sumer;G:L2:p(s2);=Bout;=(out+1)mod10;v(s1);con sume(G);gotoL2coe nd.其中的semaphore和products是预先定义的两个类型,在模拟实现中 semaphore用 integer 代替,products可用 integer或 char等代替。(3) 进程控制块PC
3、B。为了记录进程执行时的情况,以及进程让出处理器后的状态,断点等信息, 每个进程都有一个进程控制块 PCB。在模拟实习中,假设进程控制块的结构如图3-1。其中进程的状态有:运行态、就绪态、等待态和完成态。当进程处于等 待态时,在进程控制块 PCB中要说明进程等待原因(在模拟实习中进程等待原 因是为等待信号量s1或S2);当进程处于等待态或就绪态时,PCB中保留了断 点信息,一旦进程再度占有处理器则就从断点位置继续运行; 当进程处于完成状态,表示进程执行结束。程名 |状态 等待原因|断点 图3-1进程控制块结构(4) 处理器的模拟。计算机硬件提供了一组机器指令,处理器的主要职责是解释执行机器指令
4、。 为了模拟生产者和消费者进程的并发执行,我们必须模拟一组指令和处理职能。模拟的一组指令见图3-2,其中每条指令的功能由一个过程来实现。用变量 PC来模拟“指令计数器”,假设模拟的指令长度为1,每执行一条模拟指令后, PC加1,提出下一条指令地址。使用模拟的指令,可把生产者和消费者进程的 程序表示为图3-3的形式。定义两个一维数组PA0.4和SA0.4,每一个PAi存放生产者程序中的一 条模拟指令执行的入口地址;每个 SAi存放消费者程序中的一条模拟指令执行的入口地址。于是模拟处理器执行一条指令的过程为: 取出PC之值,按PAPC或SAPC得模拟指令执行的入口地址,将PC之值加1,转向由入口地
5、址确定的 相应的过程执行。功能模拟的指令p(s)执行P操作原语v(s)执行V操作原语put=product;=(IN+1)mod10GET=(out+1)mod10produce输入一个字符放入C中con sume打印或显示G中的字符GOTOLPC:=LNOP空操作图3-2模拟的处理器指令序号生产者程序消费者程序p(S2)1P P(S1)2PUTV(S1)3V(S2)4gotoOgoto0图3-3生产者和消费者程丿(5)程序设计本实习中的程序由三部分组成:初始化程序、处理器调度程序、模拟处理器 指令执行程序。各部分程序的功能及相互间的关系由图 3-4至图3-7指出。箝现行进程为生产taa. p
6、c f=t图3-4初始化流程保护理输FC-*号 前迸程P亡R的斷点:械机选擇-就缔竝 程曲为理行避程料观行进麗找告改为运狞姦现疗*秤忙E的 MAJKp c帳ft!处思阵柑令 枫行锂序图3-5模拟处理器调度初始化程序:模拟实习的程序从初始化程序入口启动,初始化工作包括对 信号量si、s2赋初值,对生产者、消费者进程的 PCB初始化。初始化后转向处 理调度程序,其流程如图3-4。处理器调度程序:在计算机系统中,进程并发执行时,任一进程占用处理器执行完一条指令后就有可能被打断而让出处理器由其它进程运行。 故在模拟系统中也类似处理,每当执行一条模拟的指令后,保护当前进程的现场,让它成为非运行态,由处理
7、器调度程序按随机数再选择一个就绪进程占用处理器运行。 处理器调度程序流程见图3-5。建祁为生产*pF.il . 1. ii覽现轩进程为就箱态返 U1T I Z图3-6模拟处理器指令执行模拟P(s)(b)模拟V(s)图3-7模拟PV操作的执行且PC加1指向下一条指令。模拟处理器指令执行程序的流程图见图 3-6和图3-7另外,为了使得模拟程序有一个结束条件,在图 3-6中附加了 “生产者运行 结束”的条件判断,模拟时可以采用人工选择的方法实现。图 3-7给出了 P(s)和V (s)模拟指令执行过程的流程。其它模拟指令的执行过程已在图 3-2中指附录:代码#in cludestdlib.hc oni
8、 o.hwi ndows.h#defi neNULLOstructspcbchar name;charstate;charwhP;in tdd;tPpedefstructspcbpcb;pcbproducter,c on sumer,Gprocess,Gprocess1;in ts1,s2,i,j,i n,o ut,pc,m;chararraP10;charc,G;in tpa6,sa6;intp(ints)/Gp 操作原语 G/s=s-1;if(sstate=B;/GB 表示阻塞 GI process_whP=s:elseW;/GW 表示就绪 G/return(s);intv(ints)/G
9、v 操作原语 G/s=s+1;=0) process1-state=W; return(s);charRa nChar()chararr10=a,bcdef,ghij returnarrabs(ra nd()%10);voidput()/ prin tf(npleaseproducta nPchar!);/ scan f(n%c, &c);Sleep(1000);arraPi n=Ra nChar();in=(i n+1)%10;prin tf(productacharis%c!n,arraPi n-1); in tk=0;for(m=0;mn ame);state);whP);|%dtdd)
10、;voidinit()/G 初始化程序 G/s1=10;/Gs1表示空缓冲区的数量 G/s2=0;/Gs2表示满缓冲区的数量 G/ producter.name=p/G对生产者进程初始化 G/producter.state=W;producter.whP=producter.dd=0;consumer.name=/G对消费者进程初始化 G/con sumer.state=W;con sumer.whP=con sumer.dd=0;for(in tk=O;k1O;k+)arraPk= voidbornpa()/G将生产者程序装入 pa中G/for(i=0;idd;i=pc;/G此时把PC的值付
11、给IG/if(process-n ame=)&(process_state=W)j=pai;pc=i+1;switch(j)case0:s1=p(s1);dd=pc;break; case1:put(); case2:s2=v(s2);case3:gotol();elseif(process- name=(process-state=W)/G 执行消费者进程且该进程处于就绪状态G/j=sai;caseO:s2=p(s2);/G 申请资源,若没有申请到则跳转 G/ case1:get();case2:s1=v(s1); case3:/Ge ndelseG/Gen dwhileG/ prin tf(nTheprogramisover!voidmai n()ini t();born pa();born sa();diaodu();
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1