短作业优先(SJF)调度算法(Java实现)

简介: 短作业优先(SJF)调度算法(Java实现)

前言


在实现了先来先服务(FCFS)算法之后能够明显的感觉到先来先服务算法将当前处于就绪队列队首的那个进程调度到运行状态。也就是说,先来先服务算法只考虑作业或进程进入就绪队列的时间先后,而不考虑它的下一个CPU周期的长短等其他因素。虽然先来先服务算法简单易行并且是一种非抢占式策略,但性能却不大好导致平均周转时间特别长。因此,在先来先服务的算法基础上提出了短作业优先(SJF)算法来改进先来先服务算法,来减少平均周转时间。本文将介绍如何用Java来简单实现短作业优先调度算法

代码实现


假设当前有四个进程先后到达系统进行调度:

作业名 到达时间 服务时间
A 0 20
B 5 15
C 10 5
D 15 10

经过计算可得到如下结果:

作业名 到达时间 服务时间 完成时间 周转时间 带权周转时间
A 0 20 20 20 1
B 5 15 50 45 3
C 10 5 25 15 3
D 15 10 35 20 2

平均周转时间: ( 20 + 15 + 20 + 45 ) / 4 = 25

平均带权周转时间:( 20 / 20 + 15 / 5 + 20 / 10 + 45 / 15 ) / 4 = 2.25

接下来编写Java程序,输出以上计算结果

1、作业类


代码如下(示例):

classProcessData {
// 到达时间publicintarriveTime;
// 服务时间publicintserviceTime;
// 完成时间publicintfinishTime;
// 周转时间publicintturnTime;
// 带权周转时间publicdoublepowerTime;
publicProcessData(intarriveTime, intserviceTime) {
this.arriveTime=arriveTime;
this.serviceTime=serviceTime;
    }
@OverridepublicStringtoString() {
returnarriveTime+"\t"+serviceTime+"\t"+finishTime+"\t"+turnTime+"\t"+powerTime;
    }
}

2、算法实现类


代码如下(示例):

publicclassProcessProject {
// 平均周转总时间publicstaticdoubleavgTotalTime;
// 平均带权周转时间publicstaticdoubleavgPowerTime;
publicstaticvoidmain(String[] args) {
ProcessData[] processData=newProcessData[4];
// 定义四个作业processData[0] =newProcessData(0, 20); // 作业AprocessData[1] =newProcessData(5, 15); // 作业BprocessData[2] =newProcessData(10, 5); // 作业CprocessData[3] =newProcessData(15, 10); // 作业D// 短作业优先SJF(processData);
    }
// 短作业优先算法privatestaticvoidSJF(ProcessData[] processData) {
intpreFinished=0; // 前一个作业的完成时间即下一个作业的开始时间avgTotalTime=0;    // 平均周转时间avgPowerTime=0;    // 平均带权周转时间for (inti=0; i<processData.length; i++) {
processData[i].finishTime=0; // 设置完成时间为0processData[i].turnTime=0; //周转时间processData[i].powerTime=0; //平均周转时间        }
intnumber=0;  // 定义作业号// 定义双层for循环用于比较作业的完成时间和服务时间for (inti=0; i<processData.length; i++) {
intmin=8888;
for (intj=0; j<processData.length; j++) {
/***  1. 如果服务时间小于最小时间*  2. 到达时间小于等于前一个作业的完成时间*  3. 完成时间为0代表着还没有进行服务*  最核心的地方就在于有完成时间限制着作业不会继续重复进入循环*/if (processData[j].serviceTime<min&&processData[j].arriveTime<=preFinished&&processData[j].finishTime==0) {
min=processData[j].serviceTime; // 将目前服务时间最短的作业的服务时间赋值给作业的最小完成时间number=j; // 将下一个进行调度的作业号赋值给number                }
            }
processData[number].finishTime=preFinished+processData[number].serviceTime;  // 当前作业的完成时间等于上一个作业的完成时间加当前作业的服务时间preFinished=processData[number].finishTime; // 将上一个作业的完成时间赋值为当前作业的完成时间processData[number].turnTime=processData[number].finishTime-processData[number].arriveTime;  // 周转时间 = 完成时间 - 到达时间processData[number].powerTime=processData[number].turnTime/processData[number].serviceTime;  // 带权周转时间 = 周转时间 / 服务时间        }
System.out.println("短进程优先算法:");
Display(processData);
    }
// 该方法用于将作业的各种信息进行打印privatestaticvoidDisplay(ProcessData[] processData) {
System.out.println("到达时间\t"+"服务时间\t"+"完成时间\t"+"周转时间\t"+"带权周转时间\t");
for (inti=0; i<processData.length; i++) {
System.out.println(processData[i]);
avgTotalTime+=processData[i].turnTime; // 求总周转时间,此时avgTotalTime中存储的值为总周转时间avgPowerTime+=processData[i].powerTime; // 求总带权周转时间,此时avgPowerTime中存储的值为总带权周转时间        }
avgTotalTime=avgTotalTime/processData.length; // 平均周转时间avgPowerTime=avgPowerTime/processData.length; // 平均带权周转时间System.out.println("平均周转时间:"+avgTotalTime);
System.out.println("平均带权周转时间:"+avgPowerTime);
    }
}

3、运行结果


image.png

总结


以上便是短作业优先调度算法的Java实现,短作业优先算法的核心在于当系统中正在调度一个作业时,在当前作业调度完成之前到达系统的作业将会进行服务时间的比较,服务时间短的作业将在当前作业调度完成后优先进行调度。

相关文章
|
22天前
|
算法 调度 UED
探索操作系统的心脏:调度算法的奥秘与影响
【10月更文挑战第9天】 本文深入探讨了操作系统中至关重要的组件——调度算法,它如同人体的心脏,维持着系统资源的有序流动和任务的高效执行。我们将揭开调度算法的神秘面纱,从基本概念到实际应用,全面剖析其在操作系统中的核心地位,以及如何通过优化调度算法来提升系统性能。
|
22天前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
58 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
1月前
|
Java Apache Maven
Java百项管理之新闻管理系统 熟悉java语法——大学生作业 有源码!!!可运行!!!
文章提供了使用Apache POI库在Java中创建和读取Excel文件的详细代码示例,包括写入数据到Excel和从Excel读取数据的方法。
56 6
Java百项管理之新闻管理系统 熟悉java语法——大学生作业 有源码!!!可运行!!!
|
2天前
|
NoSQL Java 调度
Java调度任务如何保证相同任务在一个周期里只执行一次?
【10月更文挑战第29天】Java调度任务如何保证相同任务在一个周期里只执行一次?
18 6
|
1天前
|
算法 Linux 定位技术
Linux内核中的进程调度算法解析####
【10月更文挑战第29天】 本文深入剖析了Linux操作系统的心脏——内核中至关重要的组成部分之一,即进程调度机制。不同于传统的摘要概述,我们将通过一段引人入胜的故事线来揭开进程调度算法的神秘面纱,展现其背后的精妙设计与复杂逻辑,让读者仿佛跟随一位虚拟的“进程侦探”,一步步探索Linux如何高效、公平地管理众多进程,确保系统资源的最优分配与利用。 ####
16 4
|
2天前
|
缓存 负载均衡 算法
Linux内核中的进程调度算法解析####
本文深入探讨了Linux操作系统核心组件之一——进程调度器,着重分析了其采用的CFS(完全公平调度器)算法。不同于传统摘要对研究背景、方法、结果和结论的概述,本文摘要将直接揭示CFS算法的核心优势及其在现代多核处理器环境下如何实现高效、公平的资源分配,同时简要提及该算法如何优化系统响应时间和吞吐量,为读者快速构建对Linux进程调度机制的认知框架。 ####
|
2天前
|
存储 NoSQL Java
Java调度任务如何使用分布式锁保证相同任务在一个周期里只执行一次?
【10月更文挑战第29天】Java调度任务如何使用分布式锁保证相同任务在一个周期里只执行一次?
8 1
|
7天前
|
算法 大数据 Linux
深入理解操作系统之进程调度算法
【10月更文挑战第24天】本文旨在通过浅显易懂的语言,带领读者深入了解操作系统中的进程调度算法。我们将从进程的基本概念出发,逐步解析进程调度的目的、重要性以及常见的几种调度算法。文章将通过比喻和实例,使复杂的技术内容变得生动有趣,帮助读者建立对操作系统进程调度机制的清晰认识。最后,我们还将探讨这些调度算法在现代操作系统中的应用和发展趋势。
|
24天前
|
算法 调度 UED
深入理解操作系统的进程调度算法
【10月更文挑战第7天】在操作系统的心脏——内核中,进程调度算法扮演着至关重要的角色。它不仅影响系统的性能和用户体验,还直接关系到资源的合理分配。本文将通过浅显易懂的语言和生动的比喻,带你一探进程调度的秘密花园,从最简单的先来先服务到复杂的多级反馈队列,我们将一起见证算法如何在微观世界里编织宏观世界的和谐乐章。
|
26天前
|
存储 算法 固态存储
IO调度算法
【10月更文挑战第5天】IO调度算法
34 3