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 类来表示一个进程,其中包含进程名称.到达 ...
- Java模拟操作系统实验一:四种进程调度算法实现(FCFS,SJF,RR,HRN)
前言 刚学完操作系统,模拟实现了其中一些经典的算法,内容比较多,打算写一个系列的总结,将自己的源码都分享出来,既方便自己以后复习,也希望能帮助到一些刚入坑的小伙伴.我的所有代码的运行环境都是基于Ecl ...
- 【操作系统 - 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 ...
- 《操作系统》实验一:先来先服务FCFS和短作业优先SJF进程调度算法
[实验题目]:先来先服务FCFS和短作业优先SJF进程调度算法 [实验学时]:4学时 [实验目的] 通过这次实验,加深对进程概念的理解,进一步掌握进程状态的转变.进程调度的策略及对系统性能的评价方法. ...
- 操作系统实验二——进程调度算法(FCFS、RR)
目录 进程调度算法 FCFS算法代码 RR算法代码 进程调度算法 FCFS算法代码 #include <stdio.h> #include <string.h> #includ ...
- 进程调度算法FCFS和RR
一. 实验题目 本次试验要求编写的是进程调度中的FCFS算法和RR算法(轮转法). FCFS算法:最简单的CPU调度算法,采取先到先服务的规则,不存在进程优先级之说,也不管进程服务时间的长短,只有前面 ...
最新文章
- iSCSI存储技术全攻略
- 十三、java_GUI
- mvc基础系列说谈(5)——参数与值传递,提交数据
- 腾讯机智在GTC 2019
- 定义命令别名(alias)
- ajax请求去获取base64_前端将图片转换为base64位,使用ajax传递到后台,但是图片经过base64转换成字符串后非常长,无法使用ajax...
- 【转】jquery文件上传插件uploadify在.NET中session丢失的解决方案
- linux中板子烧写环境配置,3、在Linux下搭建51单片机的开发烧写环境(makefile版)...
- ASPack 2.x (without poly) - Alexey Solodovnikov [Overlay]脱壳
- Spring 3.0: Unable to locate Spring NamespaceHandler for XML schema namespace
- 机器学习中的距离/散度/熵
- 【Ubuntu】USB 摄像头测试工具
- mysql 分页查询数据重复出现
- H3CNE概念思维导图
- 2 简单使用原形工具Axure RP
- java orm全称_[Java-基础] 什么是ORM
- Java JDK安装与配置
- 人脸识别之人脸验证(一)--Deepface
- 程序员进阶的10大黄金法则
- 代驾出行,为酒后安全保驾护航
热门文章
- Xtensa DSP结构学习
- 加拿大:国家资助研究项目IRAP已自主研发区块链浏览器
- backurl: heytapbrowser://main/iflow?sub_target=only_enter_iflow
- 日语学习资料下载 N5—N1都有
- 安徽师范大学计算机与信息学院研究生导师,安徽师范大学数学计算机科学学院导师介绍:郭要红...
- 一份只有做错的人才能做对的作业
- 双色球彩票核心算法(java)
- 百度云原生产品 6 月刊 | CCE 节点组支持配置多个备选机型、CCR 新增镜像加速功能
- 很不错的html学习资料
- Saber吃苹果,保持每箱苹果数量递增