进程调度算法

操作系统有三大调度机制,分别是进程调度、内存页面置换和磁盘调度算法。

进程调度算法

定义

进程调度算法也称 CPU 调度算法,毕竟进程是由 CPU 调度的,当 CPU 空闲时,操作系统就选择内存中的某个「就绪状态」的进程,并给其分配 CPU。

进程的状态

在一个进程的活动期间至少具备三种基本状态,即运行状态、就绪状态、阻塞状态。为什么说至少呢?当然,进程还有另外两个基本状态:创建状态和结束状态。

  1. 创建状态( new):进程正在被创建;
  2. 就绪状态( Ready):可运行,由于其他进程处于运行状态而暂时停止运行;
  3. 运行状态( Running):该时刻进程占用 CPU;
  4. 阻塞状态( Blocked):该进程正在等待某一事件发生(如等待输入/输出操作的完成)而暂时停止运行,这时,即使给它CPU控制权,它也无法运行;
  5. 结束状态( Exit):进程正在从系统中消失时的状态;

进程调度算法

状态转移过程:

  • NULL -> 创建状态:创建一个新进程的初始状态;
  • 创建状态 -> 就绪状态:当进程被创建完成并初始化后,一切就绪准备运行时,变为就绪状态,进入就绪队列,等待被CPU调度。
  • 就绪状态 -> 运行状态:处于就绪队列中的进程被操作系统的进程调度器选中后,就分配给 CPU, 正式运行该进程;
  • 运行状态 -> 结束状态:当进程已经运行完成或出错时,会被操作系统作结束状态处理,操作系统得从就绪队列选择另外一个进程运行;
  • 运行状态 -> 就绪状态:处于运行状态的进程在运行过程中,由于分配给它运行的时间片用完了,操作系统会把该进程变为就绪态,接着从就绪态选中另外一个进程运行;
  • 运行状态 -> 阻塞状态:当进程请求某个事件且必须等待时,例如请求 I/O 事件,此时操作系统必须选择另外一个进程运行;
  • 阻塞状态 -> 就绪状态:当进程要等待的事件完成时,它从阻塞状态变到就绪状态;

在虚拟内存管理的操作系统中,通常会把 阻塞状态的进程的物理内存空间换出到硬盘,等需要再次运行的时候,再从硬盘换入到物理内存。这么做,可以使得阻塞状态的进程不会暂用物理内存空间,毕竟物理内存空间是有限的,被阻塞状态的进程占用着物理内存是一种浪费物理内存的行为。

此外,进程还有一个状态来 描述进程没有占用实际的物理内存空间:挂起状态,该状态又可细分为两种:

  • 阻塞挂起状态:进程在外存(硬盘)并等待某个事件的出现;
  • 就绪挂起状态:进程在外存(硬盘),但只要进入内存,立刻运行;

导致进程挂起的原因不只是因为进程所使用的内存空间不在物理内存,还包括如下情况:

  • 通过 sleep 让进程间歇性挂起,其工作原理是设置一个定时器,到期后唤醒进程。
  • 用户希望挂起一个程序的执行,比如在 Linux 中用 Ctrl+Z 挂起进程;

什么叫调度

选择一个进程占用着 CPU 在运行,称为调度。

什么时候会调度

在进程的生命周期中,当进程从一个运行状态切换为另一状态时,就会触发一次调度。

比如以下几种状态转换时会触发 CPU 调度:

  • 就绪状态 -> 运行状态:当进程被创建时,会进入到就绪队列,操作系统会从就绪队列选择一个进程运行;
  • 运行状态 -> 结束状态:当进程正常运行完成或异常出错时,会被操作系统作结束状态处理,操作系统得从就绪队列选择另外一个进程运行;
  • 运行状态 -> 阻塞状态:当进程请求某个事件且必须等待时,例如请求 I/O 事件,此时操作系统必须选择另外一个进程运行;

调度算法分类

  • 抢占式调度算法(正在运行时可被打断)
  • 从就绪队列中挑选一个进程,然后让该进程只运行一段时间,如果在该时间段结束时,该进程还没执行完,则会把它挂起,接着调度程序从就绪队列挑选另外一个进程。
  • 抢占式调度处理,需要在时间间隔的末端发生 时钟中断,以便把 CPU 控制返回给调度程序进行调度,也就是常说的 时间片机制
  • 非抢占式调度算法
  • 从就绪队列中挑选一个进程,然后让该进程一直运行,直到该进程 运行结束被阻塞,才会调用另外一个进程,这种没有时钟中断。

常见调度算法有哪些

1️⃣ 先来先服务(FCFS)

最简单的调度算法,就是 非抢占式的先来先服务( First Come First Severd, FCFS)算法了。

先来后到, 每次从就绪队列选择最先进入队列的进程,然后一直运行,直到进程退出或被阻塞,才会继续从队列中选择第一个进程接着运行

缺陷

FCFS 对长作业/进程有利,适用于 CPU 繁忙型作业的系统,而不适用于 I/O 繁忙型作业的系统。

若进程是CPU繁忙型,则一旦占有CPU,就可能会运行很长时间,因此CPU繁忙型作业类似于长作业,FCFS算法对长作业/进程有利;
而对于I/O繁忙型进程作业,运行进程中要频繁访问I/O端口,即可能频繁放弃CPU,所以占用CPU的时间不会太长,一旦放弃CPU,则必须等待下次调度,因此FCFS算法不利于它。

看个例子(王道):

进程调度算法

2️⃣ 最短作业优先(SJF)

最短作业优先( Shortest Job First, SJF),它会 优先选择运行时间最短的进程来运行,这有助于提高系统的吞吐量。

SJF是非抢占式的算法。但也有个抢占式的版本:最短剩余时间优先( Shortest Remaining Time Next, SRTN)。

缺陷

对长作业不利,很容易造成一种极端现象,如果源源不断地有短作业进程到来,可能会使得长作业进程长时间得不到服务,产生饥饿。

比如,一个 长作业/进程 在就绪队列等待运行,而这个就绪队列有非常多的短作业,那么就会使得长作业不断的往后推,周转时间变长,致使 长作业进程 长期不会被运行(长作业进程饥饿)。

看个例子(王道):
短作业优先

进程调度算法

最短剩余时间优先

进程调度算法

3️⃣ 高响应比优先(HRRN)

非抢占式的高响应比优先 ( Highest Response Ratio Next, HRRN)算法主要是权衡了短作业和长作业。

每次进行进程调度时,先计算「响应比优先级」,然后运行「响应比优先级」最高的进程,响应比优先级计算公式如下:

[响应比优先级 = \frac{等待时间 + 要求服务时间}{要求服务时间} ]

要求服务时间就是运行时间,一个任务的要求服务时间一般是固定的,而等待时间动态变化,等于从进入就绪队列到被CPU调度这段时间

公式分析:
等待时间相同时,要求服务时间越短,优先级越高,短作业进程容易被选中运行;
要求服务时间相同时,等待时间越长,优先级越高,兼顾了长作业进程,避免长作业进程饥饿的问题;

看个例子(王道):

进程调度算法

4️⃣ 时间片轮询(RR)

使用最广的算法就是时间片轮转( Round Robin, RR)了。

每个进程被分配一个时间段,称为时间片( Quantum ),即允许该进程在该时间段中运行

  • 如果时间片用完,进程还在运行,那么将会把此进程挂起,并把 CPU 分配另外一个进程(从就绪队列选);
  • 如果该进程在时间片结束前阻塞或结束,则 CPU 立即切换到下一个进程;

缺陷

1)如果时间片设置太短会导致频繁地发生进程上下文切换,降低了 CPU 效率;

2)如果设置太长,可能引起对短作业进程的响应时间变长,一般时间片设为 20ms~50ms 是一个比较合理的折中值。

5️⃣ 最高优先级调度(HPF)

每次 CPU 调度时都是 从就绪队列中选择最高优先级的进程运行,称为最高优先级( Highest Priority First,HPF)调度算法。

该算法也有两种处理优先级高的方法:

  • 抢占式:当就绪队列中出现优先级高的进程,当前进程挂起,调度优先级高的进程运行;
  • 非抢占式:当就绪队列中出现优先级高的进程,运行完当前进程,再选择优先级高的进程;

缺陷

可能会导致低优先级的进程永远不会运行。

6️⃣ 多级反馈队列(MFQ)

进程调度算法

多级反馈队列( Multilevel Feedback Queue )调度算法是「时间片轮转算法」和「最高优先级算法」的综合和发展。

「多级」表示有多个就绪队列,每个队列优先级从高到低,同时优先级越高时间片越短;

「反馈」表示如果有新的进程加入优先级高的就绪队列时,立刻停止当前正在运行的进程,转而去运行优先级高的队列;

工作方式(⚠⚠⚠)

  • 设置多个就绪队列,每个队列有着不同优先级,每个队列按优先级从高到低排列,同时 优先级越高的队列设置的时间片越短
  • 每次新的进程会被放入到第一级队列(优先级最高)的末尾,按先来先服务的原则排队等待被调度,如果某个进程在第一级队列设置的时间片内没运行完,则将其转入到第二级队列的末尾,以此类推,直至完成;
  • 当较高优先级的队列为空,才调度较低优先级的队列中的进程运行。如果进程运行时,有新进程进入较高优先级的队列(如就绪队列3),则停止当前运行的进程(如就绪队列5)并将其移入到原队列末尾,接着让较高优先级的进程运行;

优点

1)对于短作业可以在第一级队列很快被处理完;

2)对于长作业,如果在第一级队列处理不完,可以移入下级队列等待被执行;

3)该算法很好的 兼顾了长短作业,同时有较好的响应时间

小结

进程调度算法

参考

https://xiaolincoding.com/os/#小白适合看吗

https://blog.csdn.net/zh13487/article/details/83928284

https://www.bilibili.com/video/BV1YE411D7nH

Original: https://www.cnblogs.com/afei688/p/16608312.html
Author: 阿飞的客栈
Title: 进程调度算法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/644197/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 快速排序?

    <span>function <span>quickSort (arr) {<br> <span>if (arr.length &l…

    技术杂谈 2023年5月31日
    096
  • Git常用命令

    克隆拉取远程代码 git clone https://xxxxxxxxx 本地添加远程仓库地址 git remote add origin(设定名字,随意。不过一般都叫这个名字) …

    技术杂谈 2023年6月21日
    067
  • 从输入URL到页面加载完成的过程中都发生了什么事情?

    当你在浏览器中输入URL并敲回车之后,浏览器会把URL分成几部分: 1、协议:从计算机获取资源的方式,常见的HTTP、FTP等 2、网络地址:域名或者IP,指示网络中的哪一台计算机…

    技术杂谈 2023年5月31日
    083
  • django Middleware

    Middleware简介 Middleware是一个轻量级的,全局性质的Django请求/响应处理钩子框架。所谓钩子框架是指在request请求到达Django之后,views视图…

    技术杂谈 2023年7月10日
    057
  • 【干货】整理分布式技术框架常用的算法及策略

    将一些零散的知识点进行整理, 以便加深理解,方便查阅,也希望能帮到大家。 通过系统随机函数,根据后端服务器列表的大小值来随机选择其中一台进行访问。由概率统计理论可以得知,随着调用量…

    技术杂谈 2023年6月1日
    084
  • 【转】apache配置多个http端口

    apache配置多个http端口方法一:使用httpd-vhosts进入apache配置目录,如/usr/local/apache/conf/打开httpd.conf配置多个监听窗…

    技术杂谈 2023年6月1日
    074
  • 【前端干货】别再羡慕别人的Excel啦,教你点击按钮直接打开侧边栏!

    负责技术支持的葡萄又来啦。 三日不见,我们的客户又为我们发来新的问题。 这次我们需要实现的场景是在前端表格环境中,像模板按钮那样,点击之后弹出一个侧边栏,然后通过点击不同的单元格显…

    技术杂谈 2023年5月30日
    0109
  • vue路由守卫用于登录验证权限拦截

    vue路由守卫用于登录验证权限拦截 to:进入到哪个路由去 from:从哪个路由离开 next:路由的控制参数,常用的有next(true)和next(false) home需要判…

    技术杂谈 2023年7月11日
    089
  • 我的极客时间专栏结课了!!!

    我的极客时间专栏结课了!!! 我的极客时间专栏结课了!!!太TMD不容易了。 今天下班到家的时候,收到了一份包裹,里面是极客时间送的结课礼物。是的,我的《手把手带你写一个web框架…

    技术杂谈 2023年6月1日
    075
  • 在用户环境程序莫名闪退,连个渣都不留,但在开发环境正常

    编译完成的执行文件在用户电脑上安装之后,启动竟然闪退,也没有做日志打印,这可有点难定位还好在开发环境没问题,对比安装路径与开发环境路径下文件比对,发现是很多dll文件不一致。最后定…

    技术杂谈 2023年7月11日
    0123
  • 20211202完全对称日,我们一起来温习一下

    大家好,今天我们来聊一聊最长回文子串这个问题。 前几天,有个校招的小伙伴问到了这个问题。今天,我们就来分析一下。 最长回文子串不论是在校招还是社招中都是各大厂出现频率比较高的题目。…

    技术杂谈 2023年7月24日
    090
  • crash命令 —— foreach

    参考:https://crash-utility.github.io/help_pages/foreach.html 用法: 在所有的进程上执行命令 这里的命令支持如下: 命令 可…

    技术杂谈 2023年5月30日
    099
  • Javaweb学习-HTML

    ; ; 重新开始HTML,之前学的都忘了 posted @2022-03-24 21:27 HelloHui 阅读(7 ) 评论() 编辑 Original: https://ww…

    技术杂谈 2023年6月21日
    089
  • nmake

    http://t.zoukankan.com/liangxiaofeng-p-3247968.html Original: https://www.cnblogs.com/hshy…

    技术杂谈 2023年5月31日
    093
  • python库安装中Microsoft Visual C++ is required解决方法

    在用pycharm过程中,用pip去安装一些第三方包的时候会出现如下错误,缺少C++编译器,因为有些程序需要使用,没有C++接口会报错,查阅相关资料及自己的解决方案 error: …

    技术杂谈 2023年7月25日
    086
  • 双缓冲绘图

    双缓冲绘图 大家小时候都玩过飞机大战吧,当我们在玩这种飞行射击类游戏时,背景图总是不断地向下移动的,从而给我们营造出一种飞机正在向前飞行的游戏体验。那么,图片的快速变化是如何实现的…

    技术杂谈 2023年7月23日
    082
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球