hrrn算法java_常用的调度算法

effa1db7013924d7e357295bf3127d2b.png

调度算法是什么:

根据系统的资源分配策略所规定的资源分配算法。对于不同的系统和系统目标,通常采用不同的调度算法。

先来先服务(First Come First Served,FCFS)

一种最简单的调度算法,在进程中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机。

最短作业优先(Shortest Job First,SJF)

每次从就绪队列中选出一个估计运行时间最短的作业,为它分配处理机。

SJF是改进版本的FCFS,在短作业优先前提下,短作业不必等待长作业,从而可以处理更多的短作业。

优先权调度算法

高响应比优先调度算法(Highest Response Ratio Next,HRRN)

HRRN是对FCFS和SJF的一种综合改进,FCFS只考虑等待时间而未考虑执行时间,SJF方式只考虑执行时间而未考虑等待时间,HRRN同时考虑作业的等待时长和估计执行时长,从中选出响应比最高的作业执行。

响应比R: (W+T)/T = 1+W/T

T:作业估计执行时长

W:作业等待时长

基本流程:每当进行作业调度时,系统计算每个作业的响应比R,选择其中R最大者执行

时间片轮转调度算法(RR,Round-Robin)

RR是一种最古老、最简单、最公平且使用最广的算法,每个进程会被分配一个时间片(进程的执行时间)。

基于FCFS算法,给予每个进程一个时间片,当一个进程的时间片用完时,将发生时钟中断,调度程序暂停运行进程,将进程送到就绪队列队尾,接着通过上下文执行就绪队列队首的进程。

系统将所有的就绪进程按照先来先服务的原则排成一个队列,每次调度时,让CPU为队列的首进程服务一个时间片(几ms 到几百ms),当时间片到了时,由一个计时器发出时钟中断请求,调度程序就以此信号停止进程,并将停止了的进程送往就绪队列的末尾。

如何确定进程的时间片:

系统对进程响应时间的要求

就绪队列进程的数量

系统的性能

多级反馈队列调度算法

目前被公认的一种较好的进程调度算法,Unix系统采取的是这种调度算法,可以满足短进程和长进程的要求。

设置多个就绪队列,从第一个队列到最后一个队列,优先权从高往低,时间片长度从成倍递增。

当新进程进入内存后,首先放在第一队列的队尾,按FCFS原则等待调度,如果在分配的时间片中进程可以完成,则准备撤离系统,否则调度到第二队列的队尾,再同样按FCFS的原则等待调度执行,如此下去。

当第1(i-1)队列均空时,才会调度第i队列中的进程运行。又有新的进程进入优先权较高的队列(第1(i-1)中的任何一个队列),则正在运行的进程放回到第i队列的队尾,此时处理机将为新进程服务。

各类调度算法优缺点

\

优点

缺点

FCFS

利于长作业和CPU繁忙工作

不利于短作业和I/O繁忙工作

SJF

有利于系统的吞吐量。

长作业的运行得不到保障

HRRN

综合了FCFS和SJF算法的优点,兼顾了长进程和短进程的调度执行。

每次调度前需计算响应比,会给系统带来开销

RR

简单易行,平均响应时间短

不利于紧急作业,时间片会影响系统性能

代码实现:

# -*- coding: utf-8 -*-

"""

Created on Sun Nov 1 14:25:56 2020

@author: 11099

设数据是以表格的形式存在,包含的属性有进程名、到达时间、服务时间、开始时间、完成时间、周转时间、带权周转时间、平均值

所有算法均遵从以下步骤:

1.准备好数据(要求输入进程名、到达时间、服务时间,并准备好其他属性的变量)

2.实现算法(该步骤生成开始时间、完成时间、周转时间、带权周转时间、平均值的具体数值)

3.展示结果(都是两位有效数字的浮点数)

"""

import pandas as pd

# 定义调度算法的类

class schedule_algorithm:

# 初始化方法

def __init__(self, name, arrived_time, served_time):

self.data = pd.DataFrame({'到达时间': arrived_time, '服务时间': served_time}, dtype='float16', index=name, columns=['到达时间', '服务时间', '开始时间', '完成时间', '周转时间', '带权周转时间'])

self.data.sort_values(['到达时间', '服务时间'], inplace=True) # 先按到达时间从小到大排序,再按服务时间进行微调,意义在于同一到达时间可以先按服务时间进行调度

self.data.iloc[0, 2], self.data.iloc[0, 3], self.data.iloc[0, 4], self.data.iloc[0, 5] = self.data.iloc[0, 0], self.data.iloc[0, 0]+

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值