书中一共描述了七种进程调度算法,为了学到这几种调度算法,后边做了几道练习题。

1. 先来先服务(FCFS)调度算法

先来先服务调度算法是最简单的调度方法。其基本原则是,按照进程进入就绪队列的先后次序进行选择。对于进程调度来说,一旦一个进程得到处理机,它就一直运行下去,直到该进程完成任务或者因等待某事件而不能继续运行,才会让出处理机。先来先服务调度算法属于非剥夺方式。
从表面上看,这个方法对于所有进程都是公平的,并且一个进程的等待时间是可以预先估计的。但是从另一方面来说,这个方法并非公平,因为当一个大进程先到达就绪状态时,就会使许多小进程等待很长时间,增加了进程的平均周转时间,会引起许多小进程用户的不满。
今天,先来先服务调度算法已很少用作主要的调度算法,尤其是分时和实时系统中。但它常被结合在其他的调度算法中使用。例如,在使用优先级作为调度依据的系统中,往往对许多具有相同优先级的进程使用先来先服务的原则。

2. 优先级调度算法

按照进程的优先级高低来进行调度,使高优先级进程优先得到处理机的调度算法称为优先级调度算法。进程的优先级可以由操作系统按一定原则赋予,也可以在操作系统外部安非,甚至可由用户支付高额费用来购买。
但在许多采用优先级调度算法的系统中,通常使用动态优先级。一个进程的优先级不是固定的,可能会随许多因素的变化而变化,例如,进程的等待时间、已使用的处理机时间或其他资源的使用情况。
优先级调度算法又可分为下述两种:
①非剥夺的优先级调度算法。一旦某个高优先级的进程得到处理机,就一直运行下去,直到由于其自身的原因(任务完成或等待事件)而主动让出处理机,才让另一个高优先级进程运行。
②可剥夺的优先级调度算法。任何时刻都严格按照优先级高的进程在处理机上运行的原则进行调度,或者说,在处理机上运行的进程永远是就绪进程队列中优先级最高的进程。在进程运行过程中,一旦有另一个优先级更高的进程出现(如一个高优先级的等待状态进程因事件的到来而成为就绪状态),进程调度程序就迫使原运行进程让出处理机给更高优先级的进程使用,或称为抢占处理机。在UNIX系结中,其讲程调度算法属于“可剥夺的优先级调度算法”。每个进程的优先级都是动态优先级,由系统为各进程每隔一个时间间隔计算一次优先级。

3. 时间片轮转调度算法

时间片轮转调度算法也多用于进程调度。采用此算法的系统,其进程就绪队列往往按进程到达的时间来排序。进程调度程序总是选择就绪队列中的第一个进程,也就是说,按照先来先服务原则进行调度,但进程仅占用处理机一个时间片。在使用完一个时间片后,即使进程还没有完成其运行,它也必须让出(被剥夺)处理机给下一个就绪的进程。而被剥夺的进程返回就绪队列的末尾重新排队,等候再次运行。时间片轮转调度算法特别适合分时系统使用。当多个进程驻留主存时,在进程间转接的开销一般不是很大。
由于时间片值对计算机系统的有效操作影响很大,所以在设计此算法时,应考虑下列问题:时间片值如何选择?它是固定值还是可变值?它对所有用户都相同还是随不同用户而不同?显然,如果时间片值很大,大到一个进程足以完成其全部任务所需的时间,那么此时间片轮转调度算法就退化为先来先服务调度算法了。如果时间片值很小,那么处理机在进程间的切换工作过于频繁,使处理机的开销变得很大,而处理机真正用于运行用户程序的时间将会减少。通常,最佳的时间片值应能使分时用户得到好的响应时间,因此时间片值应大于大多数分时用户的询间时间,即当一个交互进程正在执行时,给它的时间片值相对来说略大些,使它足以产生一个IO请求:或者时间片值略大于大多数进程从计算到IO请求之间的间隔时间。这样可使用户进程工作在最高速度上,并且也减少了进程间切换的不必要的开销,提高了处理机和I/O设备的利用率,同时也能提供较好的响应时间。
各系统的最佳时间片值是不同的,而且随着系统负荷不同而有所变化。关于时间片值的更进一步考虑和时间片轮转调度算法参阅“多级反馈队列调度算法”。
特别要注意的是,时间片是否用完的判定程序是由时钟中断处理程序激活的,因此时间片值必须大于时钟中断间隔。

4. 短进程优先(SPF)调度算法

短进程优先调度算法从进程的就绪队列中挑选那些运行时间(估计时间)最短的进程进入主存运行。这是一个非剥夺算法。它一旦选中某个短进程,就应该保证该进程尽可能快地完成运行并退出系统。这样减少了在就绪队列中等待的进程数,同时也缩短了进程的平均等待时间,提高了系统的吞吐量。但从另一方面来说,各进程的等待时间的变化范围较大,并且进程(尤其是大进程)的等待时间难以预先估计。也就是说,用户对他的进程什么时候完成心里没底。这样,当后续短进程过多时,大进程可能没有机会运行,导致“饿死”。而在先来先服务调度算法中,进程的等待和完成时间是可以预期的。
短进程优先调度算法要求事先能正确地了解一道作业或进程将运行多长时间。但通常一个进程没有这方面可供使用的信息,只能估计。在生产环境中,对于一道类似的作业可以提供大致合理的估计;而在程序开发环境中,用户难以知道他的程序大致将运行多长时间。
正因为此算法明显偏向短进程,而且进程的运行时间是估计的,所以用户可能把他的进程运行时间估计得过短,从而争取优先运行。为此,当一个进程的运行时间超过所估计的时间时,系统将停止这个进程,或对超时部分加价收费。
短进程优先调度算法和先来先服务调度算法都是非剥夺算法,因此均不适用于分时系统,因为不能保证对用户及时响应。

5. 最短剩余时间优先调度算法

最短剩余时间优先调度算法是将短进程优先调度算法用于分时环境的变形。其基本思想是,让“运行到任务完成时所需的运行时间最短”的进程优先得到处理,包括新进入系统的进程。在最短进程优先调度算法中,一个进程一旦得到处理机,就一直运行到任务完成(或等待事件)而不能被剥夺(除非主动让出处理机)。而最短剩余时间优先调度算法允许被一个新进入系统的且其运行时间短于当前运行进程的剩余运行时间的进程所抢占。
该算法的优点是,可以用于分时系统,保证及时响应用户要求。缺点是,系统开销增加。首先,要保存进程的运行情况记录,以比较其剩余时间长短:其次,剥夺本身也要消耗处理机时间。毫无疑问,这个算法使短进程一进入系统就能立即得到服务,从而缩短进程的平均等待时间。

6. 最高响应比优先调度算法

Hansen针对短进程优先调度算法的缺点提出了最高响应比优先调度算法。这是一个非剥夺的算法。按照此算法,每个进程都有一个动态优先数,该优先数不但是要求的服务时间的函数,而且是该进程得到服务所花费的等待时间的函数。进程的动态优先数计算公式如下:
优先数=(等待时间+要求的服务时间)/要求的服务时间
要求的服务时间是分母,所以对短进程是有利的,因为区的优先数高,可优先运行。另外,因为等待时间是分子,所以长进程由于其等待了较长时间,从而提高了其优先致,终于得到了处理机。进程一旦得到处理机,它就一直运行到进程完成任务(或因等待事件而主动让出处理机),中间不被抢占。
可以看出,“等待时间+要求的服务时间”是系统对作业的响应时间,所以在优先数公式中,优先数的值实际上也是响应时间与服务时间的比值,称为响应比。响应比高者得到优先调度。

7. 多级反馈队列调度算法

短进程优先调度算法或最短剩余时间优先调度算法均是在估计的进程运行时间基础上进行调度的,但在程序开发环境或其他情况下,往往难以估计进程的运行时间。这里所研究的算法是时间片轮转调度算法的发展,不必估计进程运行时间。但是本算法仍然基于以下考虑:
①为提高系统吞吐量和缩短进程的平均等待时间而照顺短进程。
②为得到较好的I/O设备利用率和对交互用户的及时响应而照顾I/O型进程。
③在进程运行过程中,按进程运行情况动态地考虑进程的性质(I/O型进程还是处理机型
进程),并且要尽可能快地决定进程当时的运行性质(以I/O为主还是以计算为主),同时进行相应的调度。
具体来说,多级反馈队列的概念如下图所示。系统中有多个进程就绪队列,每个就绪队列对应一个调度级别。第1级队列的优先级最高,以下各级队列的优先级逐次降低。调度时,选择高优先级队列中的第1个就绪进程。


各级队列中的进程具有不同的时间片值。优先级最高的第1级队列中的进程的时间片值最少;题看队列级别的增高,其进程的优先级降低了,但时间片值却增大了。通常,下放一级,其时间片值增大1倍。各级队列均按先来先服务原则排序。
调度方法:当一个新进程进入系统后,它被放入第1级队列的末尾。该队列中的进程按先来先服务原则得到处理机,并使用一个相应于该队列的时间片。假如进程在这个时间片内完成了其全部任务,或因等待事件或/O而主动放弃了处理机,该进程就撤离系统(任务完成)或进入相应的等待队列,从而离开就绪队列。若进程使用完了整个时间片后,其运行任务并未完成(也没有产生V/O请求),仍然要求运行,则该进程被剥夺处理机,同时它被放入下一级队列的末是,当第1级队列为空后,调度程序才去调度第2级队列中的进程。其调度方法同前。当第1、2爱队列全部为空后,才去调度第3级队列中的进程……当前面各级队列全部为空后,才去调度最后第n级队列中的进程。第n级(最低优先级)队列中的进程采用时间片轮转调度算法进行调度。当比运行进程更高级别的队列中到来一个新的进程时,它将抢占处理机,而被抢占的进程回到原队列的末尾。
多级反馈队列的调度操作如上所述,它根据进程运行情况的反馈信息而对队列进行组织并调度进程。但对此调度算法需要说明如下。
①照顾I/O型进程的目的在于充分利用外部设备,以及对终端交互用户及时地予以响应。
为此,通常L/O型进程会进入最高优先级队列,从而能很快得到处理机。另一方面,第1级队列
中进程的时间片值也应大于大多数I/O型进程产生一个I/O请求所需的运行时间。这样,既能
使I/O型进程得到及时处理,也避免了不必要的过多的在进程间转接处理机的操作,以减少系统开销。
②处理机型(计算型)进程由于总是用尽时间片(有些计算型进程一直运行几小时也不会产生一个IO请求),而由最高优先级队列逐次进入低优先级队列。虽然运行优先级降低了,等待时间也较长,但终究会得到较大的时间片值来运行,直至在最低一级队列中轮转。
③在有些分时系统中,一个进程由于IO操作完成而要求重新进入就绪队列,并不是将它
放入最高优先级队列,而是让它进入因I/O请求而离开的原来那一级队列。这就需要对进程所在的队列序号进行记录。这样做的好处是,有些计算型进程偶然产生一次I/O请求,I/O操作完成后仍然需要很长的处理机运行时间,为减少进程的调度次数和系统开销,就不要让它们从最高级队列逐次下移,而是直接放入原来所在队列。
但在一个大的程序中,不同的程序段有不同的运行特点。有时计算多,有时I/O操作多。
也就是说,一个计算型进程有时也可以看成IO型进程,为此在有些系统中,当进程每次由于I/0操作完成而重新进入就绪队列时,就将它放入比原来高一级的就绪队列,这样就能体现出进程由计算型向I/O型变化的状态。

一道练习题


解析
在“可抢占的最高优先级”调度中,任何时刻内核都将处理机分配给当前最高优先级的就绪进程。也就是说,只有当高优先级进程主动放弃CPU时,低优先级进程才有机会运行,并且,一旦高优先级进程需要CPU时,内核就会剥夺低优先级进程的CPU,分配给它使用。

在本例中,由于进程P1和P2在开始执行时,需要进行IO,因此最低优先级的P3得到处理机。但是P3运行了20ms之后被P2(IO已完成)抢占了,P2运行了10S后(还剩10s)被P1抢占了CPU;

P1 P2 P3 从开始到结束所用的时间分别为:90ms 110ms 80ms,总共完成需要110ms。
CPU的使用率:(30 + 20 +10 + 10 )/ 110 = 63.6%
IO1的利用率:(20 + 30 + 40) / 110 = 81.8%
IO2的利用率:(30 + 20 + 10 )/ 110 = 54.5

【操作系统】_7种进程调度算法相关推荐

  1. 操作系统:七种进程调度算法

    前提知识(衡量各个算法时使用其作为指标):TT--周转时间(turn around time) .ATT--平均周转时间(average turn around time) .RT--响应时间(res ...

  2. 操作系统中常用的几种进程调度算法

    1. 先进先出进程调度算法(FIFO) (先来先服务FCFS) 按照进程就绪的先后次序来调度进程. 优点: 实现简单 缺点: 没考虑进程的优先级 2. 短作业(进程)优先调度算法(SJF SPF) 选 ...

  3. 操作系统实验二——进程调度算法(FCFS、RR)

    目录 进程调度算法 FCFS算法代码 RR算法代码 进程调度算法 FCFS算法代码 #include <stdio.h> #include <string.h> #includ ...

  4. Java模拟操作系统实验一:四种进程调度算法实现(FCFS,SJF,RR,HRN)

    前言 刚学完操作系统,模拟实现了其中一些经典的算法,内容比较多,打算写一个系列的总结,将自己的源码都分享出来,既方便自己以后复习,也希望能帮助到一些刚入坑的小伙伴.我的所有代码的运行环境都是基于Ecl ...

  5. 【操作系统】常见进程调度算法特点总结比较

    不同的CPU调度算法具有不同属性,且可能对某些进程更为有利. 为了选择算法以适用于特定情况,必须分析各个算法的属性.为在不同算法之间进行比较,需要一些重要的评价指标,指标如下: CPU使用率:需要使C ...

  6. 五种进程调度算法C++代码实现(FCFS、SJF、Priority、SRTF,Round Robin)

    说明: 1.假设有只两种状态,就绪状态和结束状态.进程的初始状态都为就绪状态. 2.每次运行所设计的处理器调度程序调度进程之前,为每个进程随机生成它的要求运行时间. 3.模拟处理器调度,被选中的进程并 ...

  7. 2.2.4 操作系统之作业/进程调度算法(FCFS先来先服务、SJF短作业优先、HRRN高响应比优先)

    文章目录 0.思维导图 1.先来先服务---FCFS 2.短作业优先---SJF 3.高响应比优先---HRRN 4.三种算法的对比和总结 0.思维导图 1.先来先服务-FCFS First come ...

  8. 进程调度算法——C++实现 [ FCFS,SJF,HPR,HRN + 开源代码 + 详细解析 ]

    ✅ (原创,库存,第100篇博客,纪念一下) 文章目录 零.动态演示图 一.实现原理 二.实现内容: 三.算法流程图: 3.1 先来先服务算法(FCFS)的流程图: 3.2 最短作业优先算法(SJF) ...

  9. 操作系统中常见的进程调度算法

    一.调度与调度算法 调度:操作系统管理了系统的有限资源,当有多个进程(或多个进程发出的请求)要使用这些资源时,因为资源的有限性,必须按照一定的原则选择进程(请求)来占用资源.这就是调度.目的是控制资源 ...

  10. 操作系统之进程调度算法

    操作系统中的进程调度算法进行分析: 1.先来先服务算法(FCFS) 先来先服务算法是按照作业到达的先后次序来进行调度,或者说是优先考虑在系统中等待时间最长的作业,而不管该作业所执行时间的长短,从后备作 ...

最新文章

  1. SQL中JOIN 的用法
  2. layui tab选项卡外部html页面,layui的Tab选项卡知识
  3. python把list转成字典_python中将list转为dict
  4. 如何理解android的函数,通过Android源码理解回调函数
  5. android layout 替换,LayoutInflater 后记--替换系统控件
  6. python中加等是什么意思_Python创建类的时候,加()和不加有什么区别、联系?
  7. [Vue-cli3] is a Vue CLI 3 only command and you are using Vue CLI 2.9.6. You may...
  8. 堆排序(Java语言实现)
  9. 如何在PLSQL上使用Oracle
  10. 百度网盘百度云倍速播放破解
  11. win10远程连接Ubuntu
  12. C# 随机生成名字,电话,图像
  13. 2022年全球与中国磁阻随机存储器(MRAM)市场现状及未来发展趋势
  14. arcmap中将一个面图层中的多个面分割成独立的面
  15. 给toB创业程序员的建议
  16. OpenCV-图像二值化
  17. 学计算机买什么笔记本好点,学设计的用什么笔记本好呢
  18. OpenShift 4 - 在单机版 OpenShift Local 中运行 OpenShift Virtualization(视频)
  19. SQL Server添加MDW性能监控报表
  20. 2021年全球透皮贴剂收入大约6989.7百万美元,预计2028年达到8859.9百万美元

热门文章

  1. java邮件服务器搭建_邮件服务器+javamail(仅包括发送)搭建
  2. 身份证归属地查询接口
  3. java环境变量怎么设置
  4. latex附录中放python代码_LaTeX 里「添加程序代码」的完美解决方案
  5. 在SPSS中将统计表格外观修改为三线表外观的步骤
  6. python 百度ai 牌照识别_Python用百度AI实现文字识别功能!(银行卡,营业执照,等识别)...
  7. 测试驱动开发(TDD)实践与技巧
  8. TP框架的介绍和使用
  9. 美通企业日报 | 药明康德上半年收入大增34%;资讯App今日头条第一微鲤进前八...
  10. Javashop-B2B2C多店铺系统,Javashop B2C开源电商系统下载