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

Linux:理解O(1)调度算法的设计精髓

目录

一、从厨房看调度器本质

二、O(1)算法的核心架构

1.时间复杂度的革命

2.动态优先级魔法

三、算法运行的全景图

1.时间片分配策略 

2.上下文切换的艺术


前言:前面文章提到关于并发的概念,并发针对的是单核的CPU上同时运行很多情况,并不是某个程序在CPU上运行就一直运行,而是根据一定的时间片和调度算法来进行合理的调度,从而引出了优先级的概念,造成的最终目的就是可以让每一个进程都享受到CPU上的资源,否则会导致进程饥饿。

一、从厨房看调度器本质

想象一家米其林餐厅的后厨:主厨需要同时处理 10 位客人的订单,5 个灶台同时开火,3 位帮厨待命。此时:

  • 牛排需要每 30 秒翻面

  • 浓汤需要持续搅拌防糊底

  • 甜点装饰需要精确到秒

  • 突发 VIP 订单要优先处理

优秀的主厨会动态调整任务顺序,既保证出餐速度又维持菜品质量。这正是操作系统进程调度的现实映射——O(1) 调度算法就是 Linux 内核这位"数字主厨"的调度秘籍。

二、O(1)算法的核心架构

1.时间复杂度的革命

传统调度器(如 Linux 2.4 的 O(n) 调度器)像新手主厨逐个检查每个订单:

// 伪代码示意 O(n) 遍历
for_each_process(p) {if (p->priority > max_prio)max_prio = p->priority;
}

这种线性扫描在面对数千进程时效率骤降。O(1) 调度器通过创新数据结构实现质的飞跃:

  • 双数组结构:active(待运行)和 expired(已耗尽时间片)

  • 位图索引:140 级优先级(0-139),每个优先级对应队列

  • 常数时间查询:通过 __ffs() 指令直接定位最高优先级队列

2.动态优先级魔法

算法通过智能调整避免"饿死"交互式进程:

// 动态优先级计算(简化版)
bonus = CURRENT->sleep_avg / 32 - MAX_BONUS/2;
priority = MAX_RT_PRIO + (bonus > 0 ? bonus : 0);
  • 睡眠时间统计:记录进程在可运行状态外的停留时间

  • 交互式奖励:频繁等待 I/O 的进程获得优先级提升

  • CPU 密集型惩罚:持续占用 CPU 的进程优先级衰减

三、算法运行的全景图

1.时间片分配策略 

# 时间片计算公式
if priority < 120:time_slice = (140 - priority) * 20 / CPU_LOAD
else:time_slice = (140 - priority) * 5 / CPU_LOAD
  • 实时进程:获得更长的时间片(20ms 级)

  • 普通进程:短时间片(5ms 级)

  • 负载自适应:根据系统负载动态调整

2.上下文切换的艺术

在学习 C 语言时,会接触到各类函数,部分函数有返回值,能被函数外部的变量接收。从函数栈帧的原理来看,函数创建后执行至结束,其栈帧会被销毁。而函数的数据以及外部程序要接收的数据,其来源与函数栈帧的传值方式相关。函数栈帧的传值是通过 CPU 寄存器进行的,程序运行过程中产生的各种临时数据也都存储在寄存器里。

当 CPU 进行进程切换时,会将当前正在运行程序的临时数据存储起来。在早期版本的内核中,这些数据存储于进程的进程控制块(PCB)中,而在当前版本中,虽并非直接存储在 PCB 中,但也是与 PCB 相关的存储位置。这意味着程序运行时的数据是直接或间接存储于 PCB 中的。

如此一来,当该进程后续被重新调度回来时,寄存器便能从进程的 PCB 中获取当时运行位置所产生的数据,并在此基础上继续运行,从而实现进程切换,且保证程序运行时产生的数据不会丢失。

 

    A[时钟中断] --> B{检查时间片}B -- 未耗尽 --> C[继续运行]B -- 已耗尽 --> D{优先级调整}D --> E[移入expired数组]E --> F{active数组空?}F -- 是 --> G[交换active/expired]F -- 否 --> H[选择新进程]

这个状态机确保了:

  1. 硬件定时器驱动调度节奏

  2. 双数组实现无锁切换

  3. 位图操作保持 O(1) 复杂度

上下文数据的保存和恢复:

  • 上下文数据的保存:当一个进程在运行中,因为某些原因(比如时间片到了),需要暂时停止运行,让出 CPU,此时进程需要保存好自己所有的临时数据(即当前进程的上下文数据)到对应的 PCB 中,保存的目的是为了恢复。
  • 上下文数据的恢复:当这个进程又被切换回来时,或者切换到下一个新进程运行时,只需要把该进程的 PCB 中的上下文数据重新写入到 CPU 寄存器中,即可恢复运行。

【总结】

O(1) 调度器的设计体现了 Unix 哲学的经典原则:

  • 机制与策略分离:核心调度框架与具体优先级策略解耦

  • 时空平衡:用空间换时间(双数组+位图)

  • 渐进式优化:通过历史行为预测未来需求(sleep_avg)

虽然 CFS (Completely Fair Scheduler) 在 2.6.23 后取代了 O(1),但前者继承并发扬了其精髓:

  • 红黑树代替优先级数组

  • 虚拟时间替代静态优先级

  • 纳秒级精度替代毫秒级时间片

这种演进如同从机械手表到原子钟的跨越,但核心思想始终如一:在有限的硬件资源中,寻找最优的任务执行轨迹。理解 O(1) 算法,不仅是学习一个经典案例,更是掌握系统设计的底层思维——在约束中创造秩序,在混沌中寻找最优解。

相关文章:

Linux:理解O(1)调度算法的设计精髓

目录 一、从厨房看调度器本质 二、O(1)算法的核心架构 1.时间复杂度的革命 2.动态优先级魔法 三、算法运行的全景图 1.时间片分配策略 2.上下文切换的艺术 前言&#xff1a;前面文章提到关于并发的概念&#xff0c;并发针对的是单核的CPU上同时运行很多情况&#xff0c…...

[C++][cmake]使用C++部署yolov12目标检测的tensorrt模型支持图片视频推理windows测试通过

最近悄悄出了yolov12框架&#xff0c;标志着目标检测又多了一个检测利器&#xff0c;于是尝试在windows下部署yolov12的tensorrt模型&#xff0c;并最终成功。 重要说明&#xff1a;安装环境视为最基础操作&#xff0c;博文不做环境具体步骤&#xff0c;可以百度查询对应安装步…...

Uppy - 免费开源、功能强大的新一代 web 文件上传组件,支持集成到 Vue 项目

Uppy 这个优质的前端组件&#xff0c;可以解决几乎所有的文件上传问题&#xff0c;最近发布了 TS 重写的 4.0 新版本&#xff0c;实用性更强了。 Uppy 是一个 UI 外观时尚、模块化的 JavaScript 文件上传组件&#xff0c;这个组件可以与任何 web 技术栈集成&#xff0c;不仅轻…...

【游戏——BFS+分层图】

题目 分析 但凡是最优方案可能需要访问同一个点的情况&#xff0c;都需要应用“拆点”&#xff0c;或者说分层图的技巧。多出来的维度主要是区分同一个点的不同状态而用。 对于本题&#xff0c;访问的时机便是一个区分点。 对于类似题“AB路线”&#xff0c;同一个K段的位置是…...

SSL 证书是 SSL 协议实现安全通信的必要组成部分

SSL证书和SSL/TLS协议有着密切的关系&#xff0c;但它们本质上是不同的概念。下面是两者的区别和它们之间的关系的表格&#xff1a; 属性SSL/TLS 协议SSL证书英文全称SSL&#xff08;Secure Sockets Layer&#xff09;&#xff0c;TLS&#xff08;Transport Layer Security&am…...

Spring 源码硬核解析系列专题(七):Spring Boot 与 Spring Cloud 的微服务源码解析

在前几期中,我们从 Spring 核心的 IoC、AOP、事务管理,到 Spring Boot 的自动装配,逐步揭示了 Spring 生态的底层原理。随着微服务架构的流行,Spring Boot 结合 Spring Cloud 成为了构建分布式系统的主流选择。本篇将深入 Spring Cloud 的核心组件,以服务注册与发现(Eure…...

嵌入式开发:傅里叶变换(5):STM32和Matlab联调验证FFT

目录 1. MATLAB获取 STM32 的原始数据 2. 将数据上传到电脑 3. MATLAB 接收数据并验证 STM32进行傅里叶代码 结果分析 STM32 和 MATLAB 联调是嵌入式开发中常见的工作流程&#xff0c;通常目的是将 STM32 采集的数据或控制信号传输到 MATLAB 中进行实时处理、分析和可视化…...

C# 根据Ollama+DeepSeekR1开发本地AI辅助办公助手

在上一篇《访问DeepSeekR1本地部署API服务搭建自己的AI办公助手》中&#xff0c;我们通过通过Ollama提供的本地API接口用Python实现了一个简易的AI办公助手&#xff0c;但是需要运行Py脚本&#xff0c;还比较麻烦&#xff0c;下面我们用C#依据Ollama提供的API接口开发一个本地A…...

洛谷 P8705:[蓝桥杯 2020 省 B1] 填空题之“试题 E :矩阵” ← 卡特兰数

【题目来源】 https://www.luogu.com.cn/problem/P8705 【题目描述】 把 1∼2020 放在 21010 的矩阵里。要求同一行中右边的比左边大&#xff0c;同一列中下边的比上边的大。一共有多少种方案? 答案很大&#xff0c;你只需要给出方案数除以 2020 的余数即可。 【答案提交】 …...

我的AI工具箱Tauri版-FluxCharacterGeneration参考图像生成人像手办(Flux 版)

本教程基于自研的AI工具箱Tauri版进行ComfyUI工作流FluxCharacterGeneration参考图像生成人像手办&#xff08;Flux 版&#xff09;。 我的AI工具箱Tauri版 - FluxCharacterGeneration参考图像生成人像手办&#xff08;Flux版&#xff09; 基于先进的FLUX模型&#xff0c;通过…...

DeepSeek开源周Day2:DeepEP - 专为 MoE 模型设计的超高效 GPU 通信库

项目地址&#xff1a;https://github.com/deepseek-ai/DeepEP 开源日历&#xff1a;2025-02-24起 每日9AM(北京时间)更新&#xff0c;持续五天 (2/5)&#xff01; ​ ​ 引言 在大模型训练中&#xff0c;混合专家模型&#xff08;Mixture-of-Experts, MoE&#xff09;因其动…...

51单片机-串口通信编程

串行口工作之前&#xff0c;应对其进行初始化&#xff0c;主要是设置产生波特率的定时器1、串行口控制盒中断控制。具体步骤如下&#xff1a; 确定T1的工作方式&#xff08;编程TMOD寄存器&#xff09;计算T1的初值&#xff0c;装载TH1\TL1启动T1&#xff08;编程TCON中的TR1位…...

python实现基于文心一言大模型的sql小工具

一、准备工作 注册与登录&#xff1a; 登录百度智能云千帆控制台&#xff0c;注册并登录您的账号。 创建千帆应用&#xff1a; 根据实际需求创建千帆应用。创建成功后&#xff0c;获取AppID、API Key、Secret Key等信息。如果已有千帆应用&#xff0c;可以直接查看已有应用的AP…...

deepseek 导出导入模型(docker)

前言 实现导出导入deepseek 模型。deepseek 安装docker下参考 docker 导出模型 实际生产环境建议使用docker-compose.yml进行布局&#xff0c;然后持久化ollama模型数据到本地参考 echo "start ollama" docker start ollama#压缩容器内文件夹&#xff0c;然后拷贝…...

前言:什么是大模型微调

一、大模型微调的基础知识 1. 什么是大模型微调&#xff1f; 大模型微调&#xff08;Fine-tuning&#xff09;是指在预训练模型的基础上&#xff0c;针对特定的任务或数据集进行进一步训练的过程。预训练模型通常在大规模的通用数据上训练&#xff0c;具备广泛的语言理解和生…...

TCPDF 任意文件读取漏洞:隐藏在 PDF 生成背后的危险

在网络安全的世界里&#xff0c;漏洞就像隐藏在黑暗中的“定时炸弹”&#xff0c;稍有不慎就会引发灾难性的后果。今天&#xff0c;我们要聊的是一个与 PDF 生成相关的漏洞——TCPDF 任意文件读取漏洞。这个漏洞可能让攻击者轻松读取服务器上的敏感文件&#xff0c;甚至获取整个…...

unity学习53:UI的子容器:面板panel

目录 1 UI的最底层容器&#xff1a;canvas 1.1 UI的最底层容器&#xff1a;canvas 1.2 UI的合理结构 2 UI的子容器&#xff1a;面板panel 2.1 创建panel 2.2 面板的本质&#xff1a; image &#xff0c;就是一个透明的图片&#xff0c;1个空容器 3 面板的属性 4 面板的…...

水环境水质在线监测系统解决方案

在当今社会&#xff0c;水资源作为人类生存和发展的基础性资源&#xff0c;其质量的优劣直接关系到生态平衡、人类健康以及社会经济的可持续发展。然而&#xff0c;随着工业化、城市化的快速推进&#xff0c;各类污染物不断排入水体&#xff0c;导致水环境面临严峻挑战。水环境…...

HBuilder X中,uni-app、js的延时操作及定时器

完整源码下载 https://download.csdn.net/download/luckyext/90430165 在HBuilder X中&#xff0c;uni-app、js的延时操作及定时器可以用setTimeout和setInterval这两个函数来实现。 1.setTimeout函数用于在指定的毫秒数后执行一次函数。 例如&#xff0c; 2秒后弹出一个提…...

BigDecimal线上异常解决方案:避免科学计数法输出的坑

文章目录 问题背景为什么BigDecimal会输出科学计数法&#xff1f;线上异常场景场景1&#xff1a;数据传递异常场景2&#xff1a;日志记录异常场景3&#xff1a;数据存储异常 解决方案1. 使用toPlainString()方法2. 设置格式化输出3. 自定义工具类 代码示例总结 在Java开发中&am…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

jdbc查询mysql数据库时,出现id顺序错误的情况

我在repository中的查询语句如下所示&#xff0c;即传入一个List<intager>的数据&#xff0c;返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致&#xff0c;会导致返回的id是从小到大排列的&#xff0c;但我不希望这样。 Query("SELECT NEW com…...

React核心概念:State是什么?如何用useState管理组件自己的数据?

系列回顾&#xff1a; 在上一篇《React入门第一步》中&#xff0c;我们已经成功创建并运行了第一个React项目。我们学会了用Vite初始化项目&#xff0c;并修改了App.jsx组件&#xff0c;让页面显示出我们想要的文字。但是&#xff0c;那个页面是“死”的&#xff0c;它只是静态…...

Android Framework预装traceroute执行文件到system/bin下

文章目录 Android SDK中寻找traceroute代码内置traceroute到SDK中traceroute参数说明-I 参数&#xff08;使用 ICMP Echo 请求&#xff09;-T 参数&#xff08;使用 TCP SYN 包&#xff09; 相关文章 Android SDK中寻找traceroute代码 设备使用的是Android 11&#xff0c;在/s…...

本地部署drawDB结合内网穿透技术实现数据库远程管控方案

文章目录 前言1. Windows本地部署DrawDB2. 安装Cpolar内网穿透3. 实现公网访问DrawDB4. 固定DrawDB公网地址 前言 在数字化浪潮席卷全球的背景下&#xff0c;数据治理能力正日益成为构建现代企业核心竞争力的关键因素。无论是全球500强企业的数据中枢系统&#xff0c;还是初创…...