完成与: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,访问1
int 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.
运行结果