操作系统之短作业优先实现代码

完成与: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. 运行结果





  • 11
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个简单的使用作业优先调度算法操作系统作业调度代码示例,使用C语言编写: ```c #include<stdio.h> #include<conio.h> #define size 10 int main() { int at[size],bt[size],tat[size],wt[size],s[size],i,j,n,total=0,pos,temp; float avg_wt,avg_tat; //平均等待时间和平均周转时间 clrscr(); //清屏操作 printf("Enter number of process: "); scanf("%d",&n); printf("\nEnter Arrival Time:\n"); for(i=0;i<n;i++) { printf("P[%d]:",i+1); scanf("%d",&at[i]); } printf("\nEnter Burst Time:\n"); for(i=0;i<n;i++) { printf("P[%d]:",i+1); scanf("%d",&bt[i]); s[i]=i+1; } //对作业优先进行排序 for(i=0;i<n;i++) { pos=i; for(j=i+1;j<n;j++) { if(bt[j]<bt[pos]) pos=j; } temp=bt[i]; bt[i]=bt[pos]; bt[pos]=temp; temp=s[i]; s[i]=s[pos]; s[pos]=temp; } wt[0]=0; //第一个进程的等待时间为0 //计算每个进程的等待时间和周转时间 for(i=1;i<n;i++) { wt[i]=0; for(j=0;j<i;j++) wt[i]+=bt[j]; total+=wt[i]; } avg_wt=(float)total/n; //平均等待时间 total=0; printf("\nProcess\t Burst Time \tWaiting Time\tTurnaround Time"); for(i=0;i<n;i++) { tat[i]=bt[i]+wt[i]; //计算周转时间 total+=tat[i]; printf("\nP[%d]\t\t %d\t\t %d\t\t\t%d",s[i],bt[i],wt[i],tat[i]); } avg_tat=(float)total/n; //平均周转时间 printf("\n\nAverage Waiting Time=%f",avg_wt); printf("\nAverage Turnaround Time=%f",avg_tat); getch(); //等待用户按下任意键结束程序 return 0; } ``` 以上代码实现了对作业优先调度算法的模拟,包括输入进程的到达时间和执行时间,对执行时间进行排序并计算每个进程的等待时间和周转时间,最后输出平均等待时间和平均周转时间。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值