一些基础的代码:
//输入进程 void setpcb(){ printf("请输入%d个进程\n",max); for(int i=0;i<max;i++){ MY_PCB[i].id=i+1; printf("\n请输入第%d个进程的 提交时间:",i+1); scanf("%lf",&MY_PCB[i].updata); getchar(); printf("\n请输入第%d个进程的 运行时间:",i+1); scanf("%lf",&MY_PCB[i].runtime); getchar(); } } //输出结果 void output(){ printf("==========================================================================================================\n"); printf("ID\t 提交时间 \t 运行时间 \t 开始时间\t 结束时间\t 周转\t\t带权周转\n"); for(int i=0;i<max;++i){ printf("%d\t %.4f\t %.4f\t\t %.4f \t %.4f \t %.4f \t %.4f \n",MY_PCB[i].id,MY_PCB[i].updata,MY_PCB[i].runtime,MY_PCB[i].starttime,MY_PCB[i].endtime,MY_PCB[i].turnover,MY_PCB[i].q_turnover); } double x=0,y=0; for(int i=0;i<max;i++){ x+=MY_PCB[i].turnover; y+=MY_PCB[i].q_turnover; } printf("\n平均周转\t 平均带权周转\n"); printf("%.4lf \t\t ",x/max); printf("%.4lf\n",y/max); printf("==========================================================================================================\n"); } //菜单 void menu(){ printf("*********************************************************************\n"); printf("\t\t 欢迎使用进程管理系统\n"); printf("\t\t\t0.退出系统\n"); printf("\t\t\t1.先来先服务\n"); printf("\t\t\t2.短进程优先\n"); printf("\t\t\t3.高响应比优先\n"); printf("*********************************************************************\n"); }
先来先服务算法
/****************************** 先来先服务 ********************************/ void fcfs(){ setpcb(); //根据提交时间选择排序 for(int i=0;i<max;i++){ for(int j=i;j<max;j++){ if(MY_PCB[i].updata>MY_PCB[j].updata){ PCB tep=MY_PCB[i]; MY_PCB[i]=MY_PCB[j]; MY_PCB[j]=tep; } } } //核心的计算过程 for(int i=0;i<max;i++){ if(i==0){ MY_PCB[i].starttime=MY_PCB[i].updata;//第一个进程的开始时间就是提交时间 }else{//第n个进程的开始时间就是提交时间和n-1个进程的结束时间有关系 if(MY_PCB[i].updata<=MY_PCB[i-1].endtime){//提交时间小于等于结束时间,则开始时间就是上一个的结束时间 MY_PCB[i].starttime=MY_PCB[i-1].endtime; }else{ MY_PCB[i].starttime = MY_PCB[i].updata; } } MY_PCB[i].endtime=MY_PCB[i].starttime + MY_PCB[i].runtime; MY_PCB[i].turnover = (MY_PCB[i].endtime - MY_PCB[i].updata); MY_PCB[i].q_turnover = MY_PCB[i].turnover/MY_PCB[i].runtime; } printf("先来先服务的结果:\n"); //输出结果 output(); system("pause"); }
短进程优先
/****************************** 短进程优先 ********************************/ void SPN(){ double teptime=0;//临时时间 int l_count=1;//开始的下标 int count=0;//结束的下表 setpcb(); //根据提交时间早的前提下选出运行时间少的排序方法 for(int i=0;i<max;i++){ for(int j=i;j<max;j++){ if(MY_PCB[i].updata>MY_PCB[j].updata){ PCB tep=MY_PCB[i]; MY_PCB[i]=MY_PCB[j]; MY_PCB[j]=tep; }else if(MY_PCB[i].updata==MY_PCB[j].updata){ if(MY_PCB[i].runtime>MY_PCB[j].runtime){ PCB tep=MY_PCB[i]; MY_PCB[i]=MY_PCB[j]; MY_PCB[j]=tep; } } } } //先运行第一个进程 printf("短进程优先的结果:\n"); printf("==========================================================================================================\n"); printf("ID\t 提交时间 \t 运行时间 \t 开始时间\t 结束时间\t 周转\t\t带权周转\n"); MY_PCB[0].starttime=MY_PCB[0].updata; MY_PCB[0].endtime=MY_PCB[0].starttime+MY_PCB[0].runtime; MY_PCB[0].turnover=MY_PCB[0].endtime - MY_PCB[0].updata; MY_PCB[0].q_turnover=MY_PCB[0].turnover/MY_PCB[0].runtime; printf("%d\t %.4f\t %.4f\t\t %.4f \t %.4f \t %.4f \t %.4f \n",MY_PCB[0].id,MY_PCB[0].updata,MY_PCB[0].runtime,MY_PCB[0].starttime,MY_PCB[0].endtime,MY_PCB[0].turnover,MY_PCB[0].q_turnover); //统计时间内有多少个程序 teptime+=MY_PCB[0].endtime; while(count<max-1){//只要没完就继续计算下去 for(int i=l_count;i<max;i++){ if(teptime>=MY_PCB[i].updata)count++; } //在count个内运行时间少的先运行 for(int i=l_count;i<=count;i++){ for(int j=i;j<=count;j++){ if(MY_PCB[i].runtime>=MY_PCB[j].runtime){ PCB tep=MY_PCB[i]; MY_PCB[i]=MY_PCB[j]; MY_PCB[j]=tep; } } } //输出相应的值 for(int i=l_count;i<=count;i++){ if(teptime<MY_PCB[i-1].endtime)teptime=MY_PCB[i-1].endtime; MY_PCB[i].starttime=teptime; MY_PCB[i].endtime=MY_PCB[i].starttime+MY_PCB[i].runtime; MY_PCB[i].turnover=MY_PCB[i].endtime - MY_PCB[i].updata; MY_PCB[i].q_turnover=MY_PCB[i].turnover/MY_PCB[i].runtime; printf("%d\t %.4f\t %.4f\t\t %.4f \t %.4f \t %.4f \t %.4f \n",MY_PCB[i].id,MY_PCB[i].updata,MY_PCB[i].runtime,MY_PCB[i].starttime,MY_PCB[i].endtime,MY_PCB[i].turnover,MY_PCB[i].q_turnover); } l_count=count; }//while(max-count-1>0) double x=0,y=0; for(int i=0;i<max;i++){ x+=MY_PCB[i].turnover; y+=MY_PCB[i].q_turnover; } printf("\n平均周转\t 平均带权周转\n"); printf("%.4lf \t\t ",x/max); printf("%.4lf\n",y/max); printf("==========================================================================================================\n"); system("pause"); }
相应比高者优先
/****************************** 相应比高者优先 ********************************/ void HRRN(){ double teptime=0;//临时时间 int l_count=1;//开始的下标 int count=0;//结束的下表 setpcb(); //根据提交时间早的排序方法 for(int i=0;i<max;i++){ for(int j=i;j<max;j++){ if(MY_PCB[i].updata>MY_PCB[j].updata){ PCB tep=MY_PCB[i]; MY_PCB[i]=MY_PCB[j]; MY_PCB[j]=tep; }else if(MY_PCB[i].updata==MY_PCB[j].updata){ if(MY_PCB[i].runtime>MY_PCB[j].runtime){ PCB tep=MY_PCB[i]; MY_PCB[i]=MY_PCB[j]; MY_PCB[j]=tep; } } }// } //先运行第一个进程 printf("相应比高者优先的结果:\n"); printf("==========================================================================================================\n"); printf("ID\t 提交时间 \t 运行时间 \t 开始时间\t 结束时间\t 周转\t\t带权周转\n"); MY_PCB[0].starttime=MY_PCB[0].updata; MY_PCB[0].endtime=MY_PCB[0].starttime+MY_PCB[0].runtime; MY_PCB[0].turnover=MY_PCB[0].endtime - MY_PCB[0].updata; MY_PCB[0].q_turnover=MY_PCB[0].turnover/MY_PCB[0].runtime; printf("%d\t %.4f\t %.4f\t\t %.4f \t %.4f \t %.4f \t %.4f \n",MY_PCB[0].id,MY_PCB[0].updata,MY_PCB[0].runtime,MY_PCB[0].starttime,MY_PCB[0].endtime,MY_PCB[0].turnover,MY_PCB[0].q_turnover); //统计时间内有多少个程序 teptime+=MY_PCB[0].endtime; while(count<max-1){//只要没完就继续计算下去 for(int i=l_count;i<max;i++){ if(teptime>=MY_PCB[i].updata)count++;//统计在时间内的所有进程 } //统计相应比做高的那一个 for(int i=l_count;i<=count;i++){ for(int j=i;j<=count;j++){ //计算R if((teptime-MY_PCB[i].updata)/MY_PCB[i].runtime < (teptime-MY_PCB[i].updata)/MY_PCB[j].runtime){ PCB tep=MY_PCB[i]; MY_PCB[i]=MY_PCB[j]; MY_PCB[j]=tep; } } } //输出相应的值 MY_PCB[l_count].starttime=teptime; MY_PCB[l_count].endtime=MY_PCB[l_count].starttime+MY_PCB[l_count].runtime; MY_PCB[l_count].turnover=MY_PCB[l_count].endtime - MY_PCB[l_count].updata; MY_PCB[l_count].q_turnover=MY_PCB[l_count].turnover/MY_PCB[l_count].runtime; printf("%d\t %.4f\t %.4f\t\t %.4f \t %.4f \t %.4f \t %.4f \n",MY_PCB[l_count].id,MY_PCB[l_count].updata,MY_PCB[l_count].runtime,MY_PCB[l_count].starttime,MY_PCB[l_count].endtime,MY_PCB[l_count].turnover,MY_PCB[l_count].q_turnover); teptime+=MY_PCB[l_count].runtime; l_count++; count=l_count-1; }//while(max-count-1>0) double x=0,y=0; for(int i=0;i<max;i++){ x+=MY_PCB[i].turnover; y+=MY_PCB[i].q_turnover; } printf("\n平均周转\t 平均带权周转\n"); printf("%.4lf \t\t ",x/max); printf("%.4lf\n",y/max); printf("==========================================================================================================\n"); system("pause"); }
实验图片以及结果: