作业调度—最短作业优先调度算法(sjf)

本文介绍了一种基于作业执行时间的最短作业优先(SJF)调度算法实现。通过C语言程序展示了如何从文件中读取作业信息,并按照到达时间和执行时间进行排序和调度,最终输出每个作业的详细执行情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 最短作业优先算法:是以进入系统的作业所提出的执行时间为标准,总是优先选取执行时间最短的作业。

#include<stdio.h>
#include<stdlib.h>
#define MAX 100
typedef struct JCB{
	int num;
	char State;
	int ArrivalTime;            //到达时间 
	int ServeTime;              //运行时间 
	int StartTime;              //开始时间 
	int FinshTime;                //结束时间 
	float CycleTime;       //周转时间 
	float ClTime;        //带权周转时间 
	struct JCB *next;
}JCB;
JCB Queue[MAX] = {0};
int times=0;                       //时间量 
int n;							//进程数 
void CreateQueue(){
//从d盘读取信息
	FILE *fw=fopen("D:\\data.txt","r");
	fscanf(fw,"%d",&n); 
	for(int i=0;i<n;i++){
		//进程初始化 
		Queue[i].State = 'f';           
		Queue[i].StartTime = 0;
		Queue[i].FinshTime = 0;
		Queue[i].ClTime = 0;
		Queue[i].CycleTime = 0;		
        fscanf(fw,"%d",&Queue[i].num);
        fscanf(fw,"%d",&Queue[i].ArrivalTime);
        fscanf(fw,"%d",&Queue[i].ServeTime);  
	} 
	 fclose(fw);
}
void Run(JCB jcb){
	jcb.State = 't';
	jcb.StartTime = times;
	jcb.FinshTime = jcb.ServeTime+jcb.StartTime;//完成时间 
	times = jcb.FinshTime;
	jcb.CycleTime = jcb.FinshTime - jcb.ArrivalTime;//周转时间 
	jcb.ClTime = jcb.CycleTime/jcb.ServeTime;
	printf("%d        %d        %d       %.2f     %.2f\n",jcb.num,jcb.StartTime,jcb.FinshTime,jcb.CycleTime,jcb.ClTime);
}
void sort(){
	//按到达时间排序 
	for(int j=0;j<n;j++){
		for(int i=0;i<n-j-1;i++){
			if(Queue[i].ArrivalTime>Queue[i+1].ArrivalTime){
				JCB temp = Queue[i];
				Queue[i] = Queue[i+1];
				Queue[i+1] = temp;
			}	
		}
	}
}
void SJF(){
	sort();
	times = Queue[0].ArrivalTime;
	for(int i=0;i<n;i++){
		if(Queue[i].State = 'f'){
			if(i ==0){
				Run(Queue[i]);	
			}else if(Queue[i].ArrivalTime<times){
				int num = i;
				while(Queue[num].ArrivalTime<times && num<n){
					num++;
				}
				for(int x=i;x<num;x++){
					for(int t=i;t<num-x;t++){
						if(Queue[t].ServeTime>Queue[t+1].ServeTime){
							JCB temp = Queue[t];
							Queue[t] = Queue[t+1];
							Queue[t+1] = temp;
						}	
					}
				}
				Run(Queue[i]);
			}else{
				Run(Queue[i]);
			}				
		}
	}
}
int  main(){
	CreateQueue();
	printf("进程编号  开始时间 结束时间 周转时间 带权周转时间\n");
	SJF();
	return 0;
}  

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值