前几天上课操作系统实验课课用java做了实现一下SPF短进程优先调度算法,代码水平很低,适合新手理解,在这里分享一下我的代码,希望能帮助到同学们,(彭彩虹老师的操作系统实验课速进)

算法描述

进程类

class ProcessData {//作业号public int id;// 到达时间public int arriveTime;// 服务时间public int serviceTime;//开始时间public int runtime;// 完成时间public int finishTime;// 周转时间public int turnTime;// 带权周转时间public double powerTime;//判断是否处理过public boolean finish=false;// 作业的构造方法中传来的初值为到达时间和服务时间public ProcessData(int id,int arriveTime, int serviceTime) {this.id=id;this.arriveTime = arriveTime;this.serviceTime = serviceTime;}// 重写toString方法便于之后的数据展示@Overridepublic String toString() {return  id + "\t" +arriveTime + "\t" +serviceTime + "\t" + runtime + "\t" +finishTime + "\t" + turnTime + "\t" + powerTime;}public String qString() {return  id + "\t" +arriveTime + "\t" +serviceTime + "\t" ;}
}

运行主类

主要的算法思想是,设置一个从零到所有作业结束的时间节点,循环每个时间点,判断当前时间系统是否空闲且是否有作业到达,有作业到达则将到达的作业根据服务时间排好序,设置相应的系统释放时间即下一个系统空闲时间,在下一个系统空闲时间重复该步骤。

代码很长,但注释尽可能详细了


import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class ProcessProject {// 平均周转时间public static double avgTotalTime;// 平均带权周转时间public static double avgPowerTime;public static void main(String[] args) {// 定义长度为4,类型为作业数据类的作业数组用于存储4个作业ProcessData[] processData = new ProcessData[4];// 定义三个个作业作业号,到达时间,服务时间processData[0] = new ProcessData(1,0,2);processData[1] = new ProcessData(2,1,3);processData[2] = new ProcessData(3,2,1);processData[3] = new ProcessData(4,4,3);// 调用SPF算法SPF(processData);}//SPF算法方法private static void SPF(ProcessData[] processData) {int preFinished = 0; // 前一个作业的完成时间即为下一个作业的开始时间int nextrelease=0;//下一次的释放时间int end=0;//运行总时间boolean isrelease=false;//判断系统当前是否释放即判断能否运行作业avgTotalTime = 0;    // 平均周转时间  avgPowerTime = 0;  // 平均带权周转时间ProcessData p;//用于队列位置交换的对象// 初始化完成时间、周转时间、带权周转时间的初值为0for (int i = 0; i < processData.length; i++) {processData[i].finishTime = 0; // 设置初始完成时间为0processData[i].turnTime = 0; // 设置初始周转时间为0processData[i].powerTime = 0; // 设置初始带权周转时间为0}//初始化结束时间for(int i=0;i<processData.length;i++) {end=end+processData[i].serviceTime;}//一下两个list用于临时排序List<ProcessData> list=new ArrayList<ProcessData>();List<ProcessData> temp=new ArrayList<ProcessData>();//SPF排序算法for(int time=0;time<=end;time++) {//time为时间//判断当前是否释放if(time==0||time>=nextrelease) {isrelease=true;}//如果释放了则跳到下个时间节点if (!isrelease) {continue;}//将队列中的作业在该时间下已经到达的作业加入到临时队列for(int i=0;i<processData.length;i++) {if(processData[i].arriveTime<=time&&!processData[i].finish) {temp.add(processData[i]);}}//同一时间下根据服务时间排序if(temp.size()==0) {continue;}if (temp.size()==1) {//用于跳过服务时间排序}else {for(int j=0;j<temp.size()-1;j++) {for(int k=0;k<temp.size()-1;k++) {if(temp.get(k).serviceTime>temp.get(k+1).serviceTime) {p=temp.get(k);temp.set(k, temp.get(k+1));temp.set(k+1, p);}}}}//将临时队列中的最服务时间最短的作业处理if(temp.size()>0) {temp.get(0).finish=true;//将作业的finsh属性设置为true,代表该作业已经被处理,下一个时间节点将不会考虑nextrelease=nextrelease+temp.get(0).serviceTime;//设置下一次系统空闲的时间节点list.add(temp.get(0));}if (time<nextrelease) {//决定系统是否释放isrelease=false;}temp=new ArrayList<ProcessData>();//清空temp,用于下一个时间节点}//将作业处理顺序重新存入processDa[]队列中for(int i=0;i<list.size();i++) {processData[i]=list.get(i);}// 如果第一个作业的到达时间不等于前一个作业的完成时间,就将前一个作业的完成时间定义为当前作业的到达时间if (processData[0].arriveTime != preFinished) {preFinished = processData[0].arriveTime;}for (int i = 0; i < processData.length; i++) {//开始时间计算if(preFinished<processData[i].arriveTime) {//当前一个作业已完成,而且第二个作业未到时processData[i].runtime=processData[i].arriveTime;preFinished=processData[i].arriveTime;}else {//否则该作业的开始时间为上一个作业的完成时间processData[i].runtime=preFinished;}// 作业的完成时间为上一个作业的完成时间加当前作业的服务时间processData[i].finishTime = preFinished + processData[i].serviceTime;preFinished = processData[i].finishTime;// 周转时间 = 完成时间 - 到达时间processData[i].turnTime = processData[i].finishTime - processData[i].arriveTime;// 带权周转时间 = 作业的周转时间 / 系统提供服务的时间processData[i].powerTime = (double) processData[i].turnTime / (double) processData[i].serviceTime;}System.out.println("SPF算法:");// 打印进程的信息Display(processData);}private static void Display(ProcessData[] processData) {System.out.println("进程号\t" +"到达时间\t" + "运行时间\t" + "开始时间\t"+ "结束时间\t" + "周转时间\t" + "带权周转时间\t");for (int i = 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);}
}

效果图

操作系统SPF算法Java实现相关推荐

  1. 操作系统-银行家算法(Java实现)

    一.银行家算法思想 银行家算法是最著名的死锁避免算法,其思想是:将操作系统视为银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款.操作系统按照银行家制定 ...

  2. 银行家算法JAVA版本

    银行家算法 摘要:银行家算法来源于银行的借贷业务,一定数量的本金要应多个客户的借贷周转,为了防止银行家资金无法周转而倒闭,对每一笔贷款,必须考察其是否能限期归还.在操作系统中研究资源分配策略时也有类似 ...

  3. 操作系统 磁头引臂调度 SCAN算法 JAVA实现(二)

    操作系统--磁头引臂调度SCAN算法 JAVA实现--双磁头引臂 具体要求 代码~ 说明 重要说明 具体要求 代码~ package com.guangluo.OS;import java.util. ...

  4. 操作系统FIFO算法(先进先出算法)

    操作系统FIFO算法(先进先出算法) 简介:本文章是作者学习操作系统期间所创作的FIFO算法. import java.util.*; /** 这是一个分页算法FIFO* */public class ...

  5. 推特雪花算法 java实现

    2019独角兽企业重金招聘Python工程师标准>>> package twiter.snowflake;/*** twitter的snowflake算法 -- java实现*/ p ...

  6. java dh算法_dh密钥交换算法java

    dh密钥交换算法java 迪菲-赫尔曼密钥交换(Diffie–Hellman key exchange,简称"D–H") 是一种安全协议. 它可以让双方在完全没有对方任何预先信息的 ...

  7. 在 Linux 操作系统中安装 Java

    在 Linux 操作系统中安装 Java 笔者的运行环境: CentOS Stream 8 x86_64 Java 11.0.12 进行这个教程之前,必须要先安装好一个 Linux 操作系统.这个 L ...

  8. 操作系统 先来先服务算法(FCFS)、最短寻到时间优先算法(SSTF)、扫描算法(电梯算法,SCAN)、循环扫描算法(CSCAN)

    操作系统 先来先服务算法(FCFS).最短寻到时间优先算法(SSTF).扫描算法(电梯算法,SCAN).循环扫描算法(CSCAN)和N步扫描算法(NStepScan)的程序实现 复制到本地即可运行 # ...

  9. 数据结构和算法(Java)-张晨光-专题视频课程

    数据结构和算法(Java)-579人已学习 课程介绍         如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功. 想写出精炼.优秀的代码,不通过不断的锤炼,是很难做到的 ...

  10. floyed java_Floyd算法java实现demo

    Floyd算法java实现,如下: package a; /** * ┏┓ ┏┓+ + * ┏┛┻━━━┛┻┓ + + * ┃ ┃ * ┃ ━ ┃ ++ + + + * ████━████ ┃+ * ...

最新文章

  1. 如何定义一个不能被继承的类
  2. 安装QT5后运行提示libHelp.so无法加载
  3. 阿里linux安装mysql_阿里云Linux Ubuntu系统安装mysql完整过程
  4. 分享自己针对Automation做的两个成熟的框架(QTP 和Selenium)
  5. vfp赋值超过7位出错_JDK1.7下的HashMap的源码分析
  6. 线性代数应该这样讲(三)-向量2范数与模型泛化
  7. WSDM Cup 2019自然语言推理任务获奖解题思路
  8. java is start_PHP IntlChar::isJavaIDStart()用法及代码示例
  9. php 图片系统,Linger
  10. 基于Spring Security的认证授权_应用详解_自定义退出_Spring Security OAuth2.0认证授权---springcloud工作笔记130
  11. [BZOJ1045] [HAOI2008] 糖果传递 (中位数)
  12. linux 制作分区镜像img文件
  13. SpringBoot使用LibreOffice--office转pdf
  14. Uncle-黄,恍恍惚惚的面经 -- 1(初级Java)
  15. Nginx基础应用配置小结 - 运维笔记
  16. 【新知实验室】TRTC体验
  17. 位运算(异或、左移、右移)的运算规则
  18. 刷题记录:牛客NC24083Greedy Gift Takers
  19. Strlen和Sizeof的区别
  20. AEC-Q100和ISO26262 ASIL-B双重认证

热门文章

  1. 移动设备管理与OMA DM 协议 V5(3)
  2. BMVC 2020 开幕,196篇论文73篇开源~
  3. 浅谈限流式保护器在充电线路中电气防火的应用
  4. box-sizing属性的理解
  5. PS透明婚纱抠图(超详细)
  6. linux设置usb选择性暂停,USB大容量存储设备无法启动的解决方法
  7. 终端代码重复率检测实践
  8. 大学英语精读第三版(第四册)复习笔记——文章内容摘要
  9. DES加密算法(框图流程详细分析)(C++实现)
  10. 如何搜索得到综述文献?