调度算法是什么:
根据系统的资源分配策略所规定的资源分配算法。对于不同的系统和系统目标,通常采用不同的调度算法。
先来先服务(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]+