500字范文,内容丰富有趣,生活中的好帮手!
500字范文 > 操作系统:先来先服务调度算法以及短作业优先调度算法C语言实现

操作系统:先来先服务调度算法以及短作业优先调度算法C语言实现

时间:2019-08-30 22:40:05

相关推荐

操作系统:先来先服务调度算法以及短作业优先调度算法C语言实现

FCFS(先来先服务)和SJF(短作业优先)调度算法

先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。

FCFS部分

int fcfs(){int i,j,w=0;for(i=0;i<4;i++){if(arrayTask[i].Status==0){t=arrayTask[i].ArriveTime;w=1;}if(w==1)break;}for(i=0;i<4;i++){if(arrayTask[i].ArriveTime<t&&arrayTask[i].Status==0)t=arrayTask[i].ArriveTime;}for(i=0;i<4;i++){if (arrayTask[i].ArriveTime==t)return i;}}

SFJ部分

int sjf(){int i,x=0,a=0,b=0;float g;for(i=0;i<4;i++){if(arrayTask[i].Status==1){g=arrayTask[i].EndTime;x=1;}}if(x==0){t=arrayTask[0].ArriveTime;for(i=0;i<4;i++){if(arrayTask[i].ArriveTime<t){t=arrayTask[i].ArriveTime;a=i;}}return a;}else{for(i=0;i<4;i++){if(arrayTask[i].EndTime>g) g=arrayTask[i].EndTime;}for(i=0;i<4;i++){if(arrayTask[i].Status==0&& arrayTask[i].ArriveTime<=g){t=arrayTask[i].RequestTime;a=i;b=1;}}if(b!=0){for (i=0; i <4; i ++){if (arrayTask [i]. Status==0&&arrayTask[i]. ArriveTime<=g&&arrayTask[i]. RequestTime<t){t=arrayTask[i]. RequestTime;a=i;}}return a;}else{for (i=0; i <4; i ++){if (arrayTask [i]. Status==0) t=arrayTask[i]. ArriveTime;}for(i=0;i<4;i++){if(arrayTask[i]. Status==0&&arrayTask[i]. ArriveTime<t){t=arrayTask[i]. ArriveTime;a=i;}}return a;}}}

总的代码实现

# include<stdio.h>float t, d;struct{int id;float ArriveTime;float RequestTime;float StartTime;float EndTime;float RunTime;float DQRunTime;int Status;}arrayTask[4];GetTask(){int i;float a;for(i=0;i<4;i++){arrayTask[i].id=i+1;printf("input the number");printf("input the the ArriveTime of arrayTask[%d]:",i);scanf("%f",&a); arrayTask[i].ArriveTime=a;printf("input the RequestTime of arrayTask[%d]:",i);scanf("%f",&a); arrayTask[i].RequestTime=a; arrayTask[i].StartTime=0;arrayTask[i].EndTime=0; arrayTask [i].RunTime=0;arrayTask[i].Status=0;}}int fcfs(){int i,j,w=0;for(i=0;i<4;i++){if(arrayTask[i].Status==0){t=arrayTask[i].ArriveTime;w=1;}if(w==1)break;}for(i=0;i<4;i++){if(arrayTask[i].ArriveTime<t&&arrayTask[i].Status==0)t=arrayTask[i].ArriveTime;}for(i=0;i<4;i++){if (arrayTask[i].ArriveTime==t)return i;}}int sjf(){int i,x=0,a=0,b=0;float g;for(i=0;i<4;i++){if(arrayTask[i].Status==1){g=arrayTask[i].EndTime;x=1;}}if(x==0){t=arrayTask[0].ArriveTime;for(i=0;i<4;i++){if(arrayTask[i].ArriveTime<t){t=arrayTask[i].ArriveTime;a=i;}}return a;}else{for(i=0;i<4;i++){if(arrayTask[i].EndTime>g) g=arrayTask[i].EndTime;}for(i=0;i<4;i++){if(arrayTask[i].Status==0&& arrayTask[i].ArriveTime<=g){t=arrayTask[i].RequestTime;a=i;b=1;}}if(b!=0){for (i=0; i <4; i ++){if (arrayTask [i]. Status==0&&arrayTask[i]. ArriveTime<=g&&arrayTask[i]. RequestTime<t){t=arrayTask[i]. RequestTime;a=i;}}return a;}else{for (i=0; i <4; i ++){if (arrayTask [i]. Status==0) t=arrayTask[i]. ArriveTime;}for(i=0;i<4;i++){if(arrayTask[i]. Status==0&&arrayTask[i]. ArriveTime<t){t=arrayTask[i]. ArriveTime;a=i;}}return a;}}}void new (int s){int i, g=0;for (i=0; i <4; i ++){if (arrayTask [i]. Status==0) continue;else{g=1;break;}}if (g==0){arrayTask[s].StartTime=arrayTask[s]. ArriveTime;arrayTask[s]. EndTime=arrayTask[s]. RequestTime+arrayTask[s]. ArriveTime;arrayTask[s]. RunTime=arrayTask[s]. RequestTime;arrayTask[s]. Status=1; g=2;}if (g==1){arrayTask[s]. Status=1;for(i=0;i<4;i++){if(arrayTask[i]. Status==1) d=arrayTask[i]. EndTime;}for (i=0; i <4; i ++){if (arrayTask [i]. EndTime>d&&arrayTask[i]. Status==1)d=arrayTask[i]. EndTime;}if(arrayTask[s]. ArriveTime <d)arrayTask [s]. StartTime=d;elsearrayTask[s]. StartTime=arrayTask[s].ArriveTime;arrayTask[s]. EndTime=arrayTask[s].StartTime+arrayTask[s].RequestTime;arrayTask[s].RunTime=arrayTask[s].EndTime-arrayTask[s].ArriveTime;}arrayTask[s].DQRunTime=arrayTask[s].RunTime/arrayTask[s].RequestTime;}/* output */void Printresult(int j ){printf ("%d \t", arrayTask [j]. id);printf("%5.2f\t",arrayTask[j]. ArriveTime);printf("%5.2f\t",arrayTask[j]. RequestTime);printf("%5.2f\t",arrayTask[j]. StartTime);printf("%5.2f\t",arrayTask[j].EndTime);printf("%5.2f\t",arrayTask[j].RunTime);printf("%5.2f\n",arrayTask[j].DQRunTime);}void main(){int i,b,k,a,c=0;int d[4];printf("\t F. FCFS \n");printf("\t S. SJF \n"); // short job firstprintf("\t Q. EXIT \n");for(i=0;;i++){if(c)break;printf("please input the number a:\n");scanf("%S",&a);switch(a){case 'Q': c=1; break;case 'F': printf("please input the different-ArriveTime of arrayTasks\n");GetTask();printf("*****************************the result of fcfs\n");printf("Number\tArrive\tServer\tStart \ tFinish \ tTurnove \ tTake power turnover time \n ");for (b=0; b <4; b ++){k = fcfs();d[b] = k;new(k);}for (b=0; b <4; b ++)Printresult(d[b]);continue;case 'S': printf (" please input the different-RequestTime of arrayTasks\n");GetTask();printf("******************************the result of sjf\n");printf("Number\tArrive\tRequest\tStart\tEnd\tRun\tDQRun time\n");for(b=0;b < 4 ;b++){k = sjf();d[b] = k;new(k);}for(b=0;b < 4;b++)Printresult(d[b]);continue;default:printf("the number Error.please input another number!\n");}}}

执行结果如下:

先选择FCFS,再选择SFJ部分,设置四个进程:到达时间为分别为10、15、30、50,运行时间分别为100、5、30、10。可得到如下结果:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。