Java模拟操作系统进程调度算法—先来先服务、短作业优先、高响比优先
2014-11-19 22:22
1766 查看
Java模拟操作系统进程调度算法—先来先服务、短作业优先、高响比优先
分类: Java2011-10-2319: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>
运行效果
相关文章推荐
- Java模拟操作系统进程调度算法—先来先服务、短作业优先、高响比优先
- 《操作系统》 先来先服务FCFS和短作业优先SJF进程调度算法相关计算及实验
- [置顶] Java模拟最短作业优先、时间片轮转、最高响应比三种进程调度算法
- 操作系统进程调度算法 先到先服务 短作业 优先级 时间片轮转
- 操作系统进程调度算法 先到先服务 短作业 优先级 时间片轮转
- 操作系统中先来先服务、短作业优先、最高相应比优先三个进程数组实现的算法
- 先来先服务FCFS和短作业优先SJF进程调度算法
- java_实现先来先服务(FCFS)短作业优先算法(SJF)
- 进程调度算法 短作业优先 SJF
- 操作系统进程调度算法(Java 实现)
- 操作系统的作业调度和进程调度算法
- 进程调度算法模拟,用动态优先数及时间片轮转法实现进程调度_Java语言模拟实现
- 【大三操作系统实验】 作业进程调度算法
- 进程调度算法:短作业优先,时间片,优先级
- [2017/05/18]操作系统调度算法--最短剩余时间优先算法的模拟实现
- 操作系统进程调度算法(Java 实现)
- java实现操作系统中的页面置换算法、进程调度算法、磁盘调度算法
- 计算机操作系统的各种算法汇——作业、进程、页面置换、磁盘调度等。
- java做的操作系统进程管理模拟(操作系统作业)
- 用C++模拟操作系统进程调度的几种算法