
编写并调试一个多道程序系统的作业调度模拟.pdf
12页编写并调试一个多道程序系统的作业调度模拟程序五编写并调试一个多道程序系统的作业调度模拟程序作业调度算法:采用基于优先级的作业调度可以参考课本中的例子自行设计include stdio.h #include stdlib.h #define getjch(type) (type*)malloc(sizeof(type)) #define N 10 struct jcb { /* 定义作业控制块PCB */ char name[10]; float needtime; /* 运行时间 */ float arrivetime;/* 提交时刻 */ float storage[N];/* 系统资源 */ struct jcb* link; }*ready=NULL,*pb=NULL,*p; typedef struct jcb JCB; float Tc,Ti,Wi,T=0;/*完成时刻 ,周转时间 ,带权周转时间 ,时间量 */ float TiSum=0,WiSum=0;/*平均周转时间 ,带权 a 平均周转时间 */ float source[N]; int n; void input(); /* 输入作业信息 */ int space(); /* 返回就绪队列中作业的数目*/ void fcfs(); /* 先来先服务算法 */ void disp(JCB *pr); /* 显示相应的作业 */ void running(); /* 运行作业组 */ void destroy(); /* 撤销作业 */ void input() /* 建立作业控制块函数*/ { int i,k,num; printf( 请输入所拥有的资源种类:); scanf(%d,n); printf( 输入系统所拥有资源数:\n); for(i=0;in;i++) { printf( 资源[%d]:,i); scanf(%f,source[i]); } printf(\n 输入作业数量 :); scanf(%d,num); for(i=0;inum;i++) { printf(\n 作业号 [%d]:\n,i); p=getjch(JCB); printf( 输入作业名 :); scanf(%s,p-name); printf( 输入提交时间 :); scanf(%f,p-arrivetime); printf( 输入运行时间 :); scanf(%f,p-needtime); printf( 输入所需资源数 :\n); for(k=0;kn;k++) { printf( 资源[%d]:,i); scanf(%f,p-storage[k]); } printf(\n); p-link=NULL; fcfs(); } } int space() { int l=0; JCB* pr=ready; while(pr!=NULL) { l++; pr=pr-link; } return(l); } void disp(JCB * pr) /*建立作业显示函数 ,用于显示当前作业 */ { int i; printf(\n%6s\t%6s\t%6s\t,作业名, 运行时间 , 提交时刻 ); for(i=0;in;i++) printf( 资源[%d]\t,i); printf(\n%6s\t%6.2f\t\t%6.2f\t,pr-name,pr-needtime,pr-arrivetime); for(i=0;in;i++) printf(\t%6.2f,pr-storage[i]); printf(\n); } void destroy() /* 建立作业撤消函数 (作业运行结束 ,撤消作业 )*/ { free(p); } void check() { JCB *first,*fir,*p; int flag=0,i,test=0; first=pb; while(first(T=first-arrivetime)(flag==0)) { for(i=0;in;i++) { if(source[i]=first-storage[i]) source[i]=source[i]-first-storage[i]; else test=1; } if(test==0) { p=first; first=first-link; p-link=NULL; if(ready==NULL) ready=p; else { fir=ready; while(fir-link!=NULL) { fir=fir-link; } fir-link=p; } } else flag=1; } pb=first; } void fcfs() { JCB *first,*second; int ins=0; if((pb==NULL)||(p-arrivetimepb-arrivetime )) { p-link=pb; pb=p; } else { first=pb; second=first-link; while(second!=NULL) { if(p-arrivetimesecond-arrivetime) { p-link=second; second=NULL; first-link=p; ins=1; } else { first=first-link; second=second-link; } } if(ins==0) first-link=p; } } void running() { JCB *pr; int i; printf( 正在运行的作业是 :%s\n,p-name); disp(p); if(ready!=NULL) { printf( 就绪队列如下 :\n); pr=ready; while(pr!=NULL) { disp(pr); pr=pr-link; } } else printf( 就绪队列为空队列 !\n); if(pb!=NULL) { printf( 后备队列如下 :\n); pr=pb; while(pr!=NULL) { disp(pr); pr=pr-link; } } else printf( 后备队列为空队列 !\n); printf(作业%s的开始运行时刻T:%4.2f\n,p-name,T); Tc=T+p-needtime; T=Tc; Ti=Tc-p-arrivetime; Wi=Ti/(p-needtime); for(i=0;in;i++) source[i]=source[i]+p-storage[i]; printf( 完成时刻 Tc:%4.2f\n,Tc); printf( 周转时间 Ti:%4.2f\n,Ti); printf( 带权周转时间Wi:%4.2f\n,Wi); TiSum+=Ti; WiSum+=Wi; destroy(); } main() // 主函数{ int len; char ch; input(); T=pb-arrivetime; check(); len=space(); while((len!=0)(ready!=NULL)) { system(pause); p=ready; ready=p-link; p-link=NULL; running(); if(pb!=NULL) { if(ready==NULL) { if(Tpb-arrivetime) T=pb-arrivetime; } check(); len=space(); } } printf(\n该作业组的平均周转时间:%4.2f\n,TiSum /len); printf(该作业组的带权平均周转时间:%4.2f\n,WiSum/len); ch=getchar(); } 。












