如何使用java模拟实现OS中的先到先服务(FCFS)和短则优先(SJF/SPF)算法?

代码:

public class JobControlBlock{
	float time_Sever;//服务时间
	float time_Arrive;//到达时间
	float time_Start;//开始时间
	float time_Finish;//完成时间
	float time_Turnover;//周转时间
	float time_WeightedTurnover;//带权周转时间
	public JobControlBlock(){
	}
	public JobControlBlock(float time_Sever,float time_Arrive){
		this.time_Sever=time_Sever;
		this.time_Arrive=time_Arrive;
	}//传服务时间,到达时间
	public void set_time_Start(float time_Start){
		this.time_Start=time_Start;
	}//设置开始时间
	public float get_time_Start(){
		return time_Start;
	}
	public void set_time_Arrive(float time_Arrive){
		this.time_Arrive=time_Arrive;
	}//设置到达时间
	public float get_time_Arrive(){
		return time_Arrive;
	}
	public void set_time_Finish(){
		time_Finish=time_Start+time_Sever;
	}//设置结束时间
	public float get_time_Finish(){
		return time_Finish;
	}
	public void set_time_Turnover(){
		time_Turnover=time_Finish-time_Arrive;
	}//计算周转时间
	public float get_time_Turnover() {
		return time_Turnover;
	}
	public void set_time_WeightedTurnover(){
		time_WeightedTurnover=time_Turnover/time_Sever;
	}//计算带权周转时间
	public float get_time_WeightedTurnover(){
		return time_WeightedTurnover;
	}
}
/*----------------------------------------------------------------------------------------------------------*/
public class Process {
	String Process_Name;
	JobControlBlock jbc;
	Process(){
	}
	Process(String name,JobControlBlock jbc){
		this.Process_Name=name;
		this.jbc=jbc;
	}//传进程名,分配JBC
}
/*----------------------------------------------------------------------------------------------------------*/
import java.util.Scanner;
public class Test1 {
	public static void main(String[] args) {
		//确定进程数
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入进程数:");
		int n = sc.nextInt();
		Process PList1[]=new Process[n];
		for(int i=0;i<PList1.length;i++){
			if(i==0){
				System.out.println("请按顺序输入第"+(i+1)+"个进程的名字、服务时间、到达时间并用空格隔开:");
				PList1[i]=new Process(sc.next(),new JobControlBlock(sc.nextFloat(), sc.nextFloat()));
				//按顺序设定开始时间、结束时间、周转时间、带权周转时间
				float time_Start=PList1[i].jbc.time_Arrive;//设置开始时间
				PList1[i].jbc.set_time_Start(time_Start);
				PList1[i].jbc.set_time_Finish();
				PList1[i].jbc.set_time_Turnover();
				PList1[i].jbc.set_time_WeightedTurnover();
				//设定下一个进程的开始时间
				time_Start+=PList1[i].jbc.time_Sever;
			}
			else {
				float time_Start=PList1[0].jbc.time_Finish;//设置开始时间
				System.out.println("请按顺序输入第"+(i+1)+"个进程的名字、服务时间、到达时间并用空格隔开:");
				PList1[i]=new Process(sc.next(),new JobControlBlock(sc.nextFloat(),sc.nextFloat()));
				PList1[i].jbc.set_time_Start(time_Start);
				PList1[i].jbc.set_time_Finish();
				PList1[i].jbc.set_time_Turnover();
				PList1[i].jbc.set_time_WeightedTurnover();
				//设定下一个进程的开始时间
				time_Start+=PList1[i].jbc.time_Sever;
			}
		}//创建进程
		System.out.println("--------FCFS算法--------顺序:");
		for(int i=0;i<PList1.length;i++){
		    System.out.println(
		        	"进程名:"+PList1[i].Process_Name
			    +" 到达时间:"+PList1[i].jbc.time_Arrive
		        +" 服务时间:"+PList1[i].jbc.time_Sever
		        +" 开始时间:"+PList1[i].jbc.time_Start
		        +" 结束时间:"+PList1[i].jbc.time_Finish
		        +" 周转时间:"+PList1[i].jbc.time_Turnover
		        +" 带权周转时间"+PList1[i].jbc.time_WeightedTurnover);
		}//按顺序输出(先到先服务)
		float time_Start2=PList1[0].jbc.time_Arrive;//SJF算法中到达时间最小的那个作业的到达时间就是开始时间
		Process leap=new Process();
		for(int i=1;i<PList1.length;i++){
			for(int j=i+1;j<PList1.length;j++){
				if(PList1[j].jbc.time_Sever<PList1[i].jbc.time_Sever){
					leap=PList1[i];
					PList1[i]=PList1[j];
					PList1[j]=leap;
				}
			}
		}//交换排序法使数组按服务时间的升序排列
		for(int i=0;i<PList1.length;i++){
			PList1[i].jbc.set_time_Start(time_Start2);
			PList1[i].jbc.set_time_Finish();
			PList1[i].jbc.set_time_Turnover();
			PList1[i].jbc.set_time_WeightedTurnover();
			time_Start2+=PList1[i].jbc.time_Sever;
		}//为SJF算法求值
		System.out.println("--------SJF算法--------");
		for(int i=0;i<PList1.length;i++){
		    System.out.println(
		        	"进程名:"+PList1[i].Process_Name
			    +" 到达时间:"+PList1[i].jbc.time_Arrive
		        +" 服务时间:"+PList1[i].jbc.time_Sever
		        +" 开始时间:"+PList1[i].jbc.time_Start
		        +" 结束时间:"+PList1[i].jbc.time_Finish
		        +" 周转时间:"+PList1[i].jbc.time_Turnover
		        +" 带权周转时间"+PList1[i].jbc.time_WeightedTurnover);
		}//按顺序输出(短则优先)
	}
}

可以参照这个表格录入

注:

因为是模拟算法,并不代表实际的过程。所以将作业都放置到数组中,FCFS是按输入顺序排列;SJF是在前者确定的数组中除去第一个作业按服务时间排序。
但在短则优先算法中,由于是事先录好的数组,可能会出现后备队列中有到达时间大于第一个作业结束时间的作业(但它的服务时间却是最小),这样就会出现周转时间为负的情况,这显然是错误的。所以此数组中除去第一个作业外,所有的作业到达时间均不能大于第一个作业的结束时间。实际上,进入后备队列的作业,他们的到达时间都不会大于上一个作业的结束时间。

发布了15 篇原创文章 · 获赞 9 · 访问量 696

猜你喜欢

转载自blog.csdn.net/weixin_43544077/article/details/89502055
今日推荐