1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,支持多个进程并发运行的简单进程管理模拟系统,本系统的同步机构采用信号量上的,P,、,V,操作的机制;控制机构包括:,(,1),阻塞和唤醒操作;,(,2),时间片中断处理程序模拟时间片中断;,(,3),进程调度程序负责为各进程分配处理机。,系统中涉及了,3,个并发进程。它们之间的关系是:,(,1)3,个进程需要互斥使用临界资源,S2,。,(,2),进程,1,和进程,2,又需互斥使用临界资源,S1,本系统在运行过程中随机打印出各进程的状态变换过程,系统的调度过程及公共变量的变化情况。,题目,系统为进程设置了,5
2、种运行状态:,e,执行态;,r,高就绪态;,t,低就绪态(执行进程因时间片到限而转入);,w,等待态;,c,完成态。各进程的初始状态均设置为,r.,系统分时执行各进程,并规定,3,个进程的执行概率均为,33,。通过产生随机数,x,来模拟时间片。当进程,process1,访问随机数,x,时,若,x=0.33,;,当进程,process2,访问,x,时,若,x=0.66;,当进程,process3,访问,x,时,若,xnum=,snum,;,申请消息块,写入缓冲,p-next=NULL;,下一指针置空,p-pro=sender;,置发送者,printf(“send,message to proc
3、ess%d”,receiver);,printf(“process,%d already run%d,times”,sender,snum,);,void,send(int,sender,int,receiver,int,snum,),发送,q=,pcbreceiver.mess,;,q,指向接收者消息等待队列首,if(q,=NULL),pcbreceiver.mess,=p;,q,空则,p,插入队首,else,while(q,-next!=NULL),q=q-next;,q,移到队尾,q-next=p;,将,p,链接到队尾,void,send(int,sender,int,receiver,
4、int,snum,),发送,message,p,q,;,工作指针,p=,pcbreceiver.mess,;,p,指向接收者消息等待队列首,while(p,!=NULL),显示发送者和接收者信息,printf(“receive,message from process%,d”,p,-pro);,printf(“process,%d is already run%d,times”,p,-pro,p-num);,q=p;,陆续将接收过的的消息块删除并释放,p=p-next;,free(q,);,pcbreceiver.mess,=NULL;,接收完后消息等待队列置空,void,receive(in
5、t,receiver),接收,int,j;,for(j,=1;j=3;j+),初始化各进程控制块,pcbj.id,=j;,pcbj.status,=r;,进程号,进程状态,pcbj.nextwr,=NIL;,pcbj.mess,:=NULL;,等待、消息指针,printf(“process,%d priority?”,j);,scanf(“%d”,&pcbj.priority,);,读入优先数,pcbj.inum,=0;,pcbj.addr,=0;,运行次数,地址,sem1.value=1;sem1.firstwr=NIL;,对信号量初始化,sem2.value=1;sem2.firstwr=
6、NIL;exe=NIL;,当前执行进程号置为空,void init(),初始化,func,random:real;,proc,eexit(n:integer,);,float random(),产生,01,之间的随机数,int,m;,seed,为,int,型,实际值在,-32768,到,32767,之间,if seed0 m=-seed;else m=seed;seed=(,25171,*seed+,13841,)%65536;return(m/32767.0);,void,eexit(int,n);,退出,pcbn.status,=c;,本进程置为完成态,printf(process,%d
7、is completed,n,n,);,exe=NIL;,当前执行进程号置空,int,find(),选进程,int,j,pd,w,;,pd=NIL;,w=MAXPRI;,for(j,=1;j=3;j+),先在高就绪态中找优先数最小的进程,if(,pcbj.status,=r),if(,pcbj.priority,w),w=,pcbj.priority,;,pd=j;,if(pd=NIL),for(j,=1;j=3;j+),再在低就绪态中找优先数最小的进程,if(,pcbj.status,=t),if(pcbj.priority,w),w=,pcbj.priority,;,pd=j;,retur
8、n pd;,返回进程号,int,scheduler,(),调度,int pd;,pd=find();,找优先进程,if(pd=NIL),else,if(pd!=NIL),若有就绪进程则,if(exe=NIL),若当前没有进程执行则,pcbpd.status=e;,新进程置执行态,exe=pd;,printf(“process%d is executingn”,exe);,else if(pcbpd.priority=0 return false,;,有资源不等待,else block(se);,阻塞到,se,等待队列,pcbexe.inum,=i;,pcbexe.addr,=ad;,保护现场,
9、exe=NIL;return true;,执行进程置空,等待标志置真,int,v(int,se,,,char ad),signal,操作,semse.value,=semse.value+1;,信号量加,1,if,semse.value,0 return false;,无等待不重新调度,else,wakeup(se,);,有等待唤醒,se,等待队列的进程,pcbexe.inum,=i;,pcbexe.addr,=ad;,保护现场,return true;,要重新调度,int,timeint(char,ad),模拟时间片中断,float x;,x,为,01,之间的随机数,x=random();,
10、if(x,0.33)&(exe=0),return false;,若在各自的时间片不产生中断,else,if(x,0.66)&(exe=1),return false;,else,if(x,1.00)&(exe=2),return false;,else,否则产生时间片中断,pcbexe.inum,=i;,保护现场,pcbexe.addr,=ad;,pcbexe.status,=t;,置为低就绪态,printf(time,slice interrupt.n);,printf(process,%d enter into ready,n,exe,);,exe=NIL;,执行进程置空,return
11、true;,中断标志置真,void process1(int s1,int s2),模拟并发进程,1,if,addr,=a then,goto,a1,;if,addr,=b then,goto,b1,;if,addr,=c then,goto,c1,;if,addr,=d then,goto,d1,;if,addr,=e then,goto,e1,;if,addr,=f then,goto,f1,;,while(i=5)eexit(1);,5,次循环后本进程结束,printf(“process1 calls p on sem1”);,if p(1,a),goto,stop1,;,对,信号量,1
12、进行,P,操作返回,a,地址,a1:,printf(“process1 is execution on its,cretical,section 1.”);,入临界区,if,timeint(b,),goto,stop1,;,若时间片到则重新调度,b1:,s1:=s1+1;printf(“s1=%d”,s1);,s1,是,临界资源不是信号量,printf(“process1 calls v on sem1 and quit,cretical,section 1”);,if v(1,c),goto,stop1,;,对信号量,1,进行,V,操作,出临界区,c1:,printf(“process1
13、calls p on sem2”);,if p(2,d),goto,stop1,;,对信号量,2,进行,P,操作返回,d,地址,d1:,printf(“process1 is execution on its,cretical,section 2.”);,if,timeint(e,),goto,stop1,;,e1:,s2=s2+1;printf(“s2=%d”,s2);,s2,是临界资源不是信号量,printf(“process1 calls v on sem1 and quit,cretical,section 2.”);,if v(2,f),goto,stop1,;,对信号量,2,进行,
14、V,操作,出临界区,f1,:printf(“process1,cyclen,count=%d”,i+1);i=i+1;send(1,2,i);send(1,3,i);,循环次数加,1,发消息,void process2(int s1,int s2),模拟并发进程,2,if(addr,=a),goto,a2;,if(addr,=b),goto,b2;,if(addr,=c),goto,c2;,if(addr,=d),goto,d2;,if(addr,=e),goto,e2;,if(addr,=f),goto,f2;,while(i,5)receive(2);,printf(process1 ca
15、lls P on semaphore1.n);,if(p(1,a),goto,stop1;,a2,:printf(process1 is executing on its,cretical,section1.n);,if(,timeint(b,),goto,stop1;,b2,:s2=s2+1;,printf(s2=%d,s2);,printf(process,1 calls V on semaphore1 and quit,cretical,section1.n);,if(v(1,c),goto,stop1;,c2:,printf(process,1 calls P on semaphore
16、0.n);,if(p(0,d),goto,stop1;,d2:,printf(process,1 is,excecuting,section0.n);,if(timeint(e,),goto,stop1;,e2:,s1=s1+1;,printf(s1=%d,s1);,printf(pcocess,1 calls V on semaphore0 and quit section0.n);,if(v(0,f),goto,stop1;,f2:,printf(process,1,cyclen,count=%dn,i+1);,i=i+1;,send(1,0,i);send(1,2,i);,printf(
17、n,);,stop1:,if(i,5),goto,end1;,eexit(1);,end1:;,void process3(int s1,int s2),模拟并发进程,3,if,addr,=a,goto,a3,;,if,addr,=b,goto,b3;,if,addr,=c,goto,c3,;,while(i=5)eexit(3);,void main(),主程序,int,k,s1,s2;,s1,s2,是临界资源公用计数器,printf(“C.O.S,.Example one”);,init();,s1=0;s2=0;printf(“s1=%d,s2=%d”,s1,s2);printf(“p1,p2,p3 are all in ready!”);,100:,k=scheduler();,调用调度程序返回选中进程号,if(k!=NIL),switch(k)case 1:process1(s1,s2);,goto,100,;case 2:process2(s1,s2);,goto,100,;case 3:process3(s1,s2);,goto,100,;,default:,printf(process,identifer,error.n);printf,(“s1,=%d,s2=%d”,s1,s2);,printf,(“COMPLETED!”);,






