进程调度的几种方式与算法简介
一、调度的概念
- 调度的基本概念
在多道程序系统中,进程的数量往往多于处理机的个数,因此进程争用处理机的情况在所难免。处理机调度是对处理机进行分配,即从就绪队列中按照一定的算法(公平、高效)选择一个进程并将处理机分配给它运行,以实现进程并发执行。
二、进程调度的方式
当某个进程正在处理机上执行时。若有某个更为重要或紧迫的进程需要处理,即有优先权更高的进程进入就绪队列,此时要考虑以某种方式分配处理机。
·通常有以下两种进程调度方式:
- 非剥夺(非抢占)调度方式:当一个进程正在处理机上执行时,即使有某个更为重要或者紧迫的进程进入就绪队列,仍然让正在执行的进程继续执行,知道该进程完成或发生某种事件而进入阻塞态时,才把处理机分配给更为重要或紧迫(优先级更高)的进程。其优点是实现简单,系统开销小,适用于大多数批处理系统,但它不能用于分时系统和大多数实时系统。
- 剥夺(抢占)调度方式:当一个进程正在处理机上执行时,若有某个更为重要或紧迫的进程(优先级更高)的进程需要使用处理机,则立即暂停正在执行的进程,将处理机分配给这个更重要的进程。这种方式对提高系统吞吐率和响应效率都有明显的好处。但抢占也要遵循一定原则。
三、调度的基本准则
不同的调度算法具有不同的特性,在选择调度算法时,必须考虑算法的特性。为了比较处理机调度算法的性能,人们提出了很多评价准则,主要有一下几种:
- CPU利用率:CPU是计算机系统中最重要和最昂贵的资源之一,所以应该尽可能使得CPU保持忙的状态,资源利用率尽可能高。
- 系统吞吐量:单位时间内CPU完成的作业数量。长作业需要消耗较长的处理机时间,会降低系统的吞吐量。对于短作业,他们所需消耗的处理机时间较短,因此能提高系统吞吐量。调度算法和方式不同,也会对系统的吞吐量产生较大影响。
- 周转时间:周转时间是指从作业提交到作业完成所经历的时间,是作业等待、在就绪队列中排队,在处理机上运行及输入输出操作所花费的时间的总和。
- 等待时间:进程处于等处理机状态的时间之和。等待时间越长,用户满意度越低。实际上,处理机调度算法实际上并不影响作业执行或输入输出操作的时间,只影响作业在就绪队列中等待所花的时间。因此,衡量一个调度算法的优劣,常常只需简单地考察等待时间。
- 响应时间:用户提交请求到系统首次产生响应所用的时间。在交互式系统中,周转时间不可能是最好的评价准则,一般采用响应时间作业衡量调度算法的重要准则之一。从用户角度来看,调度策略应该尽量降低响应时间,使得响应时间处在用户能接受的范围之内。
总之,想得到一个满足所有用户和系统要求的算法几乎是不可能的。设计调度程序,一方面要满足特定系统用户的要求(比如,实时和交互进程的快速响应要求),另一方面要考虑系统整体的效率(比如,减少整个系统的进程平均周转时间),同时还要考虑调度算法的开销等。
四、几种典型的调度算法
先来先服务(FCFS)调度算法
FCFS是一种最简单的调度算法,它既可以用于作业的调度,又可以用于进程调度。在作业调度中,算法每次从后备作业队列中选择最先进入该队列的一个或几个作业,将他们调入内存,分配必要的资源,创建进程并放入就绪队列。
在进程调度中,FCFS调度算法每次从就绪队列中选择最先进入该队列的进程,将处理机分噢诶给它,使之投入运行,直到完成或尹某种原因而阻塞时才释放处理机。
FCFS属于不可剥夺(抢占)算法。从表面上看,它对所有作业都是公平的,但是如果有一个长作业先到达系统,就会使后面许多短作业等待很长时间,因此这种方法肯定不能作为分时系统和实时系统的调度方法,但是它常被结合在其他调度策略使用。比如在使用优先级作为调度策略的系统中,往往对多个具有相同优先级的进程按FCFS原则处理。
· 特点分析:算法简单,但是效率低下;对长作业较为有利,对短作业不利;利于CPU繁忙型作业,不利于I/O繁忙型作业。短作业优先(SJF)调度算法
短作业(进程)优先调度算法是指对短作业(进程)优先调度算法。短作业优先调度算法从后备队列中选择一个或若干估计运行时间最短的作业,将它们调入内存运行;短进程优先(SPF)调度算法是从就绪队列中选择一个估计运行时间最短的进程,将处理机分配给它,使之立即指向,直到完成或发生某时间而阻塞时,才释放处理机。
但是这种算法有着不容忽视的缺点:
①该算法对长作业不利,SJF中长作业的周转时间会增加。更糟的是,若一旦有长作业进入系统的后备队列,由于调度程序总是优先调度那些短作业(即使是后来的短作业也会被优先安排给处理机),导致长作业长期不被调度,饿死在后备队列中。
②完全没有考虑作业的紧迫程度,因而不能保证紧迫的作业会被及时处理。
③由于作业的长短只是根据用户所提供的预估的执行时间而定的,而用户又可能会有意无意地缩短其作业的估计运行时间,使得算法不一定能真正做到短作业优先调度。
但这算法的优点也显而易见:平均等待时间、平均周转时间最少。优先级调度算法
又称优先权调度算法,它既可以用于作业调度,又可用于进程调度。该算法的优先级用于描述作业运行的紧迫程度。
在作业调度中,优先级调度算法每次从后备作业队列中选择优先级最该的一个或几个作业,将他们调入内存,分配必要的资源,创建进程并放入就绪队列。在进程调度中,优先级调度算法每次从就绪队列中选择优先级最高的进程,并分配处理机,运行。
根据新的更高的优先级进程能否抢占正在执行的进程,可将该调度算法分为如下两种:
①非剥夺(抢占)式优先级调度算法:当一个进程正在处理机上运行时,即使有某个更在重要或者紧迫的进程进入就绪队列,仍然让正在运行的进程继续运行,直到由于自身的原因而主动让出处理机时(任务完成或等待),才把处理机分配给更重要或紧迫的进程。
②剥夺式优先级调度算法:当一个进程正在处理机上运行,若有某个更为重要或紧迫的进程进入就绪队列,则立即暂停正在运行的进程,将处理机分配给更重要或紧迫的进程。
而根据进程创建后其优先级是否可以改变,可以将进程优先级分为一下两种:
①静态优先级:优先级是在创建进程时确定的,并且进程的整个运行期间保持不变。确定静态优先级的主要依据有进程类型、进程对资源的要求、用户要求。
②动态优先级:在进程运行过程中,根据进程情况的变化动态调整优先级。动态调整优先级的主要依据有进程占有CPU的时间的长短、就绪进程等待CPU时间的长短。
一般来说,进程优先级可以参考一下原则:
①系统进程>用户进程。
②交互型进程>非交互型进程(前台进程>后台进程)
③I/O型进程>计算型进程。高响应比优先调度算法
主要用于作业调度,是对FCFS调度算法和SJF调度算法的一种综合平衡,同时考虑了每个作业的等待时间和估计的运行时间。在每次进行作业调度时,先计算后备队列中每个作业的响应比,从中选出响应比最高的作业投入运行。
响应比的变化规律可描述为:
响应比Rp = (等待时间+要求服务时间)/要求服务时间
根据公式可知:
①作业的等待时间相同时,要求服务时间约旦,响应比越高,有利于短作业。
②要求服务时间相同时,作业的响应比由其等待时间决定,等待时间越长,其响应比越高,因而它实现的是先来先服务。
③对于长作业,作业的响应比可以随等待时间的增加而提高,等待时间足够长时,其响应比便可升到很高,从而可以获得处理机,不会饿死。时间片轮转调度算法
时间片轮转调度算法主要适用于分时系统。在这种算法中,系统将所有就绪进程按到达时间的先后次序排成一个队列,进程调度程序总是选择就绪队列中的第一个进程执行,即先来先服务的原则,但是仅能运行一个时间片。在使用完一个时间片后,即使进程并未完成其运行,它也必须释放出(被抢占)处理机给下一个就绪的进程,而被抢占的进程返回到就绪队列的末尾重新排队,等候再次运行。
在时间片轮转的调度算法中,时间片的大小对系统性能有很大影响。如果时间片足够大,以至于所以进程都能在一个事件内执行完毕,则时间片轮转调度算法就退化成FCFS算法。如果时间片很小,则处理机将在进程间过于频繁地切换,使得处理机开销增大,而真正用于运行用户进程的时间将减少。因此,时间片的选择要适当,可以根据系统响应时间、就绪队列中的进程数目和系统的处理能力等决定。多级反馈队列调度算法
多级反馈队列调度算法是时间片轮转算法和优先级调度算法的综合与发展。通过动态调整进程优先级和时间片的大小,多级反馈队列调度算法可以兼顾多方面的系统目标。例如,为了提高系统吞吐量和缩短平均周转时间而照顾短进程;为了获得较好的I/O设备利用率和缩短响应时间而照顾I/O型进程;同时,也不必实现估计进程的执行时间。
多级反馈队列调度算法的实现思想如下:
(1)设置多个就绪队列,并为各个队列赋予不同的优先级,第一级队列的优先级最高,第二级队列次之,其余队列的优先级逐次降低。
(2)赋予各个队列中进程执行时间片的大小各不相同。在优先级越高的队列中,每个进程的运行时间片越小。例如,第二级队列的时间片要比第一级队列的时间片长一倍…第i+1级队列的时间片要比第i级队列的时间片长一倍。
(3)当一个新的进程进入内存后,首先将它放入第一级队列的末尾,按FCFS原则排队等待调度。当轮到该进程执行时候,如果它能在时间片内完成,便可准备撤离系统;若它在一个时间片结束时尚未完成,调度程序便将该进程转入第二级末尾,再同样按FCFS原则等待调度执行;若它在第二级队列中运行一个时间片后仍未完成,再以同样的方法进入第三级队列…如此下去,当一个长进程从第一级队列一次降到第n级队列后,在第n级队列中便采用时间片轮转方式进行。
(4)仅当第一级队列为空时,调度程序才调度第二级队列中的进程进行;仅当第1到(i-1)级队列均为空,才会调度第i级队列中的进程运行。若处理机正在执行第i级队列中的某个进程,此时又有新的进程进入优先级较高的队列[第1到(i-1)级的任意一级],则此时行进程将抢占正在运行的处理机,即由调度程序把正在运行的进程放回第i级队列末尾,把处理机分配给新到的更高优先级进程。这种调度方法优势如下:
(1)终端型作业用户:短作业优先。
(2)短批处理作业用户:周转时间较短。
(3)长批处理作业用户:经过前面几个队列得到部分执行,不会饿死。
五、例题:
- 根据下表给出的进程调度信息,试用Gantt图(进程调度次序图)描述分别采用FCFS、非抢占式SJF、抢占式SJF调度算法、非抢占式优先权、抢占式优先权及时间片轮转(时间片为1)算法的执行次序,并计算平均周转时间和平均等待时间。(注:优先数越大,优先权越小)
进程 | 到达时刻(秒) | 执行时间(秒) | 优先数 |
---|---|---|---|
P1 | 0 | 10 | 3 |
P2 | 2 | 1 | 1 |
P3 | 4 | 2 | 3 |
P4 | 5 | 1 | 4 |
P5 | 6 | 5 | 2 |
- 解答:
- 平均周转时间和平均等待时间的求解:
进程 | FCFS周转时间 | 抢占式SJF周转时间 | 非抢占式SJF周转时间 | 非抢占式优先级周转时间 | 抢占式优先级周转时间 | 时间片轮转周转时间 |
---|---|---|---|---|---|---|
P1 | 10S | 19S | 10S | 10S | 16S | 19S |
P2 | 9S | 1S | 9S | 9S | 1S | 1S |
P3 | 9S | 3S | 10S | 14S | 14S | 4S |
P4 | 9S | 1S | 7S | 14S | 14S | 2S |
P5 | 13S | 6S | 13S | 10S | 5S | 11S |
平均周转时间 | 8S | 6S | 9.8S | 11.4S | 10S | 7.4S |
提示:根据前面所说的周转时间求解方式和甘特图,用进程到达(提交)的时间减去最终进程完成的时间即可。
进程 | FCFS等待时间 | 抢占式SJF等待时间 | 非抢占式优先级等待时间 | 非抢占式SJF等待时间 | 抢占式优先级等待时间 | 时间片轮转等待时间 |
---|---|---|---|---|---|---|
P1 | 0S | 9S | 0S | 0S | 6S | 9S |
P2 | 8S | 0S | 8S | 8S | 0S | 0S |
P3 | 7S | 1S | 12S | 8S | 12S | 2S |
P4 | 8S | 0S | 13S | 6S | 13S | 1S |
P5 | 8S | 1S | 5S | 8S | 0S | 6S |
平均等待时间 | 6.2S | 2.2SS | 7.6S | 6S | 6.2S | 3.6S |
提示:进程到达(提交)后,只要没有执行完并且没有分配处理机,就是在等待状态,根据甘特图很直观的可以求出各进程的等待时间。
(PS:如有误,欢迎批评指正,不胜感谢!)
进程调度的几种方式与算法简介相关推荐
- 9种深度学习算法简介
导读:从算法处理的流程来划分,基于深度学习的目标检测算法可分为两阶段(Two-Stage)算法和一阶段(One-Stage)算法,两阶段算法需要先进行候选框的筛选,然后判断候选框是否框中了待检测目标, ...
- LSD:一种直线检测算法简介
申明:本文是笔者在阅读了相应的英文文献后,翻译整理所得,原文为:Rafael Grompone von Gioi, LSD: a Line Segment Detector LSD是一种直线检测分割算 ...
- python 执行shellcode_简述获取shellcode的几种方式
原标题:简述获取shellcode的几种方式 0×00 shellcode简介 在攻击中,shellcode是一段用于利用软件漏洞的有效负载,shellcode是16进制的机器码,以其经常让攻击者获得 ...
- spring学习笔记(一)创建对象的四种方式
spring学习笔记(一)创建对象的四种方式 一.简介 Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架. 所谓IoC就是Iversion of Control,控制反 ...
- linux系统怎么拿shell,简述获取shellcode的几种方式
原标题:简述获取shellcode的几种方式 0×00 shellcode简介 在攻击中,shellcode是一段用于利用软件漏洞的有效负载,shellcode是16进制的机器码,以其经常让攻击者获得 ...
- PCA(2):PCA算法实现的两种方式
因为样本个数和特征维度的是不相等de,所以组成的矩阵不是方阵. 第一种方式:特征分解思路(特征值分解要求分解的矩阵是方阵) 基于样本特征维度,先求协方差矩阵---->再特征分解(因为协方差矩阵是 ...
- ML之catboost:基于自定义数据集利用catboost 算法实现回归预测(训练采用CPU和GPU两种方式)
ML之catboost:基于自定义数据集利用catboost 算法实现回归预测(训练采用CPU和GPU两种方式) 目录 基于自定义数据集利用catboost 算法实现回归预测(训练采用CPU和GPU两 ...
- java进程调度怎么画图,[Java教程]进程调度的两种算法JAVA实现
[Java教程]进程调度的两种算法JAVA实现 0 2015-10-21 12:00:08 (SJF分为preemptive shortest job first(抢占式)和non-preemptiv ...
- 机器学习没有捷径,根据机器学习算法地图学习是最有效的一种方式!
<机器学习与应用>由清华大学出版社出版,是机器学习和深度学习领域又一高质量的入门与提高教材.该书系统.深入地讲述了机器学习与深度学习的主要方法与理论,并紧密结合工程实践与应用. https ...
最新文章
- 【数据库】数据库常见操作指令
- 分布式光伏补贴_四川:2020年起工商业分布式光伏已无补贴
- ActiveReports 9实战教程(3): 图文并茂的报表形式
- java数据链表 有什么用_链表(linked list)这一数据结构具体有哪些实际应用?
- redisson的锁的类型_再有人问你分布式锁是什么,就把这个丢给他!
- mysql索引和事务_mysql的索引和事务详细解读
- open and openat
- 计算机硬盘显示在右边,电脑中出现一个系统保留磁盘分区怎么解决
- 北京“宇宙中心”二手房挂单6天11次看房破记录
- 磁盘被写保护怎么解除
- 对话冉小波:NULS三年来的实战心得与反思 |链捕手
- 佑道医生集团获风和资本数千万A轮投资,6个月实现盈亏平衡
- mysql 1032_[MySQL] SQL_ERROR 1032解决办法
- 基于Cycle Spinning的移不变小波去噪
- cv2.warpAffine( )
- 前端基础知识点-每天一个基本知识点(100+个前端小知识,你是否都知道?)
- loopback address 回送地址
- linux root用户被锁定 Account locked due to 217 failed logins
- Python模块——os模块详解
- 规范化(标准化)数据的方法
热门文章
- Java常用类(时间)
- 【mud】item_desc之自定义的函数教程(piggy.c例子解析)
- Luogu P2572 [SCOI2010]序列操作 线段树。。
- css图片如何垂直居中对齐,css怎样让图片和文字垂直居中对齐
- Python库大全汇总
- AndroidAuto连接流程及代码实现
- 黑客,入侵者还是保卫者
- 浪漫烟花html,【2021跨年】最浪漫的烟花程序,送给新的一年的自己!(源码)...
- 如何开启mysql慢查询日志?
- C-木棍游戏 DFS暴力