文章目录
- 短进程优先算法(SJF):shortest job first
- 算法描述:每次选出最短的进程进行调度,调度完毕则淘汰,直到所有进程都调度完毕。
- 思维导图:
- 例题: 对如下进程 使用SJF算法 进行排序和结果回显
- 正确结果:
- Java实现:
- 测试结果
短进程优先算法(SJF):shortest job first
算法描述:每次选出最短的进程进行调度,调度完毕则淘汰,直到所有进程都调度完毕。 思维导图:
文章图片
例题: 对如下进程 使用SJF算法 进行排序和结果回显
文章图片
正确结果:
施行SPF(非抢占式)算法:
SPF的进程调度顺序为进程1、3、4、2,
平均进程周转时间T = (20+15+20+45)/4 = 25
平均带权进程周转时间W = (20/20+15/5+20/10+45/15)/4 = 2.25
Java实现:
package com.dhl.beyond.os_sjf;
import java.util.Scanner;
public class SJF {
String name;
double arrivetime;
//进程到达时间
double servicetime;
// 进程执行时间长度(服务时间)
double starttime;
//进程开始执行时间
double finishtime;
//进程执行完成时间
double zztime;
//周转时间
double dqzztime;
//带权周转时间
public SJF(){ }
public SJF(String name, double arrivetime, double servicetime) {
this.name = name;
this.arrivetime = arrivetime;
this.servicetime = servicetime;
}//主方法
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("===============短进程优先调度算法========================");
System.out.println("输入进程数目: ");
int num = scanner.nextInt();
//创建进程数组对象
SJF[] p = new SJF[num];
System.out.println("请创建进程对象, 输入进程名称 到达时间 服务时间 <例如: p1 0 20>");
for (int i= 0;
i p[j].arrivetime) {
SJF temp;
temp = p[i];
p[i] = p[j];
p[j] = temp;
}
}
}
// 2.每个进程运行完成之后,找到当前时刻已经到达的最短进程
for (int m = 0;
m < p.length;
m++) {
if (m == 0)//p[0]的优先级最高
p[m].finishtime = p[m].arrivetime + p[m].servicetime;
else
p[m].finishtime = p[m - 1].finishtime + p[m].servicetime;
/********* 查找当前进程执行过程中进入系统的进程 ***********/
// 2.1 找到p[m].finishtime时刻哪些进程已经到达,从下一个进程p[m+1]开始寻找
int i = 0;
for (int n = m + 1;
n < p.length;
n++) {
if (p[n].arrivetime <= p[m].finishtime) {
i++;
}
//2.2 找到p[m].finishtime时刻已经到达的最短进程
int next = m + 1;
double min = p[m + 1].servicetime;
//next进程服务时间为p[m+1].servicetime
//在 p[m+1]~p[m+i-1]这 i个已经到达的进程中找到最短进程
for (int k = m + 2;
k <= m + i;
k++) {
if (p[k].servicetime < min) {
min = p[k].servicetime;
next = k;
//2.3 把最短的进程 放在p[m+1]进程处
SJF temp;
temp = p[m + 1];
p[m + 1] = p[next];
p[next] = temp;
}}
}
}
}//进程执行
private static void run(SJF[] p) {
for(int k=0;
k"+p[k].name);
}
System.out.println("");
System.out.println("具体的调度信息: ");
System.out.println("进程名到达时间服务时间开始时间结束时间周转时间带权周转时间");
for(int k =0;
k
测试结果
推荐阅读
- Java算法|Java 实现OS调度算法之先来先服务算法(FCFS)
- 选择排序,简单排序,冒泡排序,快速排序的java代码实现
- Java中反射的概念、意义、用法(适合新手阅读)
- 算法|Java算法系列3--基于链表自定义队列
- java无限级树生成算法,空间复杂度为O(2n)