进程的调度(超详细解读)

news2024/11/25 14:21:58

在特别老的操作系统中,进程的调度是根据FIFO调度算法进行调度,先进先出式的调度,其实就是队列,但是不能很好的体现进程的优先级,在上节讲解的进程优先级,知道nice值范围是[-20,19],然后创建一个进程默认优先级为80,所以真实的优先级范围是[60,99]。如果使用FIFO调度算法不能体现出进程优先级,虽然可以根据优先级队列插队,但是插队就会面临遍历,一旦遍历,时间复杂度就会大于O(1)。而且调度是一个非常频繁的过程,所以不可能让他的时间复杂度大于O(1)。

Linux中真实的调度算法(Linux内核O(1)调度算法)

实际上Linux操作系统为了体现优先级,他首先在自己的结构中有一个哈希,简单的说也就是数组,他的大小为140个元素,这个数组的类型是struct task_struct *(名)[140],每个元素类型为 task_struct *  。前一百个元素是给实时进程分配的,还剩四十个。

在上节说到进程的nice值范围刚好也是四十个数,刚好就对应了这剩下的四十个位置。为什么是四十个数,就是因为哈希表设置的大小是四十位。不能太多太多就影响公平性。

这是如果来了一个进程,他的优先级为61,这是我们根据算法:pir-statpir(60)+100。然后就可以确定该进程的位置,把该进程就可以挂在对应位置,因为上面说了元素类型为 task_struct *  ,如果又来了一个相同优先级的进程,就挂在他后面,相同优先级的挂在一切,优先级较小的就挂在数组靠后位置,这样做法时间复杂度就是O(1)。

调度他们的时候,就是从60位置开始往后依次找,如果该队列为空就往下找,不为空就取出调度。这样从前往后找,就是根据优先级来查找。

每一个CPU都有自己的运行队列,而这个队列中有两个这个哈希表。queue[140]。

根据上图,得出下面关系:

nr_active表示有多少个有效进程bitmap[5]是一个位图

active指向第一个数组位置,expired指向第二个数组位置。

1.CPU只会从active指向的数组中选择进程进行调度,时间片到了就选择下一个进程。CPU首先在runqueue中找到active,然后直接访问哈希表,从上往下进行扫描,为空就下一个,不为空就在该散列头部选取进程进行调度,纵向表示根据优先级顺序排队,横向根据先后顺序排队。

2.调度有三种情况:

  • 运行退出--->不放回调度队列
  • 不退出,但时间片到了
  • 有新的进程产生

借着有新的进程产生来说,为什么要维护两个队列呢?

1.先分析如果只有一个队列会有什么问题:

  如果CPU正在调度一个队列,CPU可能正在选择这个队列有哪些进程需要被选择,但是这时,如果突然了一个新进程,是不是要放在合适的位置,这时就会存在一个问题,对于这个新进程要插入,就是让OS进行插入,而CPU让OS进行调度,这时是新建还是调度呢?无论是哪种情况,都面临者,新建进程不断越来越多,只会影响当前进程的调度,更关键的是,我们有个非常重要的认识:调度器要非常均衡的进行进程调度!!!

调度器要非常均衡的进行进程调度,可是这与有一个概念非常冲突---优先级,优先级高的先被调度,如果新来的进程优先级特别高,一直插入在前面,那么CPU就一直在前面进行调度,导致后面的进程根本没时间进行调度。

所以一个进程优先级可以很高,但是不代表优先级越高就一定要一直优先吗?优先级越低,就一定要后调度吗?

如果只有一个队列,只要把一个进程不断调高(被调用完就调高优先级) ,或者用户启动更高优先级的进程,最后导致后面的进程一直不被调度,这种问题叫饥饿问题。

2.所以要维护两个队列

  所以要维护两个队列,一个active指向的队列,一个expired指向的队列,新建的进程不能进入active指向的队列中,只能进入expired队列中,同时,不退出时间片到了的进程也不能进入active指向的队列中,只能进入expired队列中,这样就可以保证active指向的队列永远是一个存量进程竞争的情况,即active队列中进程只会越来越少,不会增多。

而当active中进程全部调度完后,OS只需要交换active与expired指向的内容,让active指向第二个队列,expired指向第一个队列。

好处:
  1. swap之前按照优先级进行调度
  2. swap只后给了其他优先级高低的进程的调度机会
  3. 这样可以保证CPU可以非常均衡的进行调度

1.在回过头来看,为什么要在队列中维护一个nr_active呢?

因为nr_active决定了OS是否要进行交换!!!

2.为什么要有bitmap[5]呢?

如果新增一个进程,他插入时的操作时间复杂度是O(1),但如果后续调度呢?CPU要从这么多进程中进行选择,从上往下进行遍历哈希表,从60开始遍历检测数组,虽然拿取是O(1),但是检测数组哪个位置为空,哪个位置不为空,这样遍历虽然可以,但还是太慢了。

这时就维护了一个bitmap[5]来解决这个问题,为什么是5呢?因为bitmap是int类型32个比特位,5×32=160,160刚好覆盖140个位置,,用bitmap充当一个位图,bitmap第0个元素代表第一个位置,第一个元素代表第二个位置,以此类推。bitmap元素都是0或1,0表示位置为空,1表示该位置有进程,所以OS不需要遍历整个数组,只需要查看对应位图就可以了,为0不查,为1直接拿对应位置进程。

但是检测bitmap不还是要进行遍历吗?但是真实的检测方法如下:

检测方法是常数级的!!!

这就是Linux内核O(1)调度算法

所以进程是什么?进程是运行起来的程序,为什么进程是运行起来的程序,因为进程会被被CPU调度,会被切换。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【初阶数据结构篇】链式结构二叉树(续)

文章目录 须知 💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力! 👍 点赞、收藏与分享:觉得这篇文章对你有帮助吗&#xff1…

【拥抱AI】如何让软件开发在保证数据安全的同时更加智能与高效?

第一、推动软件开发向更加智能化、高效化和创新化方向发展的策略 随着AI技术的不断进步,软件开发正朝着更加智能化、高效化和创新化的方向发展。要实现这一目标,企业需要采取一系列综合性的策略,从技术、管理、文化等多个层面入手。以下是一…

elementUI 点击弹出时间 date-picker

elementUI的日期组件,有完整的UI样式及弹窗,但是我的页面不要它的UI样式,点击的时候却要弹出类似的日期选择器,那怎么办呢? 以下是elementUI自带的UI风格,一定要一个输入框来触发。 这是我的项目中要用到的…

柯桥topik考级韩语培训【韩语干货】表存在的에和에게有什么区别?

相同点 都可以接在体词后,表示存在的地点、场所,以及所有者。 例如: 1)여동생이 집에 있어요. 妹妹在家。 2) 식당이 도서관 뒤에 있다. 食堂在图书馆后面。 3) 언니에게 고급 화장품이 있다. 姐姐有高级…

使用 ABAP GIT 发生 IF_APACK_MANIFEST dump

错误重现 使用经典的 ABAP 系统运行 ZABAPGIT 或者 ZABAPGIT_STANDALONE然后添加在线或者离线项目点击 PullShort dump SYNTAX_ERROR Dump 界面: 解决方案 它发生在 CREATE OBJECT lo_manifest_provider TYPE (ls_manifest_implementation-clsname) 语句中。 该语…

多商户电商平台开发指南:基于直播带货系统源码的搭建方案详解

本篇文章,小编将详细解析如何利用直播带货系统源码,快速搭建一套多商户电商平台的解决方案。 一、直播带货系统在多商户电商平台中的应用价值 在多商户电商平台中,直播带货系统可以帮助商家: 1.增加用户互动 2.提升转化率 3.…

【TextIn:开源免费的AI智能文字识别产品(通用文档智能解析识别、OCR识别、文档格式转换、篡改检测、证件识别等)】

TextIn:开源免费的AI智能文字识别产品(通用文档智能解析识别、OCR识别、文档格式转换、篡改检测、证件识别等) 产品的官网:TextIn官网 希望感兴趣以及有需求的小伙伴们多多了解,因为这篇文章也是源于管网介绍才产出的…

(C++回溯算法)微信小程序“开局托儿所”游戏

问题描述 给定一个矩阵 A ( a i j ) m n \bm A(a_{ij})_{m\times n} A(aij​)mn​,其中 a i j ∈ { 1 , 2 , ⋯ , 9 } a_{ij}\in\{1,2,\cdots,9\} aij​∈{1,2,⋯,9},且满足 ∑ i 1 m ∑ j 1 n a i j \sum\limits_{i1}^m\sum\limits_{j1}^na_{ij} i…

Java学习Day57:碧水金睛兽!(Spring Cloud微服务1.0)

1.微服务入门 (1).单体架构与分布式架构 单体架构: 将业务的所有功能集中在一个项目中开发,打成一个包部署优点: 架构简单、部署成本低 ; 缺点: 耦合度高项目打包部署到Tomcat,用户直接访问。用户量增加后…

Golang | Leetcode Golang题解之第541题反转字符串II

题目&#xff1a; 题解&#xff1a; func reverseStr(s string, k int) string {t : []byte(s)for i : 0; i < len(s); i 2 * k {sub : t[i:min(ik, len(s))]for j, n : 0, len(sub); j < n/2; j {sub[j], sub[n-1-j] sub[n-1-j], sub[j]}}return string(t) }func min…

★ C++进阶篇 ★ C++11(上)

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;我将和大家一起学习C11 ~ ​❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️ 澄岚主页&#xff1a;椎名澄嵐-CSDN博客 C基础篇专栏&#xff1a;★ C基础篇 ★_椎名澄嵐的博客-CSDN博客 C进阶篇专栏&#xff…

【Linux 28】应用层协议 - HTTPS

文章目录 &#x1f308; 一、HTTPS 相关概念⭐ 1. 什么是 HTTPS⭐ 2. 加密 & 解密 & 密钥⭐ 3. 常见的加密方式⭐ 4. 数据摘要 & 数据指纹⭐ 5. 初识数字签名 &#x1f308; 二、HTTPS 的加密方案探究⭐ 1. 方案一&#xff1a;只使用对称加密⭐ 2. 方案二&#xff…

qt QFileDialog详解

1、概述 QFileDialog是Qt框架中的一个对话框类&#xff0c;用于提供一个标准的文件选择对话框。它允许用户浏览文件系统&#xff0c;选择一个或多个文件或目录&#xff0c;以及指定文件名。QFileDialog支持本地文件系统和远程文件系统&#xff08;如通过FTP或SFTP访问的文件系…

C语言不同基本数据类型占用字节大小和取值范围

具体请前往&#xff1a;C语言各种基本数据类型字节大小和取值范围

Vue3:新特性详解

本文目录&#xff1a; 1.特性函数setup2.Ref 语法3.Reactive 函数4.Vue3 生命周期5.侦测变化 - watch6.Vue3的模块化开发7.弹窗类组件优化&#xff1a;Teleport8.异步组件优化&#xff1a;Suspense9.全局API优化 1.特性函数setup 1、setup函数是处于 生命周期函数 beforeCreate…

Linux scp命令 | 菜鸟教程-从本地复制到远程/从远程复制到本地

目录 Linux scp命令 语法 实例 1、从本地复制到远程 2、从远程复制到本地 说明 文章来源&#xff1a;Linux scp命令 | 菜鸟教程 Linux scp命令 nux scp 命令用于 Linux 之间复制文件和目录。 scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远…

计算机毕业设计Python+大模型膳食推荐系统 知识图谱 面向慢性病群体的膳食推荐系统 健康食谱推荐系统 机器学习 深度学习 Python爬虫 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

大数据集群中实用的三个脚本文件解析与应用

目录 一、jps - cluster.sh 脚本文件 &#xff08;一&#xff09;背景与功能 &#xff08;二&#xff09;使用方法 二、集群文件分发脚本 xsync.sh &#xff08;一&#xff09;背景与问题 &#xff08;二&#xff09;功能与实现原理 &#xff08;三&#xff09;脚本编写…

【数据分享】1981-2024年我国逐日平均气温栅格数据(免费获取)

气象数据一直是一个价值很高的数据&#xff0c;它被广泛用于各个领域的研究当中。这其中&#xff0c;又以平均气温数据最为常用&#xff01;之前我们分享过来源于美国国家海洋和大气管理局&#xff08;NOAA&#xff09;下设的国家环境信息中心(NCEI)发布的1929-2024年全球站点的…

多模态PaliGemma——Google推出的基于SigLIP和Gemma的视觉语言模型

前言 本文怎么来的呢&#xff1f;其实很简单&#xff0c;源于上一篇文章《π0——用于通用机器人控制的流匹配VLA模型&#xff1a;一套框架控制7种机械臂(改造了PaliGemma和ACT的3B模型)》中的π0用到了PaliGemma 故本文便来解读下这个PaliGemma 第一部分 PaliGemma 1.1 Pal…