您的位置:首页 > 编程语言 > Java开发

Java模拟操作系统进程调度算法—先来先服务、短作业优先、高响比优先

2014-11-19 22:22 1766 查看


Java模拟操作系统进程调度算法—先来先服务、短作业优先、高响比优先

分类: Java2011-10-23
19:50 3418人阅读 评论(2) 收藏 举报

作业算法java

首先我们先介绍一下这三个算法,先来先服务是指按照进程到来的时间,谁先来谁执行。短作业优先是指作业服务时间短的先执行。高响比优先是根据公式计算出优先权选出优先权最高的执行,计算高响比优先权的公式:优先权=(等待时间+服务时间)/服务时间。

计算中用到的三个公式:

完成时间=上一个进程的执行时间+服务时间。程序中上一个服务时间是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>


运行效果
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: