Linux进程管理:(二)进程调度原语
文章说明:
-
Linux内核版本:5.0
-
架构:ARM64
-
参考资料及图片来源:《奔跑吧Linux内核》
-
Linux 5.0内核源码注释仓库地址:
zhangzihengya/LinuxSourceCode_v5.0_study (github.com)
进程调度的概念比较简单,假设在一个单核处理器的系统中,同一时刻只有一个进程可以拥有处理器资源,那么其他的进程只能在就绪队列(runqueue)中等待,等到处理器空闲了之后才有机会获取处理器资源来运行。在这种场景下,操作系统就需要从众多的就绪进程中选择—个最合适的进程来运行,这个就是进程调度器(scheduler)要做的事情。调度器产生的最主要原因是提高处理器的利用率(CPUutilization)
1. 进程优先级和权重
Linux操作系统最早采用nice值来调整进程的优先级。nice值的思想是要对其他进程友好,降低优先级来支持其他进程消耗更多的处理器时间,它的范围是-20~+19,默认值是0。nice值越大,优先级反而越低; nice值越低,优先级越高。nice值-20表示这个进程是非常重要的,优先级最高;而nice值19则表示允许其他进程比这个线程优先享有宝贵的CPU时间,这也是nice值的由来。
内核使用0~139的数值表示进程的优先级,数值越小,优先级越高。优先级0-99给实时进程使用, 100-139给普通进程使用。另外,在用户空间中有一个传统的变量nice,它用于映射普通进程的优先级,即100-139。
优先级在Linux内核中的划分方式如下:
- 普通进程的优先级:100~139
- 实时进程的优先级:0~99
- deadline进程的优先级:-1
task_struct 数据结构中使用4个成员描述进程的优先级:
struct task_struct {...// 动态优先级,是调度类考虑的优先级// 0~139,值越小优先级越高int prio;// 静态优先级,在进程启动时分配。内核不存储 nice 值,取而代之的是 static_prio// NICE_TO_PRIO 宏可以把nice值转换成 static_prio// static_prio 不会随着时间而改变,用户可以通过 nice 或 sched_setscheduler 等系统调用来修改该值// 100~139,值越小优先级越高int static_prio;// 基于 static_prio 和调度策略计算出来的优先级,在创建进程时会继承父进程的 normal_prio// 对于普通进程,normal_prio 等同于 static_prio// 对于实时进程,会根据 rt_priority 重新计算 normal_prio,详见 effective_prio 函数// 0~139,值越小优先级越高int normal_prio;// 实时进程的优先级// 0~99,值越大越高unsigned int rt_priority;...
}
在Linux内核中除了使用优先级来表示进程的轻重缓急之外,在实际调度器里还使用权重的概念来表示进程的优先级。为了计算方便,内核约定nice值为0的进程的权重值为1024,其他nice值对应的进程的权重值可以通过查表的方式来获取,内核预先计算好了一个表 sched_prio_to_weight[40],表中下标对应nice值[-20~19]。
const int sched_prio_to_weight[40] = {/* -20 */ 88761, 71755, 56483, 46273, 36291,/* -15 */ 29154, 23254, 18705, 14949, 11916,/* -10 */ 9548, 7620, 6100, 4904, 3906,/* -5 */ 3121, 2501, 1991, 1586, 1277,/* 0 */ 1024, 820, 655, 526, 423,/* 5 */ 335, 272, 215, 172, 137,/* 10 */ 110, 87, 70, 56, 45,/* 15 */ 36, 29, 23, 18, 15,
};
2. 调度策略
进程调度依赖于调度策略(schedule policy),Linux内核把相同类型的调度策略抽象成调度类 (schedule class)。不同类型的进程采用不同的调度策略,目前Linux内核中默认实现了5种调度类,分别是stop、deadline、realtime、CFS和idle,它们分别使用sched_class来定义,并且通过next指针串联在—起,如下图所示:
Linux内核支持的5个调度类的异同如下表所示:
相应的源码定义如下:
// 调度策略
// 分时调度策略,非实时进程的默认调度策略,Linux内核没有实现这类调度策略
#define SCHED_NORMAL 0
// 先进先出调度策略
#define SCHED_FIFO 1
// 循环调度策略,表示优先级相同的进程以循环分享时间的方式来运行
#define SCHED_RR 2
// 批处理调度,这个调度策略表示让调度器认为该进程是 CPU 消耗型的,因此,调度器对这类进程的唤醒惩罚比较小。
// 在 Linux 内核里,该类调度策略表示使用 CFS
#define SCHED_BATCH 3
/* SCHED_ISO: reserved but not implemented yet */
// 空闲调度策略,用于运行低优先级的任务
#define SCHED_IDLE 5
// 用于调度有严格时间要求的实时进程
#define SCHED_DEADLINE 6
3. 调度算法
调度算法 | 时间复杂度 | 算法思想 | 缺点 |
---|---|---|---|
基于优先级的调度算法 | O(n) | 分配给进程时间片,时间片表示进程调度进来与调度出去之间所能持续运行的时间长度 | 分配多长的时间片是一个需要考虑的问题,时间片过长的话会导致交互型的进程得 不到及时响应,时间片过短的话会增大进程切换带来的处理器消耗 |
多级反馈队列算法 | O(1) | 把进程按照优先级分成多个队列,相同优先级的进程在同一个队列中 | 参数如何确定和优化。如系统需要设计多少个优先级队列? 时间片应该设置成多少? |
基于多级反馈队列的调度算法 | O(1) | 每个CPU各自维护一个属于自己的就绪队列,这样减少了锁的争用。就绪队列由两个优先级数组组成,即活跃(active)优先级数组和过期(expired)优先级数组,每个优先级数组包含MAX_PRIO(140)个优先级队列,也就是每个优先级对应一个队列,活跃优先级数组中所有进程用完了时间片之后,活跃优先级数组和过期优先级数组会进行互换 | |
CFS | O(1) | CFS抛弃以前固定时间片和固定调度周期的算法,而采用进程权重值的比例来量化和计算实际运行时间。引入虚拟时间(vmntime)的概念,每个进程的虚拟时间是实际运行时间相对于nice值为0的进程的权重的比值。CFS总是选择虚拟时间最短的进程 |
相关文章:

Linux进程管理:(二)进程调度原语
文章说明: Linux内核版本:5.0 架构:ARM64 参考资料及图片来源:《奔跑吧Linux内核》 Linux 5.0内核源码注释仓库地址: zhangzihengya/LinuxSourceCode_v5.0_study (github.com) 进程调度的概念比较简单,…...
Compose 介绍
Compose 介绍 Android Compose 是 Google 官方推出的用于构建原生 Android UI 的现代工具包。它使用 Kotlin 语言编写,可以帮助开发人员更轻松、更快速地创建精美、响应式和高性能的 Android 应用。 Compose 的优势 声明式 UI: Compose 使用声明式 UI…...

5分钟搞定Python中函数的参数
函数的灵活性非常高,除了常规定义的位置参数以外,还支持默认参数、关键字参数、以及可变参数 ... 这样以来,不但能应对各种复杂的情况,甚至还可以简化调用者的代码。 位置参数 在调用函数时,一般会根据函数定义的参数…...

Gitlab: 私有化部署
目录 1. 说明 2. 资源要求 3. 安装 4. 配置实践 4.1 服务器 4.2 人员与项目 4.2 部署准备 4.2.1 访问变量及用户账号设置 4.2.2 Runner设置 4.2.3 要点 5. 应用项目 CI/CD 6. 参考 1. 说明 gitlab是一个强大且免费的代码管理/部署工具,能统一集成代码仓…...

深入理解Linux线程(LWP):概念、结构与实现机制(2)
🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:会いたい—Naomile 1:12━━━━━━️💟──────── 4:59 🔄 ◀️ ⏸ ▶️ ☰ &a…...
VBS脚本搞定,快速批量提取一堆Excel文件中的数据
1.需求诞生 小王就职于一家国有大型企业,工作业务十分繁忙,在处理企业某业务数据时,需要从上千个Excel文件中提取某一单元格位置的数据,并整理到另一个Excel文件。要说是这样的Excel文件仅有几个或者十几个也还好,手动…...

大数据分析案例-基于SVM支持向量机算法构建手机价格分类预测模型
🤵♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞Ǵ…...

WPF 滑动条样式
效果图: 浅色: 深色: 滑动条部分代码: <Style x:Key"RepeatButtonTransparent" TargetType"{x:Type RepeatButton}"><Setter Property"OverridesDefaultStyle" Value"true"/&g…...

论文设计任务书学习文档|基于Web的个性化简历职位推荐系统的设计与实现
文章目录 论文(设计)题目:基于Web的个性化简历职位推荐系统的设计与实现1、论文(设计)的主要任务及目标2、论文(设计)的主要内容3、论文(设计)的基本要求4、进度安排论文(设计)题目:基于Web的个性化简历职位推荐系统的设计与实现 1、论文(设计)的主要任务及目标…...

Win11系统安装安卓子系统教程
随着Win11系统的不断普及,以及硬件设备的更新换代,我相信很多同学都已经更新并使用到了最新的Win11系统。那么,Win11系统最受期待的功能“Windows Subsystem for Android”(简称WSA),即《安卓子系统》。他可…...

Python实现双向链表:从基础到应用
一、引言 双向链表是一种比单向链表更复杂的数据结构,每个节点除了包含数据和指向下一个节点的指针外,还包含一个指向前一个节点的指针。这种结构使得我们可以从链表的任何节点开始,向前或向后遍历链表。 目录 一、引言 二、节点定义 三、…...
c# 读取DataGridView中的数据
/// <summary> /// 读取DataGridView中的数据 /// </summary> /// <param name"dgv">DataGridView对象</param> /// <returns>DataTable对象</returns> private DataTable GetDgvToTab…...

Stable Diffusion中的Clip模型
基础介绍 Stable Diffusion 是一个文本到图像的生成模型,它能够根据用户输入的文本提示(prompt)生成相应的图像。在这个模型中,CLIP(Contrastive Language-Image Pre-training)模型扮演了一个关键的角色&a…...

Python批量提取文件夹中图片的名称及路径到指定的.txt文件中
目录 一、代码二、提取效果 一、代码 import os# 定义要保存的文件名 file_name "TestImage/Image_Visible_Gray.txt"# 读取文件夹路径 folder_path "TestImage/Image_Visible_Gray"# 遍历文件夹中的所有文件 with open(file_name, "w") as f…...

微软开源 SBOM 生成工具:sbom-tool下载及使用详解
github地址 GitHub - microsoft/sbom-tool: The SBOM tool is a highly scalable and enterprise ready tool to create SPDX 2.2 compatible SBOMs for any variety of artifacts.The SBOM tool is a highly scalable and enterprise ready tool to create SPDX 2.2 compatib…...

【办公类-18-03】(Python)中班米罗可儿证书批量生成打印(班级、姓名)
作品展示——米罗可儿证书打印幼儿姓名 背景需求 2024年3月1日,中4班孩子一起整理美术操作材料《米罗可儿》的操作本——将每一页纸撕下来,分类摆放、确保纸张上下位置正确。每位孩子们都非常厉害,不仅完成了自己的一本,还将没有…...
js【详解】数据类型原理(含变量赋值详解-浅拷贝)
JavaScript 中的数据按存储方式的不同,分为值类型和引用类型。 值类型(共 6 种):赋值的时候传值 —— 数字、字符串、布尔值、null 、undefined,Symbol引用类型(仅 1 种):赋值的时候…...
SAM 影像分割——地理空间数据的分段模型的数据调参和自动分割分析
本笔记本展示了如何使用 Segment Anything Model (SAM) 从图像中分割对象,只需几行代码即可完成。 请确保在本笔记本中使用 GPU 运行时。对于 Google Colab,请转到运行时 -> 更改运行时类型,然后选择 GPU 作为硬件加速器。 地理空间数据的分段模型 Segment Anything M…...
Java底层自学大纲_设计模式篇
设计模式专题_自学大纲所属类别学习主题建议课时(h) A 深入理解设计模式001 SOLID设计原则和策略模式2.5 A 深入理解设计模式002 责任链模式2.5 A 深入理解设计模式003 工厂模式和模版方法模式2.5 A 深入理解设计模式004 装饰者模式2.5 A 深入理解设…...

详解字符串函数<string.h>(上)
1. strlen函数的使用和模拟实现 size_t strlen(const char* str); 1.1 函数功能以及用法 字符串长度 strlen函数的功能是计算字符串的长度。在使用时,要求用户传入需要计算长度的字符串的起始位置,并返回字符串的长度。 #include <stdio.h> #…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...

网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...

三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

《Docker》架构
文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器,docker,镜像,k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...

Linux操作系统共享Windows操作系统的文件
目录 一、共享文件 二、挂载 一、共享文件 点击虚拟机选项-设置 点击选项,设置文件夹共享为总是启用,点击添加,可添加需要共享的文件夹 查询是否共享成功 ls /mnt/hgfs 如果显示Download(这是我共享的文件夹)&…...

使用ch340继电器完成随机断电测试
前言 如图所示是市面上常见的OTA压测继电器,通过ch340串口模块完成对继电器的分路控制,这里我编写了一个脚本方便对4路继电器的控制,可以设置开启时间,关闭时间,复位等功能 软件界面 在设备管理器查看串口号后&…...