进程调度的定义

进程的调度就是操作系统进程管理的一个重要组成部分。

其任务是选择下一个要运行的进程。

那么如何进行选择呢?

要探明这一点,首先需要确定操作系统进程调度的目标是什么。

有了目标,我们就知道选择什么进程最合适了。

操作系统进程调度的目标是什么呢?

这需要对进程使用CPU的模式进行分析。

那么进程在执行时有什么样的模式呢?

一般来说,程序使用CPU的模式有3种:

一种是程序大部分时间在CPU上执行;

另一种是程序大部分时间在进行输入输出;

还有一种是程序介于前两种模式之间。

对于不同性质的程序,调度所要达到的目的也有所不同。

例如,对于I/O导向的程序来说,响应时间非常重要;

而对于CPU导向的程序来说,周转时间(turnaround)就比较重要;

对于平衡型程序来说,进行某种响应和周转之间的平衡就显得重要。

进程调度的目标

需要对进程使用CPU的模式进行分析。

保持CPU繁忙

CPU调度就是要达到极小化平均响应时间、极大化系统吞吐率、保持系统各个功能部件均处于繁忙状态和提供某种貌似公平的机制。

极小化平均响应时间就是要极小化用户发出命令和看到某种结果之间所花费的时间,即减少做一件工作平均等待的时间;

极大化系统吞吐率就是要在单位时间内完成尽可能多的程序,就是单位时间内能完成的工作数量,即整个系统运行效率高;

保持系统各个功能部件繁忙就是要让CPU和输入输出设备均处于忙碌状态。

CPU面前“人人平等”。公平是任何系统都应该努力达到的目标

对于不同的系统来说,在调度目标方面也有一些细微的不同。

例如,

对于批处理系统来说,由于用户并不坐在计算机前面等待结果,响应时间就显得不太重要,但系统吞吐率、CPU利用率和周转时间则很重要。

对于交互式系统来说,由于用户在等待计算机,因此响应时间要很快。但在这里要注意的是适度性(proportionality)。适度性就是响应时间要和期望值相匹配。这里是说你不要超越用户的期望。比如,用户期待1秒钟的响应时间,你就给他1秒钟的响应时间,而不必提供0.1秒钟的响应时间。这是因为,提供超出用户期望的响应会增加系统设计的难度,而又不会提高用户的满意度(对于一个人来说,1秒钟和0.1秒钟的差别并不是很大)。

对于实时系统来说,调度就是要达到在截止时间前完成所应该完成的任务和提供性能可预测性。

调度算法

先来先服务调度算法

先来先到的一个隐含条件就是不能抢占,一个程序一旦启动就一直运行到结束或者受阻塞为止。

例如,现在有两个程序:A需要运行100秒,B需要运行1秒。A程序与B程序几乎同时启动,但B就是慢了一点儿,排在A之后执行,则需要等待100秒。这样A的响应时间为100秒,而B的响应时间则为101秒,从而,平均响应时间100.5秒。那么响应时间非常慢。

就像我们排队办理事情,你要办理的事情只要几分钟就可办好,而你前面的一个人办理的事情因为复杂需要1个小时。这个时候你要等在他后面就十分不高兴。这个时候你就想,要是每个人轮流办理10分钟事务的话,那多好呀。

研究进程调度的人也想到了这一点,而这种轮流办理的调度方式就是时间片轮转。

时间片轮转算法

时间片轮转算法是对FCFS算法的一种改进,其主要目的是改善短程序的响应时间。其方法就是周期性地进行进程切换。例如,每1秒钟进行一次进程轮换。这样,短程序排在长程序后面也可以很快得到执行。因此长程序执行1秒后就得把CPU让出来。这样整个系统的响应时间就得到了改善。

如果选择的时间片过大,时间片轮转将越来越像FCFS,当选择的时间片超过任何一个程序所需要的执行时间长度时,则完全退化为FCFS。而如果选择的时间片过小,则进程切换所用的系统消耗将太多,使得系统的大部分时间花在进程的上下文切换上,而用来真正执行程序的有用时间很少,从而降低系统效率,并造成浪费。

那如何选择一个合适的时间片呢?

时间片选择还需考虑的一个因素是,有多少进程在系统里运行?如果运行的进程多,时间片就需要短一些,不然,用户的交互体验会很差。进程数量少,时间片就可以适当长一些。因此,时间片的选择是一个综合的考虑,需要权衡各方利益,进行适当折中。

短任务优先算法

改善短任务排在长任务后面轮转而造成响应时间和交互体验下降的办法就是短任务优先(Shorted time to Completion First,STCF)算法。

这种算法的核心是所有的程序并不都一样,而是有优先级的区分。具体来说,就是短任务的优先级比长任务的高,而我们总是安排优先级高的程序先运行。

短任务优先算法有两个变种:一种是非抢占,一种是抢占。非抢占短任务优先算法的原理是让已经在CPU上运行的程序执行到结束或阻塞,然后在所有候选的程序中选择需要执行时间最短的进程来执行。抢占式短任务优先算法则是每增加一个新的进程就需要对所有进程(包括正在CPU上运行的进程)进行检查,谁的时间短,就运行谁。

显然,由于短任务优先总是运行需要执行时间最短的程序,因此其系统平均响应时间在目前已经讨论过的几种调度算法里面是最优的。这就是STCF算法的优点。事实上,在所有非抢占调度算法中,STCF算法的响应时间最优。而在所有抢占调度算法中,抢占式STCF算法的响应时间最优。

STCF调度算法也有缺点。

第一是可能造成长程序无法得到CPU时间而导致“饥饿”。

除此之外,还有一个重大缺点,就是我们怎么知道每个进程还需要运转多久

这个时候就需要做研究!我们可以用一些启发式(heuristic)方法来进行估算,例如,根据程序大小来推测一个程序所需CPU执行时间。但这个方法并不可靠。另外一个办法就是先将每个程序运行一遍,记录其所用CPU时间,这样在以后的运行中,即可根据这个实测数据来进行STCF调度了。

优先级调度算法

优先级调度算法的原理是给每个进程赋予一个优先级,每次需要进程切换时,找一个优先级最高的进程进行调度。这样,如果赋予长进程一个高优先级,则该进程就不会再“饥饿”。

事实上,STCF算法本身就是一种优先级调度,只不过它给予短进程高优先级而已。

优先级调度的优点是可以赋予重要的进程以高优先级以确保重要任务能够得到CPU时间。

其缺点则与STCF算法一样,低优先级的进程可能会“饥饿”。

不过,这个问题在优先级调度算法里比在STCF里好解决:只要动态地调节优先级即可。

例如,在一个进程执行特定CPU时间后将其优先级降低一个级别,或者将处于等待进程的优先级提高一个级别。这样,一个进程如果等待时间很长,其优先级将因持续提升而超越其他进程的优先级,从而得到CPU时间。这样,“饥饿”现象就可以防止。

不过,优先级调度还有一个缺点,就是响应时间不能保证,除非将一个进程的优先级设置为最高。即使将优先级设置为最高,但如果每个人都将自己进程的优先级设为最高,则响应时间还是无法保证。

混合调度算法

该算法的原理是将所有进程分成不同的大类,每个大类为一个优先级。如果两个进程处于不同的大类,则处于高优先级大类的进程优先执行;如果两个进程处于同一个大类,则采用时间片轮转来执行。

实时调度算法

实时系统是一种必须提供时序可预测性的系统。

前面的算法主要考虑的是平均响应时间和系统吞吐率的问题,而实时系统则必须考虑每个具体任务的响应时间必须符合要求,即每个任务必须在什么时间之前完成,而无须考虑如何降低整个系统的响应时间或吞吐率。

实时系统调度算法种类繁多,最经典的两种算法:动态优先调度和静态优先级调度。动态优先级调度又称为最早截止任务优先(Earliest Deadline First,EDF)算法,而静态优先级调度又称为最短周期优先(Rate Monotonic Scheduling,RMS)算法。

EDF调度算法

EDF调度算法就是最早截止的任务先做。

如果新的工作来了,比正在运行的程序的截止时间更靠前,那么就抢占当前进程。EDF调度算法是实时调度里面的最优算法。如果一组任务可以被调度的话(指所有任务的截止时间在理论上能够满足),则EDF可以满足。一批任务如果不能全部满足,那么EDF能满足的任务数最多。这就是它最优的体现。

例如,任务A需要15毫秒执行时间,截止时间在进入到系统后第20毫秒,B需要执行10毫秒,截止时间为进入系统后第30毫秒,C需要5毫秒执行时间,截止时间为进入到系统后第10毫秒。使用EDF调度算法的结果就是先运行C,再运行A,最后运行B。

EDF调算算法就是STCF算法变化来的。如果将STCF算法的任务所需执行时间变为截止时间,则抢占式STCF算法就是EDF调度算法。

EDF算法是一种动态调度算法。意思是该算法动态地计算每个任务的截止时间并动态调节优先级。如果需要,还会对当前进程进行抢占。虽然EDF算法在理论上是最优的,但动态计算截止时间和动态抢占CPU均要消耗系统资源,因此EDF算法实际效果比其理论效果要差一截。

RMS调度算法

与EDF算法相对的是所谓的RMS调度算法。该算法在进行调度前先计算出所有任务的优先级,然后按照计算出来的优先级进行调度,任务执行中间既不接收新的进程,也不进行优先级的调整或进行CPU抢占。因此这种算法的优点是系统消耗小,缺点是不灵活。一旦该系统的任务决定了,就不能再接收新的任务。

对于RMS算法来说,一个重要的任务是判断一个任务组能否调度。

 进程调度的过程

在更换进程的时候到底有哪些操作需要完成呢?首先,当然需要将当前进程的状态予以保护,以便将来能够重新执行。然后是将选中的进程的环境布置好,这包括设置寄存器、栈指针、状态字等操作。最后是跳转到选中的进程,也就是设置或恢复其程序计数器。下面给出的是调度进程时操作系统所执行的操作概览:

因时序或外部中断或进程挂起而导致操作系统获得CPU控制权。

操作系统在所有就绪的进程中按照某种算法遴选进程。

如果选中的是非当前进程,则操作系统将当前进程(中断或挂起的进程)状态予以保护。

将选中的进程的环境布置好(设置寄存器、栈指针、状态字等)。

跳转到选中的进程。

mark:

高级议题:调度异常之优先级倒挂

《操作系统之哲学原理第2版》邹恒明

精彩摘抄

?

操作系统高响应比优先调度算法代码_进程调度相关推荐

  1. 高响应比优先算法代码_以梦为码丨让每一行代码都充满温情

    本期热点 智能校园部招聘专场 小海 小海冲鸭 我们一直在打磨的多款产品在上周海亮教育研究院产品发布会上崭露头角,激动!!! 别说话,我在敲代码 发布了哪些呀? 小海冲鸭 iClass.海亮星课堂.模板 ...

  2. c语言链表最高响应比优先,操作系统--最高响应比优先调度算法实验报告..doc

    操作系统--最高响应比优先调度算法实验报告. 进程调度一.实验题目与要求 编写程序完成批处理系统中的作业调度,要求采用响应比高者优先的作业调度算法.实现具体包括:首先确定作业控制块的内容和组成方式:然 ...

  3. 操作系统调度算法--高响应比优先调度算法解析

    高响应比优先调度算法(Highest Response Radio Next,HRRN)是一种对CPU中央控制器响应比的分配的算法.HRRN是介于FCFS(先来先服务算法)与SJF(短作业优先算法)之 ...

  4. 非抢占的高响应比优先调度算法

    模拟操作系统进程调度 算法流程图 测试数据 进程名: A B C D E 需要运行时间: 3 6 4 5 2 5 ProcA 8 3 ProcB 10 6 ProcC 7 4 ProcD 12 5 P ...

  5. 高响应比优先调度算法

    任务描述 本关任务:编写一个高响应比优先调度算法解决一个实际的进程调度问题,并打印出每个进程的完成时间.周转时间和带权周转时间 相关知识 为了完成本关任务,你需要掌握:1.先来先服务调度算法,2.进程 ...

  6. 高响应比优先调度算法 (HRRN)例题

    高响应比优先调度算法(Highest Response Ratio Next)是一种对CPU中央控制器响应比的分配的一种算法.HRRN是介于FCFS(先来先服务算法)与SJF(短作业优先算法)之间的折 ...

  7. 假设有四个作业,它们的提交、运行时间如下表所示。若采用高响应比优先调度算法,试问平均周转时间和平均带权周转时间为多少?

    处理机调度算法 题目: 假设有四个作业,它们的提交.运行时间如下表所示.若采用高响应比优先调度算法,试问平均周转时间和平均带权周转时间为多少? 高响应比优先(HRRN)调度算法 是对FCFS调度算法和 ...

  8. 先来先服务和高响应比优先调度算法C语言实现

    先来先服务和高响应比优先调度算法C语言实现 目录: 1.进程调度与作业调度的区别: 2.单道批处理系统与多道批处理系统的区别: 3.程序设计用到的公式: 4.高响应比优先算法特点: 5.源代码示例: ...

  9. 《操作系统》实验三:高响应比优先调度和时间片轮转RR进程调度算法

    [实验题目]:高响应比优先调度和时间片轮转RR进程调度算法 [实验学时]:4学时 [实验目的] 通过这次实验,加深对进程调度概念的理解,进一步掌握比FCFS和SJF更为复杂的进程调度算法的实现方法. ...

最新文章

  1. 我的博客博客之路....
  2. 第一代计算机到第四代计算机基本知识,[Ch01_计算机系统基本知识.ppt
  3. h5 video全屏播放
  4. Hash魔法:分布式哈希算法
  5. php主页显示商品预览图代码,在ECSHOP留言板页面显示商品缩略图方法
  6. 在recovery模式下命令控制手机_安卓手机开机密码忘记,解锁教程
  7. mysql如何用sql增加字段和注释?
  8. MathType与Office公式编辑器的差异
  9. 【转】TabHost详解
  10. 《31天成为IT服务达人》之技能篇中的磁带库
  11. Android 模块化开发
  12. Scrapy-spiders下项目运行方法
  13. ACM、OI、IOI编程竞赛模式介绍
  14. 南大软院大神养成计划--CSS网页布局
  15. navcat导入mdf数据库文件教程
  16. SP许可证延期需要的东西
  17. Python基础笔记——函数
  18. 测绘程序设计实习 CSU
  19. 服务器内存与CPU的搭配
  20. 【程序小白养成计划】编程入门指北--编程小白常见问题QA

热门文章

  1. 即学即会 Serverless | 初识 Serverless 架构
  2. linux运行完脚本 命令失效,linux – Systemd退出bash脚本,执行导致失败的命令,而不是继续...
  3. 云风:不加班、不炫技,把复杂的问题简单化
  4. GO、Rust 这些新一代高并发编程语言为何都极其讨厌共享内存?
  5. 腾讯《王者荣耀》禁止未满12周岁用户充值;B站发布16款新品游戏;华为注册姚安娜商标被驳回|极客头条...
  6. 「CSDN 2020年度博客之星」总榜单在此揭晓
  7. 2020年CSDN最后一波上车机会,快来~~
  8. 80%程序员不知道的职场秘诀,升职加薪不是梦
  9. 你一直想学的 RocketMQ,原来这样学才最省时省力
  10. 玩转 SpringBoot2.x 之缓存对象 | 原力计划