实现

下面是用 Java 程序比较 FCFS,SJF 和 PSA 算法效率的示例代码:

FCFS

思路

对于 FCFS 算法,我们可以定义一个 Process 类来表示一个进程,其中包含进程名称、到达时间和执行时间三个属性。然后我们可以定义一个 FCFS 类,其中包含一个 ArrayList 来存储所有的进程,并实现调度算法的逻辑。

源码

`

public class FCFS {private ArrayList<Process> processList;
​public FCFS(ArrayList<Process> processList) {this.processList = processList;}
​public void schedule() {// 按照进程的到达时间升序排序Collections.sort(processList, (p1, p2) -> p1.arrivalTime - p2.arrivalTime);
​int currentTime = 0;int waitingTime = 0;int turnaroundTime = 0;
​for (Process p : processList) {if (currentTime < p.arrivalTime) {currentTime = p.arrivalTime;}waitingTime += currentTime - p.arrivalTime;turnaroundTime += currentTime - p.arrivalTime + p.executionTime;currentTime += p.executionTime;}
​double averageWaitingTime = (double) waitingTime / processList.size();double averageTurnaroundTime = (double) turnaroundTime / processList.size();
​System.out.println("平均等待时间:" + averageWaitingTime);System.out.println("平均周转时间:" + averageTurnaroundTime);}
}

`

解释

在 FCFS 算法的示例代码中,我们定义了一个 Process 类来表示一个进程,包含进程名称、到达时间和执行时间三个属性。然后我们定义了一个 FCFS 类,其中包含一个 ArrayList 来存储所有的进程,并实现调度算法的逻辑。

调度算法的逻辑如下:

  • 首先,将进程列表按照到达时间升序排序。

  • 然后,遍历每一个进程

  • 如果当前时刻小于进程的到达时间,则将当前时刻更新为进程的到达时间。

  • 然后,计算等待时间和周转时间:

    • 等待时间 = 当前时刻 - 进程的到达时间
    • 周转时间 = 当前时刻 - 进程的到达时间 + 进程的执行时间
  • 最后,将当前时刻更新为当前时刻 + 进程的执行时间。

在遍历完所有的进程之后,我们可以计算平均等待时间和平均周转时间,以此来评估 FCFS 算法的性能。

最后,调用 FCFS 类的 schedule 方法来执行调度算法即可。

SJF

思路

对于 FCFS 算法,我们可以定义一个 Process 类来表示一个进程,其中包含进程名称、到达时间和执行时间三个属性。然后我们可以定义一个 FCFS 类,其中包含一个 ArrayList 来存储所有的进程,并实现调度算法的逻辑。

源码

public class SJF {private ArrayList<Process> processList;
​public SJF(ArrayList<Process> processList) {this.processList = processList;}
​public void schedule() {int currentTime = 0;int waitingTime = 0;int turnaroundTime = 0;
​while (!processList.isEmpty()) {// 找到当前时刻最先到达的,执行时间最短的进程Process p = processList.stream().filter(process -> process.arrivalTime <= currentTime).min((p1, p2) -> p1.executionTime - p2.executionTime).get();
​waitingTime += currentTime - p.arrivalTime;turnaroundTime += currentTime - p.arrivalTime + p.executionTime;currentTime += p.executionTime;
​processList.remove(p);}
​double averageWaitingTime = (double) waitingTime / processList.size();double averageTurnaroundTime = (double) turnaroundTime / processList.size();
​System.out.println("平均等待时间:" + averageWaitingTime);System.out.println("平均周转时间:" + averageTurnaroundTime);}
}

解释

在 SJF 算法的示例代码中,我们定义了一个 Process 类来表示一个进程,包含进程名称、到达时间和执行时间三个属性。然后我们定义了一个 SJF 类,其中包含一个 ArrayList 来存储所有的进程,并实现调度算法的逻辑。

调度算法的逻辑如下:

  • 使用 stream API 的 filter 和 min 方法来找到当前时刻最先到达的,执行时间最短的进程。

  • 然后,计算等待时间和周转时间:

    • 等待时间 = 当前时刻 - 进程的到达时间
    • 周转时间 = 当前时刻 - 进程的到达时间 + 进程的执行时间
  • 最后,将当前时刻更新为当前时刻 + 进程的执行时间。

在遍历完所有的进程之后,我们可以计算平均等待时间和平均周转时间,以此来评估 SJF 算法的性能。

最后,调用 SJF 类的 schedule 方法来执行调度算法即可。

PSA

思路

对于 PSA 算法,我们需要在 Process 类中增加一个优先级的属性,并在调度算法的逻辑上进行相应的修改。

如果进程在等待 CPU 时间的时间越长,就将它的优先级设为越高。这样,当进程获得 CPU 时间的机会时,就能够优先执行。这种算法能够有效地应对突发性的高优先级作业。

  • 首先,为每个进程设定一个初始优先级。
  • 然后,每当进程等待 CPU 时间超过一定的阈值,就将进程的优先级提高。
  • 当进程获得 CPU 时间时,按照优先级的高低进行调度。

需要注意的是,当进程执行完成后,需要将进程的优先级恢复为初始值。

源码

public class PSA {private ArrayList<Process> processList;
​public PSA(ArrayList<Process> processList) {this.processList = processList;}
​public void schedule() {int currentTime = 0;int waitingTime = 0;int turnaroundTime = 0;
​while (!processList.isEmpty()) {// 找到当前时刻最先到达的,优先级最高的进程Process p = processList.stream().filter(process -> process.arrivalTime <= currentTime).max((p1, p2) -> p1.priority - p2.priority).get();
​waitingTime += currentTime - p.arrivalTime;turnaroundTime += currentTime - p.arrivalTime + p.executionTime;currentTime += p.executionTime;
​processList.remove(p);}
​double averageWaitingTime = (double) waitingTime / processList.size();double averageTurnaroundTime = (double) turnaroundTime / processList.size();
​System.out.println("平均等待时间:" + averageWaitingTime);System.out.println("平均周转时间:" + averageTurnaroundTime);}
}

解释

首先,在示例代码中,我们定义了一个 Process 类来表示一个进程,包含进程名称、到达时间、执行时间和剩余执行时间四个属性。然后我们定义了一个 PSA 类,其中包含一个 ArrayList 来存储所有的进程,并实现调度算法的逻辑。

调度算法的逻辑如下:

  • 首先,将进程列表按照到达时间升序排序。

  • 然后,循环执行以下步骤,直到进程列表为空:

    • 从进程列表中取出第一个进程,并将其从列表中移除。
    • 如果当前时刻小于进程的到达时间,则将当前时刻更新为进程的到达时间。
    • 如果进程的剩余执行时间大于时间片,则执行时间片的长度;否则,执行进程剩余的所有时间。
  • 计算等待时间和周转时间:

    • 等待时间 = 当前时刻 - 进程的到达时间
    • 周转时间 = 当前时刻 - 进程的到达时间 + 进程的执行时间
  • 如果进程的剩余执行时间为 0,则将进程从进程列表中移除;否则,将进程插入进程列表的末尾。

  • 将当前时刻更新为当前时刻 + 执行的时间。

在遍历完所有的进程之后,我们可以计算平均等待时间和平均周转时间,以此来评估 PSA 算法的性能。

最后,调用 PSA 类的 schedule 方法来执行调度算法即可。

三种方法效率比较

都以相同的开始时间、进行时间、以及优先级进行比较

arr[0]={0,20,2};

arr[1]={5,15,1};

arr[2]={10,5,4};

arr[3]={15,10,3};

优先级是为了比较PSA的两种抢占效率(抢占式、非抢占式).

FCFS

SJF

PSA

抢占式

非抢占式

总结:

FCFS 算法是一种简单的调度算法,它按照进程的到达时间顺序依次执行进程,不考虑进程的执行时间。由于不能有效地应对短作业,因此 FCFS 算法的效率并不高。

SJF 算法是一种较高效的调度算法,它优先执行执行时间较短的进程,能够有效地应对短作业。但是,SJF 算法不能有效地应对突发性的高优先级作业。

PSA 算法是一种动态调度算法,它根据进程的等待时间动态调整进程的优先级,能够有效地应对突发性的高优先级作业。但是,PSA 算法的实现较为复杂,因此其运行效率略低于 SJF 算法。

总的来说,SJF 算法的效率略高于 PSA 算法,而 FCFS 算法的效率较低。不同的调度算法适用于不同的场景,应根据实际需要选择合适的调度算法。

FCFS,SJF以及PSA进程调度算法的比较相关推荐

  1. FCFS,SJF以及PSA进程调度算法效率的比较

    实现 下面是用 Java 程序比较 FCFS,SJF 和 PSA 算法效率的示例代码: FCFS 思路 对于 FCFS 算法,我们可以定义一个 Process 类来表示一个进程,其中包含进程名称.到达 ...

  2. 【操作系统 - 1】先来先服务FCFS和短作业优先SJF进程调度算法

    操作系统系列 学习至此,发现很多学了但很久没用的知识,久而久之,慢慢遗忘.等哪天还需要的话,却发现已经忘得差不多了,即使整理了文档(word等),还是得从头再学一遍.读研第一学期,发现很多东西都可以从 ...

  3. 进程调度算法——C++实现 [ FCFS,SJF,HPR,HRN + 开源代码 + 详细解析 ]

    ✅ (原创,库存,第100篇博客,纪念一下) 文章目录 零.动态演示图 一.实现原理 二.实现内容: 三.算法流程图: 3.1 先来先服务算法(FCFS)的流程图: 3.2 最短作业优先算法(SJF) ...

  4. 进程调度c语言 fcfs,计算机进程调度算法FCFS、RR、SJF的实现

    调度算法,在Linux环境下用C语言编写程序,模拟FCFS.RR.SJF等进程调度算法,以及利用信号量等方法解决哲学家就餐问题. 在主进程中,创建 20 个子线程,分别模拟进程调度算法FCFS.RR. ...

  5. fcfs和sjf java_Java简单实现进程调度算法 FCFS和SJF

    import java.text.DecimalFormat; import java.util.LinkedList; import java.util.List; import java.util ...

  6. Java模拟操作系统实验一:四种进程调度算法实现(FCFS,SJF,RR,HRN)

    前言 刚学完操作系统,模拟实现了其中一些经典的算法,内容比较多,打算写一个系列的总结,将自己的源码都分享出来,既方便自己以后复习,也希望能帮助到一些刚入坑的小伙伴.我的所有代码的运行环境都是基于Ecl ...

  7. 《操作系统》实验一:先来先服务FCFS和短作业优先SJF进程调度算法

    [实验题目]:先来先服务FCFS和短作业优先SJF进程调度算法 [实验学时]:4学时 [实验目的] 通过这次实验,加深对进程概念的理解,进一步掌握进程状态的转变.进程调度的策略及对系统性能的评价方法. ...

  8. 操作系统实验二——进程调度算法(FCFS、RR)

    目录 进程调度算法 FCFS算法代码 RR算法代码 进程调度算法 FCFS算法代码 #include <stdio.h> #include <string.h> #includ ...

  9. 进程调度算法FCFS和RR

    一. 实验题目 本次试验要求编写的是进程调度中的FCFS算法和RR算法(轮转法). FCFS算法:最简单的CPU调度算法,采取先到先服务的规则,不存在进程优先级之说,也不管进程服务时间的长短,只有前面 ...

最新文章

  1. 「干货」谷歌大脑:元学习最新进展与挑战(40 PPT下载)
  2. 树莓派安装Ubuntu 18 64系统
  3. 计算机组成原理第6章-总线
  4. 码云一个仓库只有一个项目吗_gitee码云完整使用教程(部署与克隆)
  5. python统计分析--2.预分析:异常值、缺失值处理
  6. 王道408数据结构——第六章 图
  7. SqlServer时间戳与普通格式的转换
  8. TensorFlow HOWTO 1.1 线性回归
  9. 在Module中使用自定义过滤器,来统一对站内所有请求响应的输出内容进行采集或更改。...
  10. 作为程序猿必须了解的生产者与消费者
  11. bool可以是java得标识符嘛_Java-标识符--修饰符--关键字
  12. 7-6 查找整数 (10 分)
  13. 用java怎么实现多语言翻译_快速实现中文翻译多国语言
  14. WSO2简单使用-rest
  15. MyBatis和Hibernate的区别
  16. 处理 unity崩溃日志
  17. 首届中阳验方节即将举办,失传多年的国宝级验方重见天日
  18. linux命令:查询某个字符串在哪个文件中存在,贼拉管用!
  19. 艺术对于计算机专业的应用,浅谈《计算机应用基础》课程的教学艺术
  20. (function(){}())与(function(){})()的区别

热门文章

  1. C# 坦克游戏大战中学习相关类(Rectangle)
  2. 人生苦短_人生苦短_郑亦辰_高音质在线试听_人生苦短歌词|歌曲下载_酷狗音乐...
  3. Java基础(进制转换-)
  4. 一台电脑如何装两个用友NC57环境(测试用)
  5. 阴影映射(Shadow Map)的研究(一)
  6. 计算机组成原理学习笔记第1章 1.3——实验一 计算机性能测试
  7. 解决Docker MySQL无法被宿主机访问的问题
  8. Java与JavaScript的区别
  9. flex froggy 青蛙跳荷叶的小游戏答案
  10. 17-equ伪指令和jmp指令