创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡><)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
c++系列专栏:C/C++零基础到精通给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ
c语言内容:
专栏:c语言之路重点知识整合
【c语言】全部知识点总结
目录
- 一、先到先服务进程调度算法
- 二、短进程优先调度算法
一、先到先服务进程调度算法
先来先服务进程调度算法(FCFS)是按照进程到达的先后顺序进行调度的算法。
当一个进程到达时,它会被放到进程队列的末尾,并在前面等待其他进程执行完毕。
一旦轮到该进程执行,它会一直执行直到完成,或者被阻塞,或者需要等待I/O操作完成。
#include #include typedef struct { // 定义一个结构体,里面包含的有一个进程相关的信息char name[10];//进程名称 (输入)float arrivetime; //到达时间 (输入)float servicetime;//服务时间 (输入)float starttime;//开始时间float finishtime; //结束时间float zztime;//周转时间=finishtime-arrivetimefloat dqzztime;//带权周转时间=zztime/servicetime}pcb;//输入进程信息void input(pcb* p, int N)//p为pdb数组名, N为pcb数组的元素个数{int i;printf("\n");printf("请输入进程的名字到达时间服务时间:(例如: 进程1 0 100)\n");for (i = 0; i <= N - 1; i++){printf("请输入进程%d的信息:", i + 1);// i=0时,输入第1个进程相关信息scanf("%s", &p[i].name);scanf("%f", &p[i].arrivetime);scanf("%f", &p[i].servicetime);}}//排序: 按照进程的arrivetime(从小到大)对pcb数组中的N个进程进行排序void sort(pcb* p, int N){for (int i = 0; i < N - 1; i++){for (int j = i + 1; j < N; j++){if (p[i].arrivetime > p[j].arrivetime){pcb temp;temp = p[i];p[i] = p[j];p[j] = temp;}}}}//运行void run(pcb* p, int N){int k;for (k = 0; k <= N - 1; k++){if (k == 0) //第1个进程{p[k].starttime = p[k].arrivetime; //第1个进程到达之后即可执行p[k].finishtime = p[k].starttime + p[k].servicetime;}else{p[k].starttime = (p[k - 1].finishtime >= p[k].arrivetime) ? p[k - 1].finishtime : p[k].arrivetime;p[k].finishtime = p[k].starttime + p[k].servicetime;}}for (k = 0; k <= N - 1; k++){p[k].zztime = p[k].finishtime - p[k].arrivetime;p[k].dqzztime = p[k].zztime / p[k].servicetime;}}//显示void Print(pcb* p, int N){int k;printf("调用先来先服务算法以后进程运行的顺序是: ");printf("%s", p[0].name); //首先运行第一个进程p[0]for (k = 1; k < N; k++){printf("-->");printf("%s", p[k].name); //输出 -->p[k].name}printf("\n");printf("具体进程调度信息:\n");printf("进程名到达时间服务时间开始时间结束时间周转时间带权周转时间\n");for (k = 0; k <= N - 1; k++){printf("%4s", p[k].name);printf("%10.3f", p[k].arrivetime);printf("%10.3f", p[k].servicetime);printf("%10.3f", p[k].starttime);printf("%10.3f", p[k].finishtime);printf("%10.3f", p[k].zztime);printf("%10.3f\n", p[k].dqzztime);}}//先来先服务算法FCFSvoid FCFS(pcb* p, int N){sort(p, N);run(p, N);Print(p, N);int k;float Attime = 0; //平均周转时间float AQttime = 0; //平均带权周转时间for (k = 0; k <= N - 1; k++){Attime += p[k].zztime;AQttime += p[k].dqzztime;}Attime = Attime / N;AQttime = AQttime / N;printf("调用先来先服务算法的平均周转时间为:");printf("%.3f\n", Attime);printf("调用先来先服务算法的平均带权周转时间为:");printf("%.3f\n", AQttime);}int main(){pcb a[100]; //a为pcb数组 a[0]~a[N-1]对象第1个进程到第N个进程的信息int N;//N为进程数目printf("\n");printf("\n");printf("<>");printf("\n");printf("请输入进程数目:");scanf("%d", &N);input(a, N); //a是pcb数组名,N是实际使用数组元素个数FCFS(a, N); //fcfs模拟调度return 0;}
二、短进程优先调度算法
短进程优先调度算法(SPN)是根据进程执行时间短的优先级进行调度的算法。
当一个进程到达时,系统会估算其执行时间,如果短于当前正在执行的进程,那么该进程就会优先执行。如果有多个进程具有相同的最短执行时间,那么默认使用FCFS算法。
#include #include //定义一个结构体:PCBtypedef struct{char name[10];float arrivetime;float servicetime;float starttime;float finishtime;float zztime;float dqzztime;}pcb; //***输入进程信息,将N个进程的信息写入pcb型数组***void input(pcb *p,int N){int i;printf("\n");printf("请输入进程的名字到达时间服务时间:(例如: a 0 100)\n");for(i=0; i <= N-1; i++){printf("请输入进程%d的信息:", i+1);scanf("%s", &p[i].name);scanf("%f", &p[i].arrivetime);scanf("%f", &p[i].servicetime);}} //***优先级排序***void sort(pcb *p, int N){/*1、对pcb型数组中的元素进行一个简单的排序找到优先级最高的进程并把其他进程也进行简单排序,方便后续工作*///排序: N次循环,每次找到从i到N-1中优先级最高的进程,放到p[i]for(int i=0;i<=N-1;i++){//循环比较剩余的变量//排序后:从0~N-1arrivetime增加 , arrivetime相同时, servicetime短的优先for(int j=i+1;j<N;j++){if(p[i].arrivetime>p[j].arrivetime || (p[i].arrivetime==p[j].arrivetime && p[i].servicetime>p[j].servicetime) ){//p[j]的优先级高于p[i],因此把p[j]放到p[i]pcb temp;temp = p[i];p[i] = p[j];p[j] = temp; }}}/*2、每个进程运行完成之后,找到当前时刻已经到达的最短进程P[0]优先级最高,p[0].finishtime=p[0].arrivetime+p[0].servicetimem!=0时:p[m].finishtime=p[m-1].finishtime+p[m].servicetime*/for(int m=0; m<N-1; m++){if(m == 0)p[m].finishtime = p[m].arrivetime + p[m].servicetime;elsep[m].finishtime = ((p[m-1].finishtime >= p[m].arrivetime)" />[m-1].finishtime: p[m].arrivetime) + p[m].servicetime;//(1)找到p[m].finishtime时刻哪些进程已经到达int i=0;//i统计 p[m].finishtime时刻有几个进程已经到达//从下一个进程p[m+1]开始寻找for(int n = m+1; n <= N-1; n++){if(p[n].arrivetime <= p[m].finishtime)i++;elsebreak;/*由于在第1步已经对进程按照到达时间进行了排序故:当p[n].arrivetime > p[m].finishtime时,说明p[n]进程和其后面的其他进程都未到达。i的值为p[m].finishtime时刻已经到达的进程数目。 */}//(2)找到p[m].finishtime时刻已经到达的最短进程float min = p[m+1].servicetime; //next进程服务时间为p[m+1].servicetime (初值)int next = m+1; //next进程为m+1 (初值)//p[m+1]至p[m+i]这i个已到达进程中找到最短进程for(int k = m+1; k < m+i; k++) //k为m+1 ~ m+i-1{//min的初值是p[m+1].servicetime, k+1为m+2 ~m+iif(p[k+1].servicetime < min){min = p[k+1].servicetime;next = k+1;}}//(3)把最短进程放在p[m+1]进程处pcb temp;temp=p[m+1];p[m+1]=p[next];p[next]=temp;}} //***运行***void run(pcb *p, int N){int k;//计算各进程的开始时间和结束时间for(k=0; k <= N-1; k++) {if(k==0) //第1个进程{p[k].starttime = p[k].arrivetime; //第1个进程到达之后即可执行p[k].finishtime = p[k].starttime + p[k].servicetime;}else{p[k].starttime = (p[k-1].finishtime >= p[k].arrivetime)? p[k-1].finishtime: p[k].arrivetime;p[k].finishtime = p[k].starttime + p[k].servicetime;}}//计算各进程的周转时间和带权周转时间for(k=0; k<=N-1; k++){p[k].zztime = p[k].finishtime - p[k].arrivetime;p[k].dqzztime = p[k].zztime / p[k].servicetime; }}//***显示***void Print(pcb *p, int N){int k;printf("调用最短进程优先算法以后进程运行的顺序是: ");printf("%s",p[0].name);for(k=1;k<N;k++){printf("-->");printf("%s", p[k].name);}printf("\n");printf("具体进程调度信息:\n");printf("进程名到达时间服务时间开始时间结束时间周转时间带权周转时间\n");for(k=0; k<=N-1; k++){printf("%4s", p[k].name);//%m.nf:输出共占m列,其中有n位小数,如数值宽度小于m左端补空格printf("%10.3f", p[k].arrivetime);printf("%10.3f", p[k].servicetime);printf("%10.3f", p[k].starttime);printf("%10.3f", p[k].finishtime);printf("%10.3f", p[k].zztime);printf("%10.3f\n", p[k].dqzztime);}} //***短进程优先***void sjff(pcb *p,int N){sort(p, N);run(p, N);Print(p, N);int k;float Attime = 0; // 平均周转时间float AQttime = 0; //平均带权周转时间for(k=0; k<=N-1; k++) {Attime += p[k].zztime;AQttime += p[k].dqzztime; }Attime = Attime/N;AQttime = AQttime/N;printf("调用短进程优先算法的平均周转时间为:");printf("%.3f\n", Attime);printf("调用短进程优先算法的平均带权周转时间为:");printf("%.3f\n", AQttime);}//***主函数***int main(){//定义一个pcb型数组apcb a[100];int N;//进程数目printf("\n");printf("\n");printf("<>");printf("\n");printf("输入进程数目:");scanf("%d", &N);input(a, N);sjff(a, N);return 0;}
大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。 |
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●’◡’●) |