当前位置: 首页 > news >正文

Linux2.6内核进程调度队列

文章目录

  • 前言
  • 运行队列 runqueue
  • 优先级
  • 活动队列
  • 过期队列
  • 活跃队列 VS 过期队列
  • active指针和expired指针
  • O(1)调度算法


前言

在前面学习并认识了进程之后,我们会发出一个疑问:Linux内核是如何调度进程的呢?

接下来我们就以Linux2.6内核为例深入探讨这个问题。

运行队列 runqueue

下图是Linux2.6内核中运行队列的数据结构。

  • 一个CPU拥有一个runqueue (struct runqueue)。
  • 如果有多个CPU就要考虑进程个数的负载均衡问题。
  • 我们现在谈论的OS都是分时操作系统,调度时强调的是公平。

在这里插入图片描述

优先级

queue下标说明:

  • 普通优先级:100 ~ 139。
  • 实时优先级:0 ~ 99。

我们进程的都是普通的优先级,我们知道 nice 值的取值范围是 -20 ~ 19,共40个级别,依次对应 queue 当中普通优先级的下标100~139。

注意: 实时优先级对应实时进程,实时进程是指先将一个进程执行完毕再执行下一个进程,现在基本不存在这种机器了,所以对于 queue 当中下标为 0 ~ 99 的元素我们不关心。

活动队列

时间片还没有结束的所有进程都按照优先级放在活动队列当中,其中 nr_active 代表总共有多少个运行状态的进程,而 queue[140] 数组当中的一个元素就是一个进程队列,相同优先级的进程按照FIFO规则进程排队调度。

调度过程如下:

  1. 从0下标开始遍历queue[140]。
  2. 找到第一个非空队列,该队列必定为优先级最高的队列。
  3. 拿到选中队列的第一个进程,开始运行,调度完成。
  4. 接着拿到选中队列的第二个进程进行调度,直到选中进程队列当中的所有进程都被调度。
  5. 继续向后遍历queue[140],寻找下一个非空队列。

注:bitmap[5]:queue数组当中一共有140个元素,即140个优先级,一共140个进程队列,为了提高查找非空队列的效率,就可以用5 × 32个比特位表示队列是否为空,这样一来便可以大大提高查找效率。

总结: 在系统当中查找一个最合适调度的进程的时间复杂度是一个常数,不会随着进程增多而导致时间成本增加,我们称之为进程调度的O(1)算法

过期队列

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

活跃队列 VS 过期队列

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

active指针和expired指针

  • active指针永远指向活动队列。
  • expired指针永远指向过期队列。

由于活动队列上时间片未到期的进程会越来越少,而过期队列上的进程数量会越来越多(新创建的进程都会被放到过期队列上),那么总会出现活动队列上的全部进程的时间片都到期的情况,这时将 active 指针和 expired 指针的内容交换,就相当于让过期队列变成活动队列,活动队列变成过期队列,就相当于又具有了一批新的活动进程,如此循环进行即可。

O(1)调度算法

有了对上述概念的认识,我们就能很好的理解内核调度进程队列的算法了:

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

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

相关文章:

Linux2.6内核进程调度队列

文章目录 前言运行队列 runqueue优先级活动队列过期队列活跃队列 VS 过期队列active指针和expired指针O(1)调度算法 前言 在前面学习并认识了进程之后,我们会发出一个疑问:Linux内核是如何调度进程的呢? 接下来我们就以Linux2.6内核为例深入探…...

Infineon(英飞凌) TLE985xQX 芯片电机工作电流、电压AD采样

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 单片机芯片合集 文章目录 其他系列文章导航 文章目录 前言 一、选取合适的端口 1.通过 OP1、OP2 电流采集运放输入端口进行H桥驱动的电流采集。 2.通过 O_D_VBAT_AD_EN、I_A_VBAT_A…...

Sparrow系列拓展篇:对信号量应用问题的深入讨论

前言 笔者之前已经介绍过了Sparrow信号量的源码,但是对于信号量的使用,并没有讲得非常详细,仅仅讲了同步与互斥的概念。 本章让笔者介绍如何使用Sparrow的信号量,深入探讨一下信号量在同步、计数与互斥中的应用。 使用信号量解…...

图文详解Docker下配置、测试Redis

文章目录 前言实测环境:实验思路: 正文1.准备工作2. 配置、运行 Redis 容器3. 配置测试 总结 前言 配置、测试redis数据库服务器,首先确保正确安装docker,并且已启动运行,具体安装docker方法见笔者前面的博文《OpenEu…...

Python编程艺术:优雅与实用的完美平衡(推导式)

在Python这门优雅的编程语言中,处处体现着"简洁即是美"的设计哲学。今天我们深入探讨Python中那些让代码更优雅、更高效的编程技巧,这些技巧不仅能提升代码的可读性,还能让编程过程充满乐趣。 列表推导式的魔力 Python的列表推导…...

Spring Boot框架Starter组件整理

在Spring Boot框架中,starter是一种预定义的依赖集合,旨在简化Maven或Gradle等构建工具中的依赖管理。每个starter都包含了实现特定功能所需的库和组件,以及相应的配置文件。开发者只需在项目中引入相应的starter依赖,即可快速搭建…...

C/C++基础知识复习(27)

1) 移动语义和拷贝语义的区别 拷贝语义和移动语义是C中对象所有权管理的两种机制,主要在对象初始化、赋值或传参时体现。 拷贝语义 (Copy Semantics) 行为:通过深拷贝或浅拷贝,创建一个新对象,并将原对象的值或资源复制到新对象…...

IEC61850实现方案和测试-2

IEC61850实现方案和测试-1作为介绍实现方案和测试的第二篇文章,后续会继续更新,欢迎关注。 第一篇是:IEC61850实现方案和测试-1-CSDN博客 UCA详细测试用例下载: 链接: https://pan.baidu.com/s/1TTMlYRfzKITgrkWwwtcrDg 提取码:…...

flume-将日志采集到hdfs

看到hdfs大家应该做什么? 是的你应该去把集群打开, cd /export/servers/hadoop/sbin 启动集群 ./start-all.sh 在虚拟机hadoop02和hadoop03上的conf目录下配置相同的日志采集方案,‘ cd /export/servers/flume/conf 切换完成之后&#…...

一文学习开源框架LeakCanary

LeakCanary 简介 LeakCanary 是一个由 Square 开发的开源工具,主要用于检测和诊断 Android 应用中的内存泄漏问题。它通过自动化的方式帮助开发者捕捉和分析可能导致内存泄漏的对象,简化了内存问题的排查过程。 LeakCanary 的功能 自动检测内存泄漏&a…...

jetson orin系列开发版安装cuda的gpu版本的opencv

opencv安装包下载地址: https://github.com/opencv/opencv/扩展库下载地址: https://github.com/opencv/opencv_contrib1. 删除jetpack包中的opencv版本 原先的opencv库安装在目录/usr/lib/aarch64-linux-gnu/下(一般其他的第三方库也都安…...

数据结构-8.Java. 七大排序算法(中篇)

本篇博客给大家带来的是排序的知识点, 由于时间有限, 分两天来写, 中篇主要实现后三种排序算法: 冒泡排序,快速排序,下一篇讲 归并排序. 文章专栏: Java-数据结构 若有问题 评论区见 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作…...

数据结构C语言描述4(图文结合)--栈的实现,中序转后序表达式的实现

前言 这个专栏将会用纯C实现常用的数据结构和简单的算法;有C基础即可跟着学习,代码均可运行;准备考研的也可跟着写,个人感觉,如果时间充裕,手写一遍比看书、刷题管用很多,这也是本人采用纯C语言…...

python基本数据类型 -- 元组tuple

在 Python 中,元组(Tuple)是一种轻量级的、不可变的数据结构。与列表类似,元组用于存储有序的数据集合,但它一旦创建,其内容就无法更改。这种特性让元组在某些场景下更加安全和高效。本文将从定义、操作、应…...

tcpdump交叉编译

TCPDUMP在Libpcap上开发。 首先需要编译libcap。 网上那么多教程,下载地址都只给了一个英文的官网首页, 你尽可以试试,从里面找到下载地址都要费半天时间。 \color{red}网上那么多教程,下载地址都只给了一个英文的官网首页&#…...

Spring IOC注入方式、Bean作用域

Spring IOC注入 手动注入 set方法注入 需要提供set方法 public class UserService {private UserDao userDao; ​public void setUserDao(UserDao userDao) {this.userDao userDao;} } 设置属性字段的值 <bean id"userService" class"com.shsxt.servi…...

uniapp微信小程序转发跳转指定页面

onShareAppMessage 是微信小程序中的一个重要函数&#xff0c;用于自定义转发内容。当用户点击右上角的菜单按钮&#xff0c;并选择“转发”时&#xff0c;会触发这个函数。开发者可以在这个函数中返回一个对象&#xff0c;用于定义分享卡片的标题、图片、路径等信息。 使用场…...

利用uniapp开发鸿蒙:运行到鸿蒙模拟器—踩坑合集

从uniapp运行到鸿蒙模拟器上这一步&#xff0c;就有非常多的坑&#xff0c;一些常见的坑&#xff0c;官网都有介绍&#xff0c;就不再拿出来了&#xff0c;这里记录一下官网未记录的大坑 1.运行路径从hbuilderx启动鸿蒙模拟器 解决方法&#xff1a; Windows系统&#xff0c;官…...

【Vue】Vue3.0(二十五)Vue3.0中的具名插槽 的概念和使用场景

上篇文章 【Vue】Vue3.0&#xff08;二十四&#xff09;Vue3.0中 r e f s 、 refs 、 refs、parent 的概念和使用场景 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Vue专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年11月20日16点30分 …...

【pytorch-02】:张量的索引、形状操作和常见运算函数

文章目录 1 张量索引1.1 简单行列索引和列表索引1.2 布尔索引和多维索引 2 张量的形状操作2.1 reshape函数2.2 transpose和permute函数的使用2.3 view和contiguous函数2.4 squeeze和unsqueeze函数用法2.5 张量更改形状小结 3 常见运算函数 1 张量索引 1.1 简单行列索引和列表索…...

基于LSTM时间序列预测思想优化Qwen3对话连贯性

基于LSTM时间序列预测思想优化Qwen3对话连贯性 你有没有遇到过这种情况&#xff1f;和AI助手聊得正起劲&#xff0c;从天气聊到周末计划&#xff0c;再聊到最近看的电影&#xff0c;结果它突然冒出一句&#xff1a;“您刚才提到的那个项目需求是什么&#xff1f;”——得&…...

Live Avatar数字人生成避坑指南:硬件要求与常见问题解决

Live Avatar数字人生成避坑指南&#xff1a;硬件要求与常见问题解决 Live Avatar是阿里联合高校开源的一款端到端数字人生成系统&#xff0c;它能把一张人物照片、一段语音和几句文字描述&#xff0c;变成自然流畅的说话视频。听起来很酷&#xff0c;对吧&#xff1f;但现实往…...

微信好友数据分析与班级学生信息分析实战

微信好友数据分析与班级学生信息分析一、设计思想两个数据分析案例&#xff0c;旨在综合运用Python数据分析与可视化库&#xff08;Pandas、Matplotlib、PyEcharts、WordCloud、SnowNLP等&#xff09;&#xff0c;完成从数据读取、清洗、分析到可视化的全流程。设计思想如下&am…...

RVC模型GitHub开源项目实战:从Fork到贡献代码

RVC模型GitHub开源项目实战&#xff1a;从Fork到贡献代码 想为热门的RVC&#xff08;Retrieval-based Voice Conversion&#xff09;项目贡献一份力量&#xff0c;却不知道从何下手&#xff1f;看着GitHub上那些活跃的Pull Request&#xff0c;是不是既羡慕又有点无从下手的感…...

像素幻梦应用场景:独立开发者快速构建像素风APP启动页与加载动画

像素幻梦应用场景&#xff1a;独立开发者快速构建像素风APP启动页与加载动画 1. 为什么独立开发者需要像素幻梦 在移动应用市场竞争激烈的今天&#xff0c;一个独特的视觉风格往往能成为APP脱颖而出的关键。对于独立开发者而言&#xff0c;设计精美的启动页和加载动画不仅能提…...

【AI实战项目】项目二:语言模型构建与应用实战

分享一个大牛的人工智能教程。零基础&#xff01;通俗易懂&#xff01;风趣幽默&#xff01;希望你也加入到人工智能的队伍中来&#xff01;请轻击人工智能教程​​https://www.captainai.net/troubleshooter 项目背景&#xff1a; 在当今AI蓬勃发展的时代&#xff0c;语⾔模…...

OpenClaw任务链设计:千问3.5-35B-A3B-FP8复杂流程自动化

OpenClaw任务链设计&#xff1a;千问3.5-35B-A3B-FP8复杂流程自动化 1. 为什么需要任务链自动化 上周我遇到一个典型的工作场景&#xff1a;需要从20份PDF报告中提取关键数据&#xff0c;整理成Excel表格&#xff0c;再根据这些数据生成分析图表&#xff0c;最后通过邮件发送…...

从开发到安全:SpringBoot/Struts2/Laravel框架那些“第三方组件”挖出的坑,你的项目踩中了吗?

第三方组件安全黑洞&#xff1a;主流开发框架中那些被忽视的高危依赖 当我们在讨论框架安全时&#xff0c;往往聚焦于SpringBoot、Laravel等核心框架本身&#xff0c;却忽略了那些如影随形的第三方组件。这些"搭便车"的依赖项&#xff0c;正成为企业应用安全的阿喀琉…...

LeetCode 二叉搜索树双神题通关!有序数组转平衡 BST + 验证 BST,小白递归一把梭

前言 二叉搜索树&#xff08;BST&#xff09;是算法刷题的高频必考知识点&#xff01;今天给大家带来两道最经典、最基础的 BST 题目&#xff0c;全程用最简单的递归实现&#xff0c;代码干净、思路直白&#xff0c;不用死记硬背&#xff0c;看完就能直接写&#xff01; 一道教…...

前端手写电子签系统实战:SVG为何是合同图片合成的最优解

一、前端手写电子签系统核心需求拆解 在开发手写电子签系统时&#xff0c;前端需满足以下核心业务与技术需求&#xff0c;这也是方案选型的核心依据&#xff1a; 高清无损&#xff1a;合同属于正式法律文件&#xff0c;签名、填写的字段文字需保证任意缩放、打印后均清晰无失真…...