【Linux 学习计划】-- 系统中进程是如何调度的(内核进程调度队列)

news2025/7/26 20:05:37

目录

回顾进程优先级与进程调度的引入

内核runqueue图例

关于queue[140]前100个位置 | 实时进程与分时进程

遍历需要调度的进程与bitmap的引入

active、expired指针

结语


回顾进程优先级与进程调度的引入

在我们之前的学习中,我们是有学习过进程优先级这个概念的,这里简单回顾一下

默认优先级是80,但是还有一个nice值可以供我们修改优先级的值

这是因为:优先级 = 默认优先级 + nice值

而nice值的范围是从-20~19,也就是说,进程优先级是有40个值的,即从60 ~ 99

但是现在进程的优先级我们知道了,而在系统之中,他是如何使用这些优先级的呢?

内核runqueue图例

如下图:

这个是我们内核中的runqueue,前面我们在进程状态那篇博客中也有提到他,只要进程被链入runqueue之中,就代表他会被CPU调度执行,也就是就绪和运行状态

并且,一个CPU只有一个runqueue

而今天我们将会详细谈一谈runqueue里面的几个字段,因为我们今天要讲调度,那就必然和这些绕不开

首先是上图中用蓝色框框框起来的,第三个,也就是queue[140]

需要说明的是,这140个空间中,前100个是给实时进程的(后文会有所举例),也就是0~99位置,而后面的100~139这40个位置

不对,40个位置,这和我们的nice值的范围,也就是进程优先级的范围不是正好吻合了吗!

事实也的确如此,我们来看一下图例:

我们的每一个下标,在这样子分布的情况下,就可以和进程的优先级一一对应,而我们这时候如果有进程进来了,那么就会直接根据他的优先级进行插入到相应位置:

比如这样,接着就能够调度起来了

关于queue[140]前100个位置 | 实时进程与分时进程

可能很多同学对这几个字眼比较陌生,这里举一个例子就明白了

分时操作系统就好比我们的电脑,需要同时让多个进程进行轮转,同时运行

而实时操作系统则像是车子,一台汽车里面可能有很多功能,音乐、影视等等,但是总不能说有紧急情况了,现在我要刹车,结果操作系统说:不行,我音乐还在放呢,你不能刹车,这也太扯了

以上就是关于实时操作系统和分时操作系统的讲解,这里并不打算详说,因为今天的重点是动态理解进程的调度

遍历需要调度的进程与bitmap的引入

首先,我们并不是所有进程的优先级都是从60开始的,大部分甚至都是80

那问题来了,我们前面还有100个空间没有使用,空着放在那里给实时进程准备着,那我们每一次要找下一个需要调度的进程的时候,都需要一个一个去找吗?这样的话效率太低了

所以runqueue中还有一个东西,叫做bitmap[5],也就是所谓的位图:

至于为什么是 5 呢,因为5*32=160,而4*32=128,5 个可以刚好覆盖,但是4个则会直接不够

而我们有了位图之后,效率的提升是明显的

比如我们现在要看前32个空间有没有进程,我们只需要这样:

bitmap[i]==0

这样我们一次就能知道32个位置有没有进程,如果为0,那就下一个32,如果不为0,那再一个一个找进程

active、expired指针

active(活跃)expired(过期)

我们现在再来看回最开始那张图片:

我们可以看到,这里面其实有两个框,蓝和红两个,并且,里面的内容是完全一样的

在看到蓝色框框上面的两个变量,那是两个指针,active 和 expired,而这两个指针指向的就是下面的两个框框

我们再通过画图来理解一下这个过程:

在最开始的时候,进程在活跃(active)指针指向的queue下面,等到调度完之后

这个进程就会被链入到expired所指向的queue中(下图用蓝色框框表示的就是已经调用结束的进程):

而所有的进程在被调度完之后,上面active指针所指向的queue,直接遍历 1 次bitmap,发现全是 0,就知道全部调度完了

接下来就是:两个指针的值直接交换(swap(*active, *expired))

这样我们的活跃queue和过期queue就完成了交换

接下来就是继续调度active指针指向的进程,全部执行完了之后,就再交换,过期的重新变成活跃的

如此往复

结语

这篇文章到这里就结束啦!!~( ̄▽ ̄)~*

如果觉得对你有帮助的,可以多多关注一下喔

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

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

相关文章

C#、VB.net——如何设置窗体应用程序的外边框不可拉伸

以Visual studio 2015为例,具体操作如下: 1、将窗体的“FormBorderStyle”属性值修改为“FixedSingle”: 2、点击“格式”——“锁定控件”: 这样生成的程序边框即可固定住,无法拉伸。

基于SpringBoot的房屋租赁系统的设计与实现(thymeleaf+MySQL)

💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

Spring Boot统一功能处理深度解析

第一章:为什么需要统一功能处理? 想象你正在开发一个电商系统,包含用户管理、商品管理、订单管理等模块。每个模块都需要: 用户身份验证操作日志记录异常统一处理数据格式标准化 如果每个模块都单独实现这些功能: …

世事无常,比较复杂,人可以简单一点

2025年6月5日日,17~28℃,一般 待办: 宣讲会 职称材料的最后检查 职称材料有错误,需要修改 期末考试试题启用 教学技能大赛PPT 遇见:部门宣传泰国博士项目、硕士项目、本科项目。 感受或反思:东南亚博士…

数据结构哈希表总结

349. 两个数组的交集 力扣题目链接(opens new window) 题意:给定两个数组,编写一个函数来计算它们的交集。 说明: 输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。 public int[] intersection(int[] nums1, int[] num…

IDEA 开发PHP配置调试插件XDebug

1、安装PHP环境 为了方便,使用的PhpStudy。 安装路径:D:\resources\phpstudy_pro\Extensions\php\php7.3.4nts 2、下载Xdebug Xdebug: Downloads 选择对应的版本下载,本次使用的是7.3。 3、配置Xdebug 在php.ini中添加Xdebug配置。 D…

奇异值分解(SVD):线性代数在AI大模型中的核心工具

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开…

MySQL——视图 用户管理 语言访问

目录 视图 用户管理 数据库权限 访问 准备工作 使用函数 mysql界面级工具 连接池 视图 这里的视图与事务中的读视图是两个不同的概念:视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图的…

二、Sqoop 详细安装部署教程

作者:IvanCodes 日期:2025年6月2日 专栏:Sqoop教程 Apache Sqoop 是一个强大的工具,用于在 Hadoop (HDFS, Hive, HBase) 与关系型数据库 (如 MySQL, PostgreSQL, Oracle) 之间高效传输数据。本教程将详细指导您如何根据官方网站截…

【C语言预处理详解(下)】--#和##运算符,命名约定,命令行定义 ,#undef,条件编译,头文件的包含,嵌套文件包含,其他预处理指令

目录 五.#和##运算符 5.1--#运算符 5.2--##运算符 六.命名约定,#undef,命令行定义 6.1--命名约定 6.2--#undef 6.3--命名行定义 七.条件编译 常见的条件编译指令: 1.普通的条件编译: 2.多个分支的条件编译(可以利用条…

03.搭建K8S集群

K8S集群搭建的方式 目前主流的搭建k8s集群的方式有kubeadm、minikube、二进制包三种方式: kubeadm(本案例搭建方式) 是一个工具,用于快速搭建kubernetes集群,目前应该是比较方便和推荐的,简单易用 kubea…

RDMA简介3之四种子协议对比

RDMA协议共有四种子协议,分别为InfiniBand、iWARP、RoCE v1和RoCE v2协议。这四种协议使用统一的RDMA API,但在具体的网络层级实现上有所不同,如图1所示,接下来将分别介绍这四种子协议。 图1 RDMA四种子协议网络层级关系图 Infin…

【最新版】西陆洗车系统源码全开源+uniapp前端+搭建教程

一.系统介绍 一款基于ThinkPHPUniapp开发的多门店洗车系统,包含用户端(小程序)、门店员工端(小程序)、门店端(PC)、平台管理端(PC)。 门店分连锁门店和独立门店&#xf…

Linux开发工具(apt,vim,gcc)

目录 yum/apt包管理器 Linux编辑器 vim 1.见一见vim 2.vim的多模式 3.命令模式底行模式等 4.vim的配置 Linux编译器 gcc/g 1.预处理(宏替换) 2.编译(生成汇编) 3.汇编(生成机器可识别代码) 4.连…

鸿蒙Next开发真机调试签名申请流程

背景: 在学习鸿蒙next开发应用的初期总是会遇到一堆的问题,毕竟鸿蒙next开发不管是他的ArKTS语言还是他的开发工具DevEco Studio都还在起步阶段,就像当初的Android起步一样,总会有资料不足的一些问题。就比如我们学习下载完DevEco…

[yolov11改进系列]基于yolov11引入上下文锚点注意力CAA的python源码+训练源码

【CAA介绍】 本文记录的是基于CAA注意力模块的RT-DETR目标检测改进方法研究。在远程遥感图像或其他大尺度变化的图像中目标检测任务中,为准确提取其长距离上下文信息,需要解决大目标尺度变化和多样上下文信息时的不足的问题。CAA能够有效捕捉长距离依赖…

【linux】全志Tina预编译一个so库文件到根文件系统/usr/lib/下

一、sdk中新建文件夹 路径: V:\t113\work3\t113\openwrt\package\feeds\libs\md5util md5util为需要注入的库文件夹。 文件结构 libs md5util files libmd5util.so makefile etc.. 二、编写makefile include $(TOPDIR)/rules.mkPKG_NAME : md5util PKG_VERSIO…

C# 类和继承(成员访回修饰符)

成员访回修饰符 本章之前的两节阐述了类的可访问性。对类的可访问性,只有两种修饰符:internal和public。 本节阐述成员的可访问性。类的可访问性描述了类的可见性;成员的可访问性描述了类成员的可 见性。 声明在类中的每个成员对系统的不同…

Linux-文件管理及归档压缩

1.根下的目录作用说明: /:Linux系统中所有的文件都在根下/bin:(二进制命令目录)存放常用的用户命令/boot:系统启动时的引导文件(内核的引导配置文件,grub配置文件,内核配置文件) 例…

微软认证考试科目众多?该如何选择?

在云计算、人工智能、数据分析等技术快速发展的今天,微软认证(Microsoft Certification)已成为IT从业者、开发者、数据分析师提升竞争力的重要凭证。但面对众多考试科目,很多人不知道如何选择。本文将详细介绍微软认证的考试方向、…