(操作系统)进程管理系统(fcfs、SPN、HRRN)

前言: ????作者简介:我是笑霸final,一名热爱技术的在校学生。 ????个人主页:?笑霸final的主页? ????系列专栏::本文写在java专栏 ????如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步???? ????如果感觉博主的文章还不错的话,????点赞???? + ????关注???? + ????收藏????

一.实验目的 1、理解进程调度的基本概念。 2、掌握常用进程调度算法的基本过程。 3、能够编程模拟进程调度的实现过程。 二.使用的设备和仪器 计算机+Windows XP +Visual C++6.0/vc2010 三.实验内容及要求 编程实现进程调度算法的基本过程,设计要求: 1、能够选择进程调度算法(先来先服务、短进程优先算法和高响应比优先算法)。 2、可以输入进程数目(至少3个进程),以及各进程的提交时间和运行时间。 3、能够显示调度过程及相应时间。

一些基础的代码:

//输入进程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”);}

实验图片以及结果:

找回自我,歇够了,再飞回来,继续面对自己的人生。

(操作系统)进程管理系统(fcfs、SPN、HRRN)

相关文章:

你感兴趣的文章:

标签云: