本文主要是介绍操作系统之短作业优先实现代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
完成与:2013.12.11左右
1. 算法思想
短作业(进程)优先调度算法SJ(P)F,是指对短作业或段进程优先调度的算法。他们分别用于作业调度和进程调度。短作业优先的调度算法时从后备队列中选择一个或者若干个估计运行时间最短的作业,将他们调入内存运行。而短进程优先调度算法则是从就绪队列中选择一个估计运行时间最短的进程,将处理机分配给它,使他立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时在从新调度。
2. 程序代码
#include <stdio.h>
#include <string.h>double avg_TurnaroundTime;//平均周转时间
double AQTT;//平均带权周转时间
struct progress{char proName[80];int arriveTime;//到达时间int serviceTime;//服务时间int flag; //访问标志,未访问0,访问1int finishTime;//完成时间int cyclingTime;//周转时间double float_Wi;//带权周转时间
};
struct progress course[80];
//struct progress course[80]={{0,1},{2,3},{5,5},{7,2},{8,4}};void health_Examine(int *courseNum)//输入合法性检查
{return; }
void progressNum(int *courseNum)//进程数目
{int i=0;for(i=0; i<*courseNum;i++){printf("请输入第%d个进程的相应信息。\n", i+1);printf("请输入进程名:");scanf("%s", course[i].proName);printf("请输入到达时间:");scanf("%d", &course[i].arriveTime); printf("请输入服务时间:");scanf("%d", &course[i].serviceTime);}return;
}
void init_flag(int *courseNum) //访问标志初始化为0,(未访问0,访问1)
{int i=0;for(i=0; i<*courseNum; i++)
{course[i].flag=0;// }return;
}
/*void sort_course(int *courseNum)//对进程按照到达时间进行排序
{int i=0,j=0;int temp=0;for(i=0;i<*courseNum-1; i++)for(j=i; j<*courseNum; j++){if(course[j].arriveTime > course[j+1].arriveTime) {temp=course[j];course[j]=course[j+1];course[j+1]=temp; }}return;
}*/
void finish_Time(int *courseNum)//进程的完成时间
{int i=0,countflag=1,minNum=0,index=0,serverPro=0,flag=0,testflag=0; course[0].finishTime=course[0].serviceTime;//第一个程序的完成时间countflag=0;course[0].flag=1;//1表示已经访问,0未访问minNum=65535;//保证程序正确执行index=0;//第一个进程开始serverPro=0;//上一个程序执行的进程(从0开始统计进程)while(countflag < (*courseNum-1)) {minNum=65535;testflag=0;for(i=1; i<*courseNum; i++){if(course[i].flag != 1) {if(course[serverPro].finishTime >= course[i].arriveTime){//判断上一个进程完成时间是否大于剩余的进程的执行时间if(minNum > course[i].serviceTime) {minNum=course[i].serviceTime;index=i;testflag=1;//是否被访问的标志}}else{if(serverPro+1 == i && testflag!=1) {//如果testflag未被访问,且与上一个已执行程序进程相邻,则访问此语句。flag=i;break;}else{continue; }}}}if(flag != countflag+1) {course[index].finishTime=course[serverPro].finishTime + course[index].serviceTime;serverPro=index;course[serverPro].flag=1;}else{course[flag].finishTime=course[flag].arriveTime + course[flag].serviceTime;serverPro=flag;course[serverPro].flag=1;}countflag++;}return;
}
void cyclingTime(int *courseNum)//周转时间
{int i=0;for(i=0; i<*courseNum; i++){course[i].cyclingTime=course[i].finishTime - course[i].arriveTime;}return;
}
void float_Wi(int *courseNum)//带权周转时间
{int i=0;for(i=0; i<*courseNum; i++){course[i].float_Wi=(double)course[i].cyclingTime/course[i].serviceTime;}return;
}
void avgTurnaroundTime(int *courseNum)//平均周转时间
{int i=0,sum_TurnaroundTime=0;for(i=0; i<*courseNum; i++){sum_TurnaroundTime += course[i].cyclingTime;}avg_TurnaroundTime=sum_TurnaroundTime/(*courseNum);return;
}
void _AQTT(int *courseNum)//平均带权周转时间
{int i=0;double sum_float_Wi=0;for(i=0; i<*courseNum; i++){sum_float_Wi += course[i].float_Wi;}AQTT=sum_float_Wi/(*courseNum);return;
}void print_FIFO(int *courseNum)//输出进程相关的信息
{int i=0;printf("进程的相应信息。\n");printf("进程\t到达时间\t服务时间\t完成时间\t周转时间\t带权周转\n");//for(i=0; i<*courseNum;i++){//printf("第%个进程的相应信息。\n", i+1);printf("%s\t %d\t\t %d\t\t %d\t\t %d\t\t %.002lf\t\t\n", course[i].proName,course[i].arriveTime,course[i].serviceTime,course[i].finishTime,course[i].cyclingTime,course[i].float_Wi);//putchar('\n');}printf("平均周转时间\t平均带权周转时间\n");printf(" %.002lf\t\t %.002lf\n",avg_TurnaroundTime,AQTT);return;
}
int main()
{int courseNum=5;printf("请输入进程数:");scanf("%d", &courseNum); init_flag(&courseNum);//进程标志初始化progressNum(&courseNum);//进程相应的信息//sort_course(&courseNum);//对进程按照到达时间进行排序finish_Time(&courseNum);//进程的完成时间cyclingTime(&courseNum);//周转时间float_Wi(&courseNum);//带权周转时间avgTurnaroundTime(&courseNum);//平均周转时间_AQTT(&courseNum);//平均带权周转时间print_FIFO(&courseNum);// return 0;
}
3.
运行结果
这篇关于操作系统之短作业优先实现代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!