Linux2.6内核进程调度队列

目录

运行队列runqueue

活跃队列&过期队列

queue[140]&优先级&队列数组下标

bitmap[5]&O(1)调度算法

nr_active

active指针和expired指针

O(1)调度算法之调度过程


本篇是Linux进程概念篇的最后一篇,Linux2.6内核是一个具体的/可行的/实际的存在的一个调度方案。下篇我们将进入进程控制篇。

运行队列runqueue

下图是Linux2.6内核中进程队列的数据结构,之间关系已经给大家画出来,方便大家理解。

  • 一个CPU拥有一个runqueue (struct runqueue)
  • runqueue是CPU的PCB(task_strutc)
  • 如果有多个CPU就要考虑进程个数的负载均衡问题
  • 我们现在谈论的OS都是分时操作系统,调度时强调的是公平!
  • 关于实时操作系统,暂且不谈,调度时强调的时实时性!智能自动驾驶骑车等。

 

活跃队列&过期队列

  • CPU调度时,需要把进程拿走的同时,把正在执行的进程剥离下来(被放入运行队列)
  • 运行队列中存在两套相同的结构体类型。
  • 拿走的队列:活跃队列。放入队列:过期队列。
  • 活跃队列表示当前CPU正在执行的运行队列,而正在执行的运行队列(也就是活跃队列)是不可以增加新的进程的 。
  • 与此同时,操作系统设置了一个 和活跃队列相同属性的过期队列当活跃队列正在执行时如果有进程需要添加进运行队列,那么就会添加至过期队列当中也就是说 活跃队列的进程一直在减少,而过期队列中的进程一直在增多!
  • 活跃队列是只出不进
  • 过期队列是只进不出
  • 两个队列是被存放在结构体数组中的,结构体数组存放在运行队列中
  • 且运行队列中存在active指针和expired指针分别指向活跃队列和过期队列。

活跃队列

  • 时间片还没有结束的所有进程都按照优先级放在该队列
  • nr_active: 总共有多少个运行状态的进程
  • queue[140]: 一个元素就是一个进程队列,相同优先级的进程按照FIFO规则进行排队调度,所以,数组下标就是优先级!
  • 从该结构中,选择一个最合适的进程,过程是怎么的呢?
  1. 从0下表开始遍历queue[140]
  2. 找到第一个非空队列,该队列必定为优先级最高的队列
  3. 拿到选中队列的第一个进程,开始运行,调度完成!
  4. 遍历queue[140]时间复杂度是常数!但还是太低效了!
  • bitmap[5]:一共140个优先级,一共140个进程队列,为了提高查找非空队列的效率,就可以用5*32个比特位表示队列是否为空,这样,便可以大大提高查找效率!

过期队列

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

queue[140]&优先级&队列数组下标

  • task_struct *queue[140]
  • 维护的是一个140个队列的进程PCB的数组(指针数组)
  • 数组有140个元素,每个元素指向一个队列的第一个进程PCB,存放的PCB地址。
  • 140个下标可以包含140个队列。但是❗只用100~139的下标&队列。(40个)

之前我们笼统的理解为进程的调度是进程的PCB在runqueue里面排队,其实是在上面的queue里面排队。

  • 怎么体现优先级呢❓前面提到进程的优先级只有40个。
  • 若进程的优先级相同又该怎么办呢❓
  • 进程的优先级也是[60,99](40个)
  • 普通优先级:100~139(我们都是普通的优先级,想想nice值的取值范围,可与之对应!)
  • 实时优先级:0~99(不关心)

优先级和队列数组下标转化:

  • 优先级+40=下标值
  • 下标值-40=优先级的值
  • 存在一一对应的关系

例:优先级为60的进程直接把进程的PCB链接到下标值:60+40=100的地方。

所以表面看起来,LinuxOS维护了一个运行队列,但实际上OS维护了40个运行队列。

CPU调度一个进程找到运行队列数组,找到活跃队列,以优先级顺序找到队列,取队列中第一个进程的PCB来调度。

bitmap[5]&O(1)调度算法

如果前面大面积没有进程PCB存放,只有在后面才有进程PCB存放。那么CPU在调度进程时,需要遍历数组,才能找到存放进程PCB的位置。效率低且麻烦。

  • 由我们bitmap数组去解决这个问题!其实就是位图法,在我们C++也会学习到!
  • long bitmap[5]
  • long是4个字节,8*4=32个bite位,有32*5=160个bite位
  • 把数组中的每一个位置的队列看成bitmap中的一个bit位(0/1序列)
  • 只用140个位置
  • 设定:bit位为0的表示队列数组中的这个位置的队列无进程PCB
  • bit位为1的表示队列数组中的这个位置的队列有进程PCB
  • 所以,CPU不需要遍历140的队列数组,只需要遍历bitmap的5个位置,遍历一次就查找了32个bite位,大大提高了效率!
  • 时间复杂度位O(1),所以O(1)调度算法!

nr_active

  • 在Linux内核中,nr_active通常与进程调度、任务管理或资源计数有关。它通常用于表示当前活跃的任务或资源的数量。
  • 在Linux内核2.6版本中,nr_active可能出现在多个上下文中,例如任务队列、进程描述符或资源管理器中。这个变量通常用于跟踪系统当前正在处理或可用的任务数量,以便内核可以进行适当的调度和资源分配
  • 请注意,nr_active的具体含义和用途可能取决于它在内核代码中的具体实现和上下文。因此,要准确理解nr_active在Linux内核2.6中的含义,您需要查阅该版本的源代码,并查找nr_active的使用位置。

active指针和expired指针

运行队列中存在active指针和expired指针分别指向活跃队列和过期队列。CPU调度时只找active指向的队列。

在Linux内核中,特别是在进程调度和任务管理的上下文中,active指针和expired指针通常与运行队列(runqueue)相关。运行队列是内核用于管理和调度进程的数据结构。

  1. active指针
    active指针通常指向当前活跃的任务或进程。活跃任务是指那些已经准备好运行但尚未被调度器选中的进程。这些进程通常位于CPU的运行队列中,等待调度器的调度。active指针帮助内核快速定位并调度这些活跃进程。
  2. expired指针
    expired指针则用于管理那些已经超过其运行时间限制或因为其他原因而被标记为“过期”的进程。这些进程不再处于活跃状态,但仍然需要被适当地处理,例如可能需要被唤醒或重新调度。expired指针帮助内核跟踪这些过期的进程,以便在需要时进行处理。
  • active指针永远指向活动队列
  • expired指针永远指向过期队列
  • 可是活动队列上的进程会越来越少,过期队列上的进程会越来越多,因为进程时间片到期时一直都存在的。
  • 没关系,在合适的时候,只要能够交换active指针和expired指针的内容,就相当于有具有了一批新的活动进程!

这两个指针是内核调度器用于有效管理进程运行队列的重要工具。通过它们,内核能够高效地调度和执行进程,确保系统的正常运行和性能优化。


  1. CPU正在执行访问的队列是active指向的A活跃队列(只出不进)
  2. 另外一个被expired指向的结构相同的过期队列B(只进不出)
  3. 新创建的进程的PCB只链接到过期队列B
  4. CPU调度的活跃队列A中的进程PCB被CPU调度时间片到了之后,也链接到过期队列B
  5. 最后A队列中的进程被CPU全部调度完/处理完,B队列也满满的
  6. 接着将两个active指针和expired指针交换swap(active,expired),交换的是指针内容
  7. 重复上诉过程

 

O(1)调度算法之调度过程

  • CPU正在执行访问的队列是active指向的A活跃队列(只出不进)
  • 另外一个被expired指向的结构相同的过期队列B(只进不出)
  • 新创建的进程的PCB只链接到过期队列B
  • CPU调度的活跃队列A中的进程PCB被CPU调度时间片到了之后,也链接到过期队列B
  • 最后A队列中的进程被CPU全部调度完/处理完,B队列也满满的
  • 接着将两个active指针和expired指针交换swap(active,expired),交换的是指针内容
  • 重复上诉过程
  • 在系统当中查找一个最合适调度的进程的时间复杂度是一个常数,不随着进程增多而导致时间成本增加,我们称之为进程调度O(1)算法!
  • Linux的进程优先级 NI 和 PR - 简书 (jianshu.com)

🙂感谢大家的阅读,若有错误和不足,欢迎指正。

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

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

相关文章

【Node.js】03 —— HTTP 模块探索

🌟Node.js之HTTP模块探索✨ 🌟引言 在网络编程中,HTTP协议无处不在。在Node.js的世界里,我们可以通过内置的http模块来轻松创建HTTP服务器和客户端,实现数据的接收和发送。今天就让我们一起打开这扇门,探索…

Fisher判别示例:鸢尾花(iris)数据(R)

先读取iris数据,再用程序包MASS(记得要在使用MASS前下载好该程序包)中的线性函数lda()作判别分析: data(iris) #读入数据 iris #展示数据 attach(iris) #用变量名绑定对应数据 library(MASS) #加载MASS程序包 ldlda(Species~…

Python打怪升级(4)

在计算机领域常常有说"合法"和"非法"指的是:是否合理,是否有效,并不是指触犯了法律。 random.randint(begin,end) 详细讲解一下这个random是指模板,也就是别人写好的代码直接来用,在Python当中,…

C语言入门课程学习笔记1

C语言入门课程学习笔记1 第1课 - 概论第2课 -helloworld第3课 -数据输出第4课 -数据类型与变量第5课 - 深入数据类型与变量第6课 - 类型与变量编程练习第7课 - 程序中的数据输入 本文学习自狄泰软件学院 唐佐林老师的 C语言入门课程,图片全部来源于课程PPT&#xff…

食用油5G智能工厂数字孪生可视化平台,推进食品制造业数字化转型

食用油5G智能工厂数字孪生可视化平台,推进食品制造业数字化转型。在食用油产业中,数字化转型已成为提升生产效率、优化供应链管理、确保产品质量和满足消费者需求的关键。食用油5G智能工厂数字孪生可视化平台作为这一转型的重要工具,正在推动…

《html自用使用指南》--基于w3School实践

1.基础标签 文本输入时&#xff0c;在编辑器中的换行&#xff0c;多个空格&#xff0c;都被编辑器看作一个空格 <p> 这个段落 在源代码 中 包含 许多行 但是 浏览器 忽略了 它们。 </p>结果&#xff1a;这个段落 在源代码 中 包含 许多行 但是 浏览器…

STM32H750时钟频率和功耗以及RTC功能测试

STM32H750时钟频率和功耗和RTC功能测试 &#x1f4cc;相关篇《STM32H750片外QSPI启动配置简要》 ✨在使用STM32CubeMX修改STM32H750时钟树参数时&#xff0c;如果使用软件自动求解&#xff0c;这是一个非常耗时的操作&#xff0c;有时候还不一定成功&#xff0c;还是推荐使用手…

《ElementPlus 与 ElementUI 差异集合》el-select 差异点,如:高、宽、body插入等

宽度 Element UI 父元素不限制宽度时&#xff0c;默认有个宽度 207px&#xff1b; 父元素有固定宽度时&#xff0c;以父元素宽度为准&#xff1b; Element Plus 父元素不限制宽度时&#xff0c;默认100%&#xff1b; 父元素有固定宽度时&#xff0c;以父元素宽度为准&#x…

CDN、边缘计算与云计算:构建现代网络的核心技术

在数字化时代&#xff0c;数据的快速传输和处理是保持竞争力的关键。内容分发网络&#xff08;CDN&#xff09;、边缘计算和云计算共同构成了现代互联网基础架构的核心&#xff0c;使内容快速、安全地到达用户手中。本文将探讨这三种技术的功能、相互关系以及未来的发展趋势。 …

使用表格法插入公式和编号

如何将公式和编号优雅地插入到论文当中呢&#xff1f; 首先插入一个1行2列的表格 调整一下 输入公式方法一&#xff1a;感觉墨迹公式挺好用的&#xff0c;word自带的 输入公式方法二&#xff1a;图片转LATEX代码 这个方法更快 分享一个公式识别网站 图片识别得到LATEX代码&…

atlas 500容器(ubuntu20.04)搭建

1.docker 及环境搭建略 2.宿主机驱动安装略 3.宿主机中能正确使用npu-smi 4.docker 拉取略 5.docker 容器启动 docker run -itd --device/dev/davinci0 --device/dev/davinci_manager --device/dev/devmm_svm --device/dev/hisi_hdc -v /run/board_cfg.ini:/run/b…

Pycharm远程连接实验室服务器Conda环境配置

如何配置Pycharm和远程服务器 这类博客较多&#xff0c;参考内容 https://blog.csdn.net/fengbao24/article/details/125515542 Python解释器选择&#xff08;conda3&#xff09; 1. Settings -> Add Interpreter -> On SSH 注意&#xff0c;这里的SSH需要在你把远程…

OpenHarmony南向开发案例:【 智能家居中控】

应用场景简介 智能家居。 今天打造的这一款全新智能家庭控制系统&#xff0c;凸显应用在智能控制和用户体验的特点&#xff0c;开创国内智能家居系统体验新局面。新的系统主要应用在鸿蒙生态。 工程版本 系统版本/API版本&#xff1a;OpenHarmony SDK API 8IDE版本&#xf…

c++的策略模式,就是多态

一、定义&#xff1a; 策略模式定义了一系列的算法&#xff0c;并将每一个算法封装起来&#xff0c;而且使它们还可以相互替换。 策略模式让算法独立于使用它的客户而独立变化。 二&#xff0c;核心 抽象策略&#xff08;抽象基类&#xff09;&#xff08;Strategy&#xff09…

酷开科技逐步为用户构建健全的智慧家庭生活场景

大规模与精细化人群技术则是通过大量的计算能力和精细化的运营能力&#xff0c;建立用户专属数据储存区域&#xff0c;使得用户在使用不同电视的观影偏好和兴趣能够能够得以延续。 不拘泥于自有品牌终端数量&#xff0c;酷开系统除了集成在创维电视上&#xff0c;还服务于飞利…

idea上传项目到gitee(码云)

1、打开码云&#xff0c;新建仓库 2、创建 3、这就是创建成功的页面 4、复制仓库地址&#xff0c;后面需要用到 2、打开我们的项目&#xff1a;例如我现在的项目 1、idea创建git仓库 2、选择我们项目文件夹的目录 3、查看文件是否变色&#xff0c;变色表示成功了 4、添加到缓…

0元实现网站HTTP升级到HTTPS(免费https证书)

HTTPS就是在HTTP的基础上加入了SSL&#xff0c;将一个使用HTTP的网站免费升级到HTTPS主要包括以下几个步骤&#xff1a; 1 获取SSL证书 永久免费的https证书申请通道https://www.joyssl.com/certificate/select/free.html?nid16 免费的SSL证书同样能实现HTTPS&#xff0c;国…

SpringBoot内容协商机制(就是接受数据的类型如json,xml)

目录 一、基于请求头的内容协商机制 二、基于请求参数的内容协商机制 一、基于请求头的内容协商机制 如果我们的Java服务为浏览器和安卓手机同时提供服务&#xff0c;浏览器期望接受的请求是JSON格式&#xff0c;安卓客户端期望接收的请求是XML格式&#xff0c;这个时候是否需…

C++中的智能指针

C中的智能指针 文章目录 C中的智能指针1.为什么需要智能指针&#xff1f;2.智能指针的类型2.1 std::shared_ptr2.2 std::unique_ptr2.3 std::weak_ptr Reference 笔者在学习ROS2的过程中&#xff0c;遇到了std::make_shared这种用法&#xff0c;一眼看不懂&#xff0c;才发现笔…

Java 网络编程之TCP(三):基于NIO实现服务端,BIO实现客户端

前面的文章&#xff0c;我们讲述了BIO的概念&#xff0c;以及编程模型&#xff0c;由于BIO中服务器端的一些阻塞的点&#xff0c;导致服务端对于每一个客户端连接&#xff0c;都要开辟一个线程来处理&#xff0c;导致资源浪费&#xff0c;效率低。 为此&#xff0c;Linux 内核…