首先我们先介绍一下这三个算法,先来先服务是指按照进程到来的时间,谁先来谁执行。短作业优先是指作业服务时间短的先执行。高响比优先是根据公式计算出优先权选出优先权最高的执行,计算高响比优先权的公式:优先权=(等待时间+服务时间)/服务时间。
计算中用到的三个公式:
完成时间=上一个进程的执行时间+服务时间。程序中上一个服务时间是preFinished。
周转时间=完成时间-到达时间。
带权周转时间=周转时间/服务时间。
下面是程序的代码:
数据结构类:
package com.progressFCFSSJFGAOXIANGYINGBI;
public class ProgressData {
<span style="white-space:pre"> </span>public int arrived; //到达时间
<span style="white-space:pre"> </span>public int server; //服务时间
<span style="white-space:pre"> </span>public int finished[] = new int[3]; //完成时间
<span style="white-space:pre"> </span>public int working[] = new int[3]; //周转时间
<span style="white-space:pre"> </span>public float powerWorking[] = new float[3]; //带权周转时间
<span style="white-space:pre"> </span>public ProgressData() {
<span style="white-space:pre"> </span>};
<span style="white-space:pre"> </span>public ProgressData(int arr, int ser) {
<span style="white-space:pre"> </span>arrived = arr;
<span style="white-space:pre"> </span>server = ser;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>public String toString() {
<span style="white-space:pre"> </span>return new Integer(arrived).toString()
<span style="white-space:pre"> </span>+ " "+ new Integer(server).toString()
<span style="white-space:pre"> </span>+ " "+ new Integer(finished[0]).toString()
<span style="white-space:pre"> </span>+ " "+ new Integer(working[0]).toString()
<span style="white-space:pre"> </span>+ " "+ new Float(powerWorking[0]).toString()
<span style="white-space:pre"> </span>+ " "+ new Integer(finished[1]).toString()
<span style="white-space:pre"> </span>+ " "+ new Integer(working[1]).toString()
<span style="white-space:pre"> </span>+ " "+ new Float(powerWorking[1]).toString()
<span style="white-space:pre"> </span>+ " "+ new Integer(finished[2]).toString()
<span style="white-space:pre"> </span>+ " "+ new Integer(working[2]).toString()
<span style="white-space:pre"> </span>+ " "+ new Float(powerWorking[2]).toString();
<span style="white-space:pre"> </span>}
}
算法类:
package com.progressFCFSSJFGAOXIANGYINGBI;
/* 调度算法
* FCFS SJF 高相应比算法
*/
public class ProgressMain {
<span style="white-space:pre"> </span>//用于对浮点数四舍五入,保留小数位数
<span style="white-space:pre"> </span> static java.text.DecimalFormat df =new java.text.DecimalFormat("#.0");
<span style="white-space:pre"> </span> //定义用于保存在个算法下执行作业的顺序的数组
<span style="white-space:pre"> </span> static int Fqueue[];
<span style="white-space:pre"> </span> static int Squeue[];
<span style="white-space:pre"> </span> static int Gqueue[];
<span style="white-space:pre"> </span>//先来先服务调度算法
public static void FCFS(ProgressData a[]) {
<span style="white-space:pre"> </span>int preFinished=0;
<span style="white-space:pre"> </span>ProgressData a1[]=a;
<span style="white-space:pre"> </span> Fqueue=new int[5]; //用于记录执行作业的顺序的数组
<span style="white-space:pre"> </span>//java.text.DecimalFormat df =new java.text.DecimalFormat("#.00");
<span style="white-space:pre"> </span>for (int i = 0; i < a1.length; i++) {
<span style="white-space:pre"> </span>a1[i].finished[0]=preFinished+a1[i].server; //算完成时间 当前完成时间是=已经完成时间+当前作业的server时间
<span style="white-space:pre"> </span>a1[i].working[0]=a1[i].finished[0]-a1[i].arrived; //算周转时间
<span style="white-space:pre"> </span>a1[i].powerWorking[0]=Float.parseFloat(df.format(a1[i].working[0]/(float)a1[i].server)); //算带权周转时间
<span style="white-space:pre"> </span>preFinished=a1[i].finished[0]; //累加变量
<span style="white-space:pre"> </span>Fqueue[i]=i;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
//短作业优先调度算法
public static void SJF(ProgressData a[]) {
<span style="white-space:pre"> </span>int preFinished=0;
<span style="white-space:pre"> </span>int num=-1,min=4444;
<span style="white-space:pre"> </span>ProgressData a1[]=a;
<span style="white-space:pre"> </span> Squeue=new int[5];
<span style="white-space:pre"> </span>for (int ii = 0; ii < a1.length; ii++) {
<span style="white-space:pre"> </span>min=4444;
<span style="white-space:pre"> </span>for (int i = 0; i < a1.length; i++) { //查找最短作业
<span style="white-space:pre"> </span>if (a1[i].server<min&&a1[i].finished[1]==0&&a1[i].arrived<=preFinished) {
<span style="white-space:pre"> </span>min=a1[i].server;
<span style="white-space:pre"> </span>num=i;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>Squeue[ii]=num;
<span style="white-space:pre"> </span>a1[num].finished[1]=preFinished+a1[num].server;
<span style="white-space:pre"> </span>a1[num].working[1]=a1[num].finished[1]-a1[num].arrived;
<span style="white-space:pre"> </span>a1[num].powerWorking[1]=Float.parseFloat(df.format(a1[num].working[1]/(float)a1[num].server));
<span style="white-space:pre"> </span>//df.format(a1[num].powerWorking[1]);
<span style="white-space:pre"> </span>preFinished =a1[num].finished[1];
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
//高响比调度算法
public static void GaoXiangBi(ProgressData a[]){
<span style="white-space:pre"> </span>int preFinished=0;
<span style="white-space:pre"> </span>int num=0;
<span style="white-space:pre"> </span>float priority=-1000;
<span style="white-space:pre"> </span>ProgressData a1[]=a;
<span style="white-space:pre"> </span> Gqueue=new int[5];
<span style="white-space:pre"> </span>for (int ii = 0; ii < a1.length; ii++) {
<span style="white-space:pre"> </span>priority=-1000;
<span style="white-space:pre"> </span>for (int i = 0; i < a1.length; i++) {
<span style="white-space:pre"> </span>int sub=(((preFinished-a1[i].arrived)+a1[i].server)/a1[i].server);
<span style="white-space:pre"> </span>if (sub>priority&&a1[i].finished[2]==0&&a1[i].arrived<=preFinished) {
<span style="white-space:pre"> </span>priority=sub;
<span style="white-space:pre"> </span>num=i;
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>Gqueue[ii]=num;
<span style="white-space:pre"> </span>a1[num].finished[2]=preFinished+a1[num].server;
<span style="white-space:pre"> </span>a1[num].working[2]=a1[num].finished[2]-a1[num].arrived;
<span style="white-space:pre"> </span>a1[num].powerWorking[2]=Float.parseFloat(df.format(a1[num].working[2]/(float)a1[num].server));
<span style="white-space:pre"> </span>preFinished =a1[num].finished[2];
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>
}
public static void main(String[] args) {
<span style="white-space:pre"> </span>ProgressData p[]=new ProgressData[5];
<span style="white-space:pre"> </span>p[0]=new ProgressData(0,3);
<span style="white-space:pre"> </span>p[1]=new ProgressData(2,6);
<span style="white-space:pre"> </span>p[2]=new ProgressData(4,4);
<span style="white-space:pre"> </span>p[3]=new ProgressData(6,5);
<span style="white-space:pre"> </span>p[4]=new ProgressData(8,2);
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>FCFS(p);
<span style="white-space:pre"> </span>SJF(p);
<span style="white-space:pre"> </span>GaoXiangBi(p);
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>System.out.println("==================标识含义=================");
<span style="white-space:pre"> </span>System.out.println("F FCFS先来先服务\nS SJF短作业优先算法\nG 高响比算法");
<span style="white-space:pre"> </span>System.out.println("arr 到达时间\nser 运行时间\nfin 完成时间\nwork 周转时间\npwork 带权周转时间 ");
<span style="white-space:pre"> </span>System.out.println("=========================================");
<span style="white-space:pre"> </span>System.out.println();
<span style="white-space:pre"> </span>System.out.println();
<span style="white-space:pre"> </span>System.out.println("以下是相同作业的相同到达时间和运行时间,在三种算法(FCFS,SJF,高响比)下的运行性能指标:");
<span style="white-space:pre"> </span>System.out.println();
<span style="white-space:pre"> </span>System.out.println("arr ser Ffin Fwork Fpwork Sfin Swork Spwork Gfin Gwork Gpwork ");
<span style="white-space:pre"> </span>System.out.println(p[0]);
<span style="white-space:pre"> </span>System.out.println(p[1]);
<span style="white-space:pre"> </span>System.out.println(p[2]);
<span style="white-space:pre"> </span>System.out.println(p[3]);
<span style="white-space:pre"> </span>System.out.println(p[4]);
<span style="white-space:pre"> </span>System.out.println();
<span style="white-space:pre"> </span>System.out.println();
<span style="white-space:pre"> </span>System.out.println("3中算法下作业的执行顺序如下:");
<span style="white-space:pre"> </span>System.out.print("FCFS算法下作业的执行流程:");
<span style="white-space:pre"> </span>for(int a:Fqueue)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>System.out.print(a+" ");
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>System.out.println();
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>System.out.print("SJF算法下作业的执行流程:");
<span style="white-space:pre"> </span>for(int a:Squeue)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>System.out.print(a+" ");
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>System.out.println();
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>System.out.print("高相应比算法下作业的执行流程:");
<span style="white-space:pre"> </span>for(int a:Gqueue)
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>System.out.print(a+" ");
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>
}
<span style="font-family: Arial;">}</span>
运行效果