(学习笔记-进程管理)进程调度

进程都希望自己能够占用CPU进行工作,那么这涉及到前面说过的进程上下文切换。

一旦操作系统把进程切换到运行状态,也就意味着该进程占用着CPU在执行,但是操作系统把进程切换到其他状态的时候,就不能在CPU中执行了,于是操作系统会选择下一个要运行的进程。

选择一个进程运行这一功能是在操作系统中完成的,通常称为调度程序(scheduler)


调度时机

在进程的生命周期中,当进程从一个运行状态到另一个状态变化的时候,其实就会触发一次调度。

比如:

  • 就绪态 -> 运行态:当进程被创建的时候,会进入到就绪队列,操作系统会从就绪队列选择一个进程运行
  • 运行态 -> 阻塞态:当进程发生I/O事件而阻塞时,操作系统必须选择另外一个进程运行
  • 运行态 ->结束态:当进程退出结束后,操作系统得从就绪队列选择另外一个进程运行

因为,这些状态变化的时候,操作系统是需要考虑是否要让新的进程给CPU运行,或者是否让当前进程从CPU上退出来而换到另一个进程运行。

另外如果硬件时钟提供某个频率的周期性中断,那么可以根据如何处理时钟中断,把调度算法分为两类:

  • 非抢占式调度算法挑选一个进程,然后让该进程运行直到被阻塞,或者直到该进程退出,才会调用另一个进程,也就是说不会管时钟中断这个事情
  • 抢占式调度算法挑选一个进程,然后让该进程只允许某段时间,如果在该时间段结束时,该进程仍然在运行,则会将其挂起,接着调度程序从就绪队列中挑选另外一个进程。这种抢占式调度处理,需要在时间间隔的末端发生时钟中断,以便把CPU控制返回给调度程序进行调度,也就是时间片机制

调度原则

原则一:如果运行的程序发生了I/O事件的请求,那么CPU使用率肯定很低,因为此时进程在阻塞等待硬盘的数据返回。这样的过程势必会造成CPU突然的空闲。所以,为了提高CPU利用率,在这种发送I/O事件致使CPU空闲的情况下,调度程序需要从就绪队列中选择一个进程来运行

原则二:有的程序执行某个任务花费的时间会比较长,如果这个程序一直占用着CPU,会造成系统吞吐量(CPU单位时间内完成的进程数量)的降低。所以,要提高系统的吞吐率,调度程序要权衡长任务和短任务进程的运行完成数量

原则三:从进程开始到结束的过程中,实际上是包含两个时间,分别是进程运行时间和进程等待时间,这两个时间总和就称为周转时间。进程的周转时间越小越好,如果进程的等待时间很长而运行的时间很短,那周转时间就很长,这不是我们所希望的,调度程序应该避免这种情况发生。

原则四:处于就绪队列的进程,也不能等太久,当然希望这个等待的时间越短越好,这样可以使得进程更快的在CPU中执行。所以,就绪队列中进程的等待时间也是调度程序所需要考虑的原则

原则五:对于鼠标、键盘这种交互式比较强的应用,我们当然希望它的响应时间越快越好,否则就会影响用户体验。所以,对于交互式比较强的应用,响应时间也是调度程序需要考虑的原则

 针对上面的五种调度原则,总结成如下:

  • CPU利用率:调度程序应确保CPU是始终匆忙的状态,这可以提高CPU的利用率
  • 系统吞吐量:吞吐量表示的是单位时间内CPU完成进程的数量,长时间的进程会占用较长的CPU资源,因此会降低吞吐量,相反,短作业的进程会提升系统吞吐量
  • 周转时间:周转时间是进程运行 + 阻塞时间 + 等待时间的总和,一个进程的周转时间越小越好
  • 等待时间:这个等待时间不是阻塞状态的时间,而是进程处于就绪队列的时间,等待时间越长,用户越不满意
  • 响应时间:用户提交请求到系统第一次产生响应所花费的时间,在交互式系统中,响应时间是衡量调度算法好坏的主要标准。

调度算法

不同的调度算法适用的场景也是不同的。

单核CPU系统中常见的调度算法:
 

先来先服务调度算法

最简单的一个调度算法,就是非抢占式的先来先服务算法(FCFS)

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

这似乎很合理,但是当一个作业先运行了,那么后面的短作业等待的时间就会很长,不利于短作业。

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

最短作业优先调度算法

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

 这显然对长作业不利,很容易造成一种极端现象。

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

高响应比优先调度算法

前面的 [先来先服务调度算法] 和 [最短作业优先调度算法] 都没有很好的权衡短作业和长作业。

那么,高响应比优先(HRRN)调度算法主要是权衡了短作业和长作业。

每次进行进程调度时,先计算 [响应比优先级] ,然后把 [响应比优先级]最高的进程投入运行, [响应比优先级]的计算公式:

从上面的公式可以发现:

  •  如果两个进程的 [等待时间] 相同, [要求的服务时间] 越短,[响应比] 就越高,这样短作业的进程容易被选中运行
  • 如果两个进程 [要求的服务时间] 相同时, [等待时间] 越长,[响应比] 就越高,这就兼顾到了长作业的进程,因为进程的响应比可以随时间等待的增加而提高,当其等待时间足够长时,其响应比便可以升到很高,从而获得运行的机会;

但是进程要求的服务时间是不可知的,所以高响应比优先调度算法是理想型的调度算法,现实中是实现不了的。

时间片轮转调度算法

最古老,最简单,最公平且最广泛的算法就是时间片轮转(RR)调度算法。

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

  • 如果时间片用完,进程还在运行,那么将会把此进程从CPU释放出来,并把CPU分配给另外一个进程
  • 如果该进程在时间片结束前阻塞或结束,则CPU立即进行切换

另外,时间片的长度就是一个很关键的点:

  • 如果时间片设的太短会导致过多的进程上下文切换,降低了CPU效率
  • 如果设的太长了又可能引起对短作业进程的响应时间变长

一般来说,时间片设为 20ms~50ms 通常是一个比较合理的折中值

最高优先级调度算法

前面的 [时间片轮转算法] 做了个假设,即让所有的进程同等重要,大家的运行时间都是一样。

但是,对于用户计算机系统,它们希望调度是有优先级的,即希望调度程序能从就绪队列中选择最高优先级的进程进行运行,这称为最高优先级(HPF)算法

进程的优先级可以分为,静态优先级和动态优先级:

  • 静态优先级:创建进程的时候,就已经确定了,然后整个运行时间优先级都不会变化
  • 动态优先级:根据进程的动态变化调整优先级,比如如果进程运行时间增加,则降低其优先级,如果进程等待时间(就绪队列的等待时间)增加,则升高其优先级,也就是随着时间的推移增加等待进程的优先级

该算法也有两种处理优先级的方法,非抢占式和抢占式:

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

但是依然有缺点,可能会导致低优先级的进程永远不会运行。

多级反馈队列调度算法

多级反馈队列(MFQ)调度算法是 [时间片轮转算法] 和 [最高优先级算法] 的综合和发展。

  •  [多级] 表示有多个队列,每个队列的优先级从高到低,同时优先级越高时间片越短
  •  [反馈] 表示如果有新的进程加入优先级高的队列时,立刻停止当前正在运行的进程,转而去运行优先级高的队列

 工作方式:

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

可以发现,对于短作业可能可以在第一级队列很快被处理完成。对于长作业,如果在第一级队列处理不完,可以移入下次队列等待被执行,虽然等待时间变长了,但是运行时间也变长了,所以该算法很好的兼顾了长短作业,同时有较好的响应时间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/66855.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python-OpenCV中的图像处理-物体跟踪

Python-OpenCV中的图像处理-物体跟踪 物体跟踪 物体跟踪 现在我们知道怎样将一幅图像从 BGR 转换到 HSV 了,我们可以利用这一点来提取带有某个特定颜色的物体。在 HSV 颜色空间中要比在 BGR 空间中更容易表示一个特定颜色。在我们的程序中,我们要提取的…

机器学习笔记之优化算法(十一)梯度下降法:凸函数VS强凸函数

机器学习笔记之优化算法——梯度下降法:凸函数VS强凸函数 引言凸函数:凸函数的定义与判定条件凸函数的一阶条件凸函数的梯度单调性凸函数的二阶条件 强凸函数强凸函数的定义强凸函数的判定条件强凸函数的一阶条件强凸函数的梯度单调性强突函数的二阶条件…

postman如何添加token

参考博客:https://blog.csdn.net/Mrbignose/article/details/107237581 1.添加token: 2.设置token: 3.发送时携带token:

爬虫程序中使用爬虫ip的优势

作为一名爬虫技术员,我发现在爬虫程序中使用代理IP可以提升爬取效率和匿名性。今天,我就来详细讲解一下代理IP在爬虫程序中的工作原理及应用。 首先,我们来了解一下代理IP在爬虫程序中的工作原理。当我们使用爬虫程序进行数据采集时&#xf…

AIGC:【LLM(五)】——Faiss:高效的大规模相似度检索库

文章目录 一.简介1.1 什么是Faiss1.2 Faiss的安装 二.Faiss检索流程2.1 构建向量库2.2 构建索引2.3 top-k检索 三.Faiss构建索引的多种方式3.1 Flat :暴力检索3.2 IVFx Flat :倒排暴力检索3.3 IVFxPQy 倒排乘积量化3.4 LSH 局部敏感哈希3.5 HNSWx 一.简介…

objectMapper.getTypeFactory().constructParametricType 方法的作用和使用

在使用 Jackson 库进行 JSON 数据的序列化和反序列化时,经常会使用到 ObjectMapper 类。其中,objectMapper.getTypeFactory().constructParametricType 方法用于构造泛型类型。 具体作用和使用如下: 作用: 构造泛型类型&#x…

分支和循环语句(2)(C语言)

目录 do...while()循环 do语句的语法 do语句的特点 do while循环中的break和continue 练习 goto语句 do...while()循环 do语句的语法 do 循环语句; while(表达式); do语句的特点 循环至少执行一次,使用的场景有限,所以不是经常使用。 #inc…

stm32 cubemx can通讯(1)回环模式

文章目录 前言一、cubemx配置二、代码1.过滤器的配置(后续会介绍)2.main.c3.主循环 总结 前言 介绍使用stm32cubemx来配置can,本节讲解一个简答,不需要stm32的can和外部连接,直接可以用于验证的回环模式。 所谓回环模…

Day 19 C++ 文件操作

C 文件操作 文件为什么要使用文件文件类型文本文件 - 文件以文本的ASCII码形式存储在计算机中二进制文件 - 文件以文本的二进制形式存储在计算机中 操作类型ofstream:写操作ifstream: 读操作fstream : 读写操作 文本文件写文件引入头文件 \&l…

排序(快速排序,归并排序,插入排序,选择排序,冒泡排序,希尔排序,堆排序)

给定你一个长度为 n 的整数数列。 请你对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。 输入格式 输入共两行,第一行包含整数 n 。 第二行包含 n 个整数(所有整数均在 1∼109 范围内),表示整个数列。 输…

消息队列比较

、ActiveMQ 优点:单机吞吐量万级,时效性ms级,可用性高,基于主从架构实现高可用性,消息可靠性较低的概率丢失数据。 缺点:官方社区现在对ActiveMQ5.X维护越来越少了,高吞吐量场景较少使用。 2、K…

Linux小型操作系统项目,《操作系统真象还原》第三章——完善MBR

前引 上一章我们完成了MBR的雏形编写,但是只打印了几个字符,这一章我们才要真正地去完成MBR的功能。 在完成MBR的功能之前我们要先了解一些知识,首先介绍什么是实模式。 书上的内容实在繁杂,简单地说,实模式没有虚拟和…

VR内容定制 | VR内容中控管理平台可以带来哪些价值?

随着科技的不断发展,虚拟现实(VR)技术已经逐渐渗透到各个领域,其中教育领域也不例外。通过VR技术,学生可以身临其境地参与到各种场景中,获得更加直观、生动的学习体验。为了让教师更好地进行VR教学的设计和管理,提高教…

jmeter测试rpc接口-使用dubbo框架调用【杭州多测师_王sir】

1.基于SOAP架构。基于XML规范。基于WebService协议。特点:接口地址?wsdl结尾2.基于RPC架构,基于dubbo协议,thrift协议。SpringCloud微服务。3.基于RestFul架构,基于json规范。基于http协议(我们常用的都是这种,cms平台也是) Rest…

iOS开发-JsonModel的学习及使用

IOS JsonModel的学习及使用 当我们从服务端获取到json数据后的时候,我们需要在界面上展示或者保存起来,下面来看下直接通过NSDictionary取出数据的情况。 NSDictionary直接取出数据的诟病。 NSString *name [self.responseObj objectForKey:"nam…

Flink源码之JobManager启动流程

从启动命令flink-daemon.sh中可以看出StandaloneSession入口类为org.apache.flink.runtime.entrypoint.StandaloneSessionClusterEntrypoint, 从该类的main方法会进入ClusterEntrypoint::runCluster中, 该方法中会创建出主要服务和组件。 StandaloneSessionClusterEntrypoint:…

Maven进阶1 -- 分模块开发、依赖管理、聚合与继承、属性、版本管理、多环境开发、跳过测试

目录 1.分模块开发 将原始模块按照功能拆分成若干个子模块&#xff0c;方便模块间的相互调用&#xff0c;接口共享。 案例&#xff1a;拆分一下这个SSM整合案例 ①创建maven模块 demo项目下的pom.xml文件&#xff08;主要看一下依赖&#xff09; <dependencies><!…

黑马头条项目学习--Day2: app端文章查看,静态化freemarker,分布式文件系统minIO

app端文章 Day02: app端文章查看&#xff0c;静态化freemarker,分布式文件系统minIOa. app端文章列表查询1) 需求分析2) 实现思路 b. app端文章详细1) 需求分析2) Freemarker概述a) 基础语法种类b) 集合指令&#xff08;List和Map&#xff09;c) if指令d) 运算符e) 空值处理f) …

GIS在地质灾害危险性评估与灾后重建中的应用教程

详情点击链接&#xff1a;GIS在地质灾害危险性评估与灾后重建中的实践技术应用 前言 地质灾害是指全球地壳自然地质演化过程中&#xff0c;由于地球内动力、外动力或者人为地质动力作用下导致的自然地质和人类的自然灾害突发事件。由于降水、地震等自然作用下&#xff0c;地质…

《合成孔径雷达成像算法与实现》Figure3.7

代码复现如下&#xff1a; clc clear all close all%参数设置 TBP 100; %时间带宽积 T 10e-6; %脉冲持续时间%参数计算 B TBP/T; …
最新文章