#includestdio.h#includestdlib.h#includeconio.h#includemath.h#defineN20#defineMAX100typedefstructPCB//pcb进程控制块定义{intnum[N];//进程序号charname[10];//进程名charstate;//进程状态inttijiaotime;//进程到达时间intruntime;//进程开始时间intfinishtime;//进程结束时间intneedtime;//服务时间intpro;//进程优先级structPCB*next;//链接指针指向下个作业的}pcb;structPCB*head_input;structPCB*head_run;structPCB*head_run_pre;unsignedlongcurrent;//记录系统当前时间的变量inttime=10000,n;//计时器pcb*head=NULL,*p,*q;voidgetInfo()//创建进程{intnum;printf(\n请输入要建立的进程个数:);scanf(%d,&n);for(num=0;numn;num++){p=(pcb*)malloc(sizeof(pcb));if(head==NULL){head=p;q=p;}printf(依次输入:\n进程号进程名到达时间服务时间\n);scanf(%s\t%s\t%d\t%d,&p-num,&p-name,&p-tijiaotime,&p-needtime);if(p-tijiaotimetime)time=p-tijiaotime;q-next=p;p-runtime=0;p-finishtime=0;p-next=NULL;p-state='W';q=p;}}//*********************1.先来先服务调度算法*******************************voidrun_fcfo(pcb*p1)//定义先来先到服务的算法{time=p1-tijiaotimetime?p1-tijiaotime:time;p1-runtime=time;printf(\n现在时间是%d,开始运行进程%s\n,time,p1-name);time+=p1-needtime;p1-state='F';p1-finishtime=time;printf(进程名开始时间所需时间结束时间\n);printf(%s%d%d%d,p1-name,p1-runtime,p1-needtime,p1-finishtime);}voidfcfo()//定义运行进程函数{inti,j,t;for(j=0;jn;j++){p=head;t=10000;for(i=0;in;i++)//找到当前未完成的进程{if(p-tijiaotimet&&p-state=='W'){t=p-tijiaotime;q=p;//标记当前未完成的进程}p=p-next;}run_fcfo(q);}}//************************2.优先级调度服务算法************************************intreadydata(){//建立就绪队列if(head_input-next==NULL){return0;}structPCB*p1=head_input-next,*pmax,*p2;intmaxpro=0xffff;pmax=p1;p2=head_input;while(p1!=NULL){if(p1-promaxpro){maxpro=p1-pro;head_run_pre=p2;pmax=p1;}p2=p1;p1=p1-next;}head_run=pmax;head_run_pre-next=head_run-next;return1;}voidrunprocess()//运行进程函数{head_run-runtime-=10;head_run-pro++;structPCB*p1,*p2;printf(时间片的大小%d,current);current+=10;printf(%s开始\n,head_run-name);printf(时间片的大小%d,current);printf(%s结束\n,head_run-name);if(head_run-runtime=0){//判断进程是否运行结束}else{p1=head_input;p2=head_input-next;p1-next=head_run;head_run-next=p2;}}intreadyprocess(){while(1){if(readydata()==0)return0;elserunprocess();}}voidInit(){head_input=newPCB;head_input-next=NULL;current=0;intnumpro;printf(请重新输入要建立的进程个数:);scanf(%d,&numpro);printf(请依次输入进程名运行时间优先级\n);for(inti=0;inumpro;i++){structPCB*p1=newPCB;scanf(%s,p1-name);scanf(%d,&p1-runtime);scanf(%d,&p1-pro);p1-state='C';p1-next=NULL;structPCB*p2=head_input-next;head_input-next=p1;p1-next=p2;}}//************************3.时间片轮转调度服务算法************************************voidshijianpian(){intb,i,X,t,k;inta[MAX];//存放进程的剩余时间intcnt[MAX];//存放进程调度次数printf(请输入进程数:);scanf(%d,&X);printf(\n请输入时间片t大小:);scanf(%d,&t);printf(\n请依次输入各个进程的服务时间);for(i=0;iX;i++){scanf(%d,&a[i]);cnt[i]=0;}printf(被调度进程\t进程调度次数\t本次运行时间结果\t剩余时间\n);k=1;while(k){for(i=0;iX;i++){if(a[i]!=0)if(a[i]=t){a[i]-=t;b+=t;cnt[i]=cnt[i]+1;printf(\n\t%d\t\t%d\t\t%d\t\t%d,i+1,cnt[i],b,a[i]);}else{b=b+a[i];cnt[i]=cnt[i]+1;a[i]=0;printf(\n\t%d\t\t%d\t\t%d\t\t%d,i+1,cnt[i],b,a[i]);}elsecontinue;}for(i=0;iX;i++)if(a[i]!=0){k=1;break;}elsecontinue;if(i=X)k=0;}}voidmain(){printf(*******************************);printf(\n1.按先来先到服务调度的算法模拟\n);printf(*******************************);getInfo();fcfo();printf(\n*******************************);printf(\n2.按优先级调度的算法模拟\n);printf(\n*******************************\n);Init();readyprocess();printf(\n*******************************);printf(\n3.按时间片轮转调度的算法模拟\n);printf(*******************************\n);shijianpian();printf(\n);}