Linux 2.6 内核进程调度队列

news2024/9/23 13:31:03

Linux 2.6 内核进程调度队列

  • 运行队列(runqueue)
    • 蓝色区域(活动队列)
      • queue
      • bitmap
      • nr_active
      • 总结:时间片还没有结束的所有进程都按照优先级放在该队列(活动队列)
    • 红色区域(过期队列)
    • *active 和 *expired

Linux 内核究竟是如何调度队列的?

运行队列(runqueue)

在 OS 中会存在如下 运行队列,而每一个 CPU 都有一个这样的 运行队列

在这里插入图片描述

蓝色区域(活动队列)

queue

注意此区域有一个叫 queue[140] 的东西,其真正的面目是这个:

task_struct* queue[140];

这是个数组,数组里是 task_struct* 类型的指针,可以存放 140 个进程 PCB 的地址

看似可以放 140 个,但实际上只会使用后 40 个([100, 139]),好像很巧合,进程优先级就是 40 个级别,对上了?
没错, queue 下标 100 对应优先级 60,下标 139 对应优先级 99([60, 99]

那么相同优先级的进程 PCBtask_struct)就会以链表的形式链入 queue 对应的下表处,看似是维护了一个运行队列,实际上是维护了 40 个队列(链表)

那么想要找到一个 r 状态进程,只需要找到 运行队列queue,从优先级最高的 60,也就是下表 100 处开始 遍历取出 即可

bitmap

我们的进程可能压根不会从下标 100 (优先级 60)的位置进行链入,可能都是下标 120 (优先级 80)的位置链入,那 CPU 还需要从下标 100 的位置开始遍历吗?那不是麻烦吗?

bitmap[5] 就出来了:

long bitmap[5];

long 在 32 位是 4 字节,32 个 bit,那 bitmap 数组的 5 个元素就有 5 * 32 = 160 个 bit

而就是用这 160 个 bit 表征 queue 里的 140 个指针是否有链入的进程,若 queue 某一下标有进程,那 bitmap 对应的位置上就是 1,反之则为 0

这样就能快速判断 queue 哪个下标位置上有进程,时间复杂度几近为 O(1)

nr_active

这个表示整个队列里有多少个进程,不用详述

总结:时间片还没有结束的所有进程都按照优先级放在该队列(活动队列)

红色区域(过期队列)

我们看了 蓝色区域queue 等属性,不是这 红色区域 属性怎么和它一样是怎么回事

实际上 运行队列 会出现两套这样的结构;
queuebitmapnr_active 可以放一起成为一个小的结构体作为 运行队列 里的一个属性

利用这个小的结构体构建一个只有两个这种数据结构元素的数组,分别为: array[0]array[1]

而上图 array[0] 表示蓝色区域, array[1] 表示红色区域

  • 过期队列活动队列 结构一模一样
  • 过期队列 上放置的进程,都是时间片耗尽的进程
  • 活动队列 上的进程都被处理完毕之后,会对 过期队列 的进程进行时间片重新计算

*active 和 *expired

CPU 在找进程时不是直接访问这个队列的,而是先找 active 指针,active 指针指向 array 数组的哪一个元素就访问哪一个元素里的 queue ,CPU 始终调度 active 指向的队列

active 所指的队列是 只出不进 的, expired 所指的队列是 只进不出

也就是说新来的进程是只入 expired 队列, active 队列里某个进程被调度的时间片到了,也是直接入 expired 队列,直到 active 队列为空,没有进程被调度时, OS 直接将指针 activeexpired 的内容交换即可

这就是 O(1) 调度算法,在系统当中查找一个最合适调度的进程的时间复杂度是一个常数,不随着进程增多而导致时间成本增加

  • active 指针永远指向 活动队列
  • expired 指针永远指向 过期队列
  • 可是 活动队列 上的进程会越来越少, 过期队列 上的进程会越来越多,因为进程时间片到期时一直都存在的
  • 没关系,在合适的时候,只要能够交换 active 指针和 expired 指针的内容,就相当于有具有了一批新的 活动进程

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

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

相关文章

scrapy框架--快速了解

免责声明:本文仅做分享~ 目录 介绍: 5大核心组件: 安装scrapy: 创建到启动: 修改日志配置:settings.py 修改君子协议配置: 伪装浏览器头: 让代码去终端执行: 数据保存: 1-基于命令 2-基于管道 文档: 介绍: 5大核心组件: Scrapy是一个开源的Python框架&#xff0c…

【3.5】贪心算法-解优势洗牌(类田忌赛马问题)

一、问题 给定两个 大小相等的数组 A 和 B ,A 相对于 B 的优势可以用满足 A[i] > B[i] 的索引 i 的数目来描述。 返回 A 的任意排列,使其相对于 B 的优势最大化。 二、解题思路 这个问题要求我们重新排列数组A,使得在相同位置上&#xf…

Ubuntu 24.04部署Wordpress

环境: Ubuntu 24.04 PHP 8.1.2-1ubuntu2.18 Nginx/1.18.0 (Ubuntu) WordPress 6.6.1 Mysql 8 文章目录 1. 安装php2. 配置nginx2.1. 安装nginx2.2. 配置 3. 下载wordpress3.1. 配置wordpress 4. mysql配置wordpress数据库和用户4.1. 安装和远程连接4.2. 创建wordpre…

uart16550_ip_spec

用途:允许与调制解调器或其他外部设备进行通信,例如使用串行电缆和RS232协议的另一台计算机。 核心特性: WISHBONE接口:支持32位或8位数据总线模式(可选)。 FIFO操作:仅支持FIFO(先…

惊爆!布偶猫喂养秘籍:希喂、交响乐金罐、尾巴生活适合布偶猫吗?

我家布偶甜美可爱,喜欢撒娇爱粘人,真的特别可爱。不过想养好布偶猫喂食非常重要,喂食方法不对,食物没选择好,都会影响布偶猫的健康与正常生长。今天我就就拿布偶猫的选粮标准来测评三款热门主食罐,让大家更…

基于JAVA的专利资源共享平台

项目介绍 基于JAVA的专利资源共享平台系统是一个集专利信息展示、资源共享、交易服务等功能于一体的综合性平台。该系统利用JAVA语言的强大功能和广泛的生态系统,结合数据库技术、Web开发技术等,为用户提供了一个高效、安全、便捷的专利资源共享和交易环…

天气分析预测系统-气象网

项目介绍 在信息科技蓬勃发展的当代,我们推出了一款基于Python Flask的全国上海气象数据采集、预测和可视化系统。随着气候变化越发引起全球关注,精准的气象数据和可视化展示变得愈发重要。该系统采用先进的技术和创新的功能,满足用户对实时…

html+css+js网页设计 个人博客模版 我的学习经历7个页面

htmlcssjs网页设计 个人博客模版 我的学习经历7个页面 网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作)。 获取…

npm登录

npm 登录 npm login --auth-typelegacy报错 原因 npm源非npm本身源,需要切换: 查看源 nrm ls切换为npm源 nrm use npm重新登录 输入OTP验证后登录成功:

包含结构体的类的大小

看一下简单的例子&#xff0c;一个类声明中包含了一个结构体的声明&#xff0c;在没有定义这个结构体变量的情况下&#xff1a; #include <stdlib.h> #include <stdio.h> #include <malloc.h>class CTest { public:CTest(){}~CTest() {}struct internal{in…

在AMD GPU上使用DBRX Instruct

DBRX Instruct on AMD GPUs — ROCm Blogs 在这篇博客中&#xff0c;我们展示了DBRX Instruct&#xff0c;这是由Databricks开发的一个专家混合大型语言模型&#xff0c;在支持ROCm的系统和AMD GPU上运行。 关于DBRX Instruct DBRX是一个基于Transformer的仅解码大型语言模型…

OpenCV绘图函数(8)填充凸多边形函数fillConvexPoly()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 填充一个凸多边形。 函数 cv::fillConvexPoly 绘制一个填充的凸多边形。这个函数比 fillPoly 函数快得多。它可以填充的不仅仅是凸多边形&#…

护眼台灯减蓝光和无蓝光的有区别?眼科医生推荐的护眼台灯

自从疫情以后&#xff0c;”网课“成了一个热门的课程&#xff0c;许多家长会为了孩子的学习进行网课的报名。孩子们的眼睛处于生长期比较脆弱&#xff0c;长时间对着手机&#xff0c;电脑上课&#xff0c;电子产品会产生蓝光&#xff0c;眼睛会受到一定的伤害。护眼台灯减蓝光…

CTFHub-SSRF过关攻略(持续更新中...)

第一题&#xff0c;内网访问 一&#xff0c;打开web/ssrf/内网访问 二&#xff0c;进入页面什么都没有查看一下上一步给的参数 三&#xff0c;输入http://127.0.0.1/flag.php回车显示flag 四&#xff0c;然后复制提交&#xff08;恭喜通关&#xff09; 第二题&#xff0c;伪协…

AI智能大数据分析足球AIAutoPrediction,提高足球比赛预测准确度的新方法

本文摘要&#xff1a;一、I智能大数据分析足球的原理I智能大数据分析足球的原理是利用机器学习和大数据分析技术&#xff0c;对足球比赛的各种数据进行分析和预测。这些数据包括球队历史成绩、球员数据、场地... 一、I智能大数据分析足球的原理 I智能大数据分析足球的原理是利…

视频生成类大模型实现原理以及应用和难点

“ 视频生成属于计算机视觉领域&#xff0c;还包括图像处理等 ” 生成式大模型在文本&#xff0c;图像&#xff0c;视频等方面表现良好&#xff0c;而我们都知道文本生成大模型是基于自然语言处理技术&#xff0c;而视频生成的大模型又是怎么实现的呢&#xff1f; 今天我们就…

学习笔记之JS篇(0828)

Error Lens:报错提示插件 2. 主题&#xff08;One Dark Pro) 3. VSCode自带格式化工具代码缩进字符改为2个字符 4. 代码缩进字符改为2个字符 左右分屏&#xff08;live Server) Win 左右箭头 **学 习 ** 不能只看不动手 不管多简单的代码都要练习 随时暂停视频随时写代码 …

Win10 安装 Rabbitmq

参考文档&#xff1a;https://www.rabbitmq.com/docs/install-windows 一、安装 Erlang 语言 安装 RabbitMQ 需要该语言的支持才能安装 下载地址&#xff1a;https://erlang.org/download/otp_versions_tree.html 点击这里下载最新版本&#xff1a;27.0.1 直接默认 next 更…

Django+vue自动化测试平台(29)--测试平台集成playwright录制pytest文件执行

需求背景 一、 系统目标与功能概述 脚本管理: 系统需要能够组织和存储所有通过playwright官方插件录制的脚本。这包括脚本的上传、编辑、删除和版本控制功能。 脚本执行: 用户应该能够在后台界面上查看所有可用的脚本&#xff0c;并能够通过简单的点击操作来启动特定脚本的执…

微调方法概览

前言 大语言模型(LLM)的训练过程通常分为两大阶段&#xff1a; 阶段一&#xff1a;预训练阶段 此阶段模型是在大规模的无标签数据集上接受训练&#xff0c;目标是使模型掌握词汇的含义、句子的构造规则以及文本的基本信息和上下文。 需特别指出&#xff0c;预训练实质上是一…