实现

下面是用 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. Java模拟操作系统实验一:四种进程调度算法实现(FCFS,SJF,RR,HRN)

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

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

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

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

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

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

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

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

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

  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. iSCSI存储技术全攻略
  2. 十三、java_GUI
  3. mvc基础系列说谈(5)——参数与值传递,提交数据
  4. 腾讯机智在GTC 2019
  5. 定义命令别名(alias)
  6. ajax请求去获取base64_前端将图片转换为base64位,使用ajax传递到后台,但是图片经过base64转换成字符串后非常长,无法使用ajax...
  7. 【转】jquery文件上传插件uploadify在.NET中session丢失的解决方案
  8. linux中板子烧写环境配置,3、在Linux下搭建51单片机的开发烧写环境(makefile版)...
  9. ASPack 2.x (without poly) - Alexey Solodovnikov [Overlay]脱壳
  10. Spring 3.0: Unable to locate Spring NamespaceHandler for XML schema namespace
  11. 机器学习中的距离/散度/熵
  12. 【Ubuntu】USB 摄像头测试工具
  13. mysql 分页查询数据重复出现
  14. H3CNE概念思维导图
  15. 2 简单使用原形工具Axure RP
  16. java orm全称_[Java-基础] 什么是ORM
  17. Java JDK安装与配置
  18. 人脸识别之人脸验证(一)--Deepface
  19. 程序员进阶的10大黄金法则
  20. 代驾出行,为酒后安全保驾护航

热门文章

  1. Xtensa DSP结构学习
  2. 加拿大:国家资助研究项目IRAP已自主研发区块链浏览器
  3. backurl: heytapbrowser://main/iflow?sub_target=only_enter_iflow
  4. 日语学习资料下载 N5—N1都有
  5. 安徽师范大学计算机与信息学院研究生导师,安徽师范大学数学计算机科学学院导师介绍:郭要红...
  6. 一份只有做错的人才能做对的作业
  7. 双色球彩票核心算法(java)
  8. 百度云原生产品 6 月刊 | CCE 节点组支持配置多个备选机型、CCR 新增镜像加速功能
  9. 很不错的html学习资料
  10. Saber吃苹果,保持每箱苹果数量递增