FCFS,SJF以及PSA进程调度算法的比较
实现
下面是用 Java 程序比较 FCFS,SJF 和 PSA 算法效率的示例代码: FCFS思路
对于 FCFS 算法,我们可以定义一个 Process 类来表示一个进程,其中包含进程名称、到达时间和执行时间三个属性。然后我们可以定义一个 FCFS 类,其中包含一个 ArrayList 来存储所有的进程,并实现调度算法的逻辑。 源码
` public class FCFS { private ArrayList processList; public FCFS(ArrayList 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 processList; public SJF(ArrayList 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 processList; public PSA(ArrayList 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 算法的效率较低。不同的调度算法适用于不同的场景,应根据实际需要选择合适的调度算法。
曼联世纪收购!英国首富厮杀卡塔尔富豪图片来源曼联官网截图2005年,美国犹太人家族格雷泽家族买下了曼联。多年以来,虽然他们对曼联不乏重磅投入,但始终无法改变其在球迷心中吸血鬼的印象。如今,收购曼联的大门再次被打开,卡
欧洲球员开始统治NBA?佩顿因为之前他们没机会进NBA最近几年,国际球员,尤其是来自欧洲的球员开始统治NBA,字母哥约基奇东契奇,成为MVP的热门候选人。NBA名宿加里佩顿谈及这一话题,表示之所以欧洲球员现在才开始统治联盟,是因为之前
莱万建功,巴塞罗那领先皇马8分文羊城晚报全媒体记者刘毅西甲第22轮2月20日继续进行,领头羊巴塞罗那主场以2比0击败排名倒数第四的卡迪斯,莱万多夫斯基打破长达近四个月的主场进球荒。在积分榜上,巴萨以59分继续领
大冷门!国乒6主力输球,马龙孙颖莎出局,林高远冲冠为难刘国梁大冷门!国乒6位主力输球,马龙孙颖莎出局,林高远冲冠为难刘国梁。国乒德班世乒赛直通赛进行到现在,连续上演了多场冷门,到目前为止,已经有6位国乒主力输球。女单方面,王艺迪惨遭两连败提
NBA全明星扣篮大赛网红扣将滞空夺冠马克迈克朗是一位身高1。88米的00后球员,也是历史上第一位受邀参加NBA全明星扣篮大赛的来自发展联盟的网红扣将。迈克朗用飘逸洒脱和无人能及的滞空动作把扣篮大赛变成了个人舞台,让这
洪江区开展智慧体育大数据平台使用培训怀化新闻网讯(通讯员胡竹林)为提升教师信息化素养,让信息技术与体育教学深度融合,帮助学生在体育锻炼中享受乐趣增强体质健全人格锤炼意志,近日,洪江区幸福路小学组织学校体育组全体任课教
竞秀区保定首个体育中心项目将于明年竣工使用2月18日,主题为聚焦高质量城市新发展,保定建设现代化品质生活之城暨2023竞秀区城市发展高峰论坛在河北青年报文创产业园举办。活动现场致辞中,保定市竞秀区政府副区长马超提到,保定市
体育人的智商情商先说朱荣振,他在山东时郁郁不得志,希望能逃离山东,等去到辽宁后,并没有什么机会,又说想回山东,回到山东了,机会更少,发挥更差,又说很怀念辽宁的快乐时光。为了能给俱乐部一个强大的印象
UFC在上海举办年度嘉年华,宣布今年将尽快在中国开始办赛(观察者网讯)2023年2月18日,世界顶级综合格斗组织UFC在UFC上海精英训练中心举办了首届嘉年华年度颁奖典礼。通过颁发15项由专业人士和粉丝投票评选出的奖项,表彰过去一年取得
斯诺克世界排名米尔金斯夺冠飙升,颜丙涛跌出前十六丁俊晖不变北京时间2月20日,斯诺克威尔士公开赛的比赛全部结束,最终46岁的老将米尔金斯97击败了世锦赛冠军墨菲,拿到了冠军,夺得8万英镑奖金15万英镑额外大奖,一共是23万英镑奖金成为超级
什么是金钉子?(把自然讲给你听)来源人民网金钉子是定义和区别全球不同年代所形成的地层的唯一标准。一颗金钉子的成功获取,标志着一个国家在这一领域的地学研究成果达到世界领先水平我们生活的地球,已有46亿年的演化历史,