FCFS,SJF以及PSA进程调度算法的比较
实现
下面是用 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进程调度算法的比较相关推荐
- FCFS,SJF以及PSA进程调度算法效率的比较
实现 下面是用 Java 程序比较 FCFS,SJF 和 PSA 算法效率的示例代码: FCFS 思路 对于 FCFS 算法,我们可以定义一个 Process 类来表示一个进程,其中包含进程名称.到达 ...
- 【操作系统 - 1】先来先服务FCFS和短作业优先SJF进程调度算法
操作系统系列 学习至此,发现很多学了但很久没用的知识,久而久之,慢慢遗忘.等哪天还需要的话,却发现已经忘得差不多了,即使整理了文档(word等),还是得从头再学一遍.读研第一学期,发现很多东西都可以从 ...
- 进程调度算法——C++实现 [ FCFS,SJF,HPR,HRN + 开源代码 + 详细解析 ]
✅ (原创,库存,第100篇博客,纪念一下) 文章目录 零.动态演示图 一.实现原理 二.实现内容: 三.算法流程图: 3.1 先来先服务算法(FCFS)的流程图: 3.2 最短作业优先算法(SJF) ...
- 进程调度c语言 fcfs,计算机进程调度算法FCFS、RR、SJF的实现
调度算法,在Linux环境下用C语言编写程序,模拟FCFS.RR.SJF等进程调度算法,以及利用信号量等方法解决哲学家就餐问题. 在主进程中,创建 20 个子线程,分别模拟进程调度算法FCFS.RR. ...
- fcfs和sjf java_Java简单实现进程调度算法 FCFS和SJF
import java.text.DecimalFormat; import java.util.LinkedList; import java.util.List; import java.util ...
- Java模拟操作系统实验一:四种进程调度算法实现(FCFS,SJF,RR,HRN)
前言 刚学完操作系统,模拟实现了其中一些经典的算法,内容比较多,打算写一个系列的总结,将自己的源码都分享出来,既方便自己以后复习,也希望能帮助到一些刚入坑的小伙伴.我的所有代码的运行环境都是基于Ecl ...
- 《操作系统》实验一:先来先服务FCFS和短作业优先SJF进程调度算法
[实验题目]:先来先服务FCFS和短作业优先SJF进程调度算法 [实验学时]:4学时 [实验目的] 通过这次实验,加深对进程概念的理解,进一步掌握进程状态的转变.进程调度的策略及对系统性能的评价方法. ...
- 操作系统实验二——进程调度算法(FCFS、RR)
目录 进程调度算法 FCFS算法代码 RR算法代码 进程调度算法 FCFS算法代码 #include <stdio.h> #include <string.h> #includ ...
- 进程调度算法FCFS和RR
一. 实验题目 本次试验要求编写的是进程调度中的FCFS算法和RR算法(轮转法). FCFS算法:最简单的CPU调度算法,采取先到先服务的规则,不存在进程优先级之说,也不管进程服务时间的长短,只有前面 ...
最新文章
- 「干货」谷歌大脑:元学习最新进展与挑战(40 PPT下载)
- 树莓派安装Ubuntu 18 64系统
- 计算机组成原理第6章-总线
- 码云一个仓库只有一个项目吗_gitee码云完整使用教程(部署与克隆)
- python统计分析--2.预分析:异常值、缺失值处理
- 王道408数据结构——第六章 图
- SqlServer时间戳与普通格式的转换
- TensorFlow HOWTO 1.1 线性回归
- 在Module中使用自定义过滤器,来统一对站内所有请求响应的输出内容进行采集或更改。...
- 作为程序猿必须了解的生产者与消费者
- bool可以是java得标识符嘛_Java-标识符--修饰符--关键字
- 7-6 查找整数 (10 分)
- 用java怎么实现多语言翻译_快速实现中文翻译多国语言
- WSO2简单使用-rest
- MyBatis和Hibernate的区别
- 处理 unity崩溃日志
- 首届中阳验方节即将举办,失传多年的国宝级验方重见天日
- linux命令:查询某个字符串在哪个文件中存在,贼拉管用!
- 艺术对于计算机专业的应用,浅谈《计算机应用基础》课程的教学艺术
- (function(){}())与(function(){})()的区别
热门文章
- C# 坦克游戏大战中学习相关类(Rectangle)
- 人生苦短_人生苦短_郑亦辰_高音质在线试听_人生苦短歌词|歌曲下载_酷狗音乐...
- Java基础(进制转换-)
- 一台电脑如何装两个用友NC57环境(测试用)
- 阴影映射(Shadow Map)的研究(一)
- 计算机组成原理学习笔记第1章 1.3——实验一 计算机性能测试
- 解决Docker MySQL无法被宿主机访问的问题
- Java与JavaScript的区别
- flex froggy 青蛙跳荷叶的小游戏答案
- 17-equ伪指令和jmp指令