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

目录

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

内核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.pswp.cn/news/908261.shtml

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

相关文章

【Spring AI 1.0.0】Spring AI 1.0.0框架快速入门(1)——Chat Client API

Spring AI框架快速入门 一、前言二、前期准备2.1 运行环境2.2 maven配置2.3 api-key申请 三、Chat Client API3.1 导入pom依赖3.2 配置application.properties文件3.3 创建 ChatClient3.3.1 使用自动配置的 ChatClient.Builder3.3.2 使用多个聊天模型 3.4 ChatClient请求3.5 Ch…

微信小程序开发一个自定义组件的详细教程

以下是一个微信小程序自定义组件的详细教程,覆盖开发文档中的核心知识点。我们将以一个包含属性、事件、插槽、生命周期等功能的按钮组件为例进行说明: 一、创建组件 在 components 目录下新建 custom-button 文件夹,包含以下文件&#xff…

模电——第四讲场效应管

定义:具有正向受控作用的半导体器件 分类:MOS(绝缘栅)场效应管和结性场效应管 区别:场效应管相比于晶体管,输入电阻很大,是单极型器件 MOS场效应管: 特性曲线 利用半导体表面的电…

[蓝桥杯]堆的计数

堆的计数 题目描述 我们知道包含 NN 个元素的堆可以看成是一棵包含 NN 个节点的完全二叉树。 每个节点有一个权值。对于小根堆来说,父节点的权值一定小于其子节点的权值。 假设 NN 个节点的权值分别是 1~NN,你能求出一共有多少种不同的小根堆吗&…

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…

WebRTC中的几个Rtp*Sender

一、问题: webrtc当中有几个比较相似的类,看着都是发送RTP数据包的,分别是:RtpPacketToSend 和RtpSenderVideo还有RtpVideoSender以及RTPSender,这说明什么呢?首先,说明我会很多连词&#xff0…

EFI(x64)简易开发环境

文章目录 1 必须文件2 运行环境3 构建应用 (Visual Studio)4 引用 EDK2 头文件 1 必须文件 EDK2: 可以只拉取仓库本身, 不拉取其子仓库(完整构建才需要) qemu: qemu 以源码发布, QEMU for Windows – Installers (64 bit) 这里有民间构建的安装包 2 运行环境 创建一个 root …

八皇后问题深度解析

八皇后问题深度解析 一、八皇后问题的起源与背景1.1 问题起源1.2 历史发展 二、问题描述与约束条件2.1 问题描述2.2 约束条件 三、算法原理:回溯算法3.1 回溯算法概述3.2 八皇后问题的回溯算法实现思路 四、八皇后问题的多语言实现4.1 Python实现4.2 C实现4.3 Java实…

Cursor 工具项目构建指南: Python 3.8 环境下的 Prompt Rules 约束

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 Cursor 工具项目构建指南: Python 3.8 环境下的 Prompt Rules 约束前言项目简介技术栈…

Java中的阻塞队列

阻塞队列是什么? 一、阻塞队列的核心概念与特性 1.1 阻塞队列是什么? 简单来说,阻塞队列是一种特殊的队列,它具备普通队列先进先出(FIFO)的特性,同时还支持两个额外的重要操作: 当…

v1.0.1版本更新·2025年5月22日发布-优雅草星云物联网AI智控系统

v1.0.1版本更新2025年5月22日发布-优雅草星云物联网AI智控系统 开源地址 星云智控官网: 优雅草星云物联网AI智控软件-移动端vue: 优雅草星云物联网AI智控软件-移动端vue 星云智控PC端开源: 优雅草星云物联网AI智控软件-PC端vue: 优雅草星云物联网AI…

Java-IO流之转换流详解

Java-IO流之转换流详解 一、转换流概述1.1 什么是转换流1.2 转换流的作用1.3 转换流的位置 二、InputStreamReader详解2.1 基本概念2.2 构造函数2.3 核心方法2.4 使用示例:读取不同编码的文件 三、OutputStreamWriter详解3.1 基本概念3.2 构造函数3.3 核心方法3.4 使…

android lifeCycleOwner生命周期

一 Fragment中 viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) 什么时候执行? 让我分析一下相关问题: 关于 onPause 时的数据更新: viewLifecycleOwner.lifecycleScope.launch {viewLifecycleOwner.repeatOnLifecycle(Lifecycle.Sta…

Liunx进程替换

文章目录 1.进程替换2.替换过程3.替换函数exec3.1命名解释 4.细说6个exe函数execl函数execvexeclp、execvpexecle、execve 1.进程替换 fork()函数在创建子进程后,子进程如果想要执行一个新的程序,就可以使用进程的程序替换来完成…

【华为云Astro-服务编排】服务编排中图元的使用与配置

目录 子服务编排图元 子服务编排图元的作用 如何使用子服务编排图元 脚本图元 脚本图元的作用 如何使用脚本图元 记录创建图元 记录创建图元的作用 如何使用记录创建图元 记录删除图元 记录删除图元的作用 如何使用记录删除图元 记录查询图元 记录查询图元的作用…

SQL Server相关的sql语句

目录 一、数据定义语言(DDL)1. 创建数据库2. 修改数据库3. 删除数据库4. 创建表5. 修改表结构6. 删除表 二、数据操作语言(DML)1. 插入数据2. 更新数据3. 删除数据 三、数据查询语言(DQL)1. 基础查询2. 去重…

【Hot 100】55. 跳跃游戏

目录 引言跳跃游戏我的解题 🙋‍♂️ 作者:海码007📜 专栏:算法专栏💥 标题:【Hot 100】55. 跳跃游戏❣️ 寄语:书到用时方恨少,事非经过不知难! 引言 跳跃游戏 &#x…

基于51单片机的车内防窒息检测报警系统

目录 具体实现功能 设计介绍 资料内容 全部内容 资料获取 具体实现功能 具体实现功能: (1)检测车内温度及二氧化碳浓度并用lcd1602实时显示。 (2)当人体红外传感器检测到车内有人,且温度或二氧化碳浓度…

关于智能体API参考接口

关于智能体在Flask的源码:请求体(在payload里的是请求体)、请求头(在headers里的i局势请求头)。 我的例子: 我的疑问:为什么没按Coze官方API文档格式,在Apifox里发POST请求却能收到回复? 1. 你…

Excel 批量下载PDF、批量下载考勤图片——仙盟创梦IDE

在办公场景中,借助应用软件实现 Excel 批量处理考勤图片、电子文档与 PDF,具有诸多显著优势。 从考勤图片处理来看,通过 Excel 批量操作,能快速提取图片中的考勤信息,如员工打卡时间、面部识别数据等,节省…