一文搞懂Linux内核进程CPU调度基本原理
为什么需要调度
进程调度的概念比较简单,我们假设在一个单核处理器的系统中,同一时刻只有一个进程可以拥有处理器资源,那么其他的进程只能在就绪队列中等待,等到处理器空闲之后才有计划获得处理器资源来运行。在这种场景下,操作系统就需要从众多的就绪进程中选择一个最合适的进程来运行,这个就是调度器需要做的事情。
作为一个通用的操作系统,需要兼顾各种类型的进程,包括交互式进程、批处理进程、实时进程等。其特征如下:
交互式进程: 与人机交互的进程,例如鼠标、键盘、触摸屏等相关的应用,这类进程的特点是系统响应时间越短越好,否则用户就会抱怨系统卡顿
批处理进程: 此类进程默默运行,可能会占用比较多的系统资源,对响应时间没有确定的要求
实时进程: 有些应用对整体时延有严格的要求,如VR设备,从头部转动到画面显示的间隔时间有明确的要求,否则人的体验不是太好;同时例如工业控制系统,不符合时延可能会导致严重的事故。
我们以生活中为例,来看看调度器对我们实际生活的影响,以我们手机上的一个场景为例:
如我们手机上运行一个机器学习的程序,大约CPU需要运行30分钟,我们也需要播放音乐
如果没有调度器:

对于手机上运行的学习进程和播放进程,学习进程属于批处理进程,而播放音乐属于实时进程,如果整体播放延时比较大就会出现卡顿的情况,用户体验就会很差。如果没有调度器,对于用户就需要30分钟才能播放音乐,那么它可能等不到30分钟就会抛弃这个手机。

调度器“任性化”将程序切片执行,对于用户就可以边听音乐边等待他的程序运行完,能够完美地实现二者的兼容。
资料直通车:最新Linux内核源码资料文档+视频资料
内核学习地址:Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈
如何设计一个调度器
2.1 什么是调度器
通常来说,操作系统是应用程序和可用资源直接的媒体,CPU是一个重要的资源,调度器可以临时分配一个任务在CPU上执行。为了使各个进程间可以公平共享CPU时间,而同时又要考虑不同的任务优先级,所以就需要一个调度器,来保证以下功能
有效的分配CPU时间片,根据用户的目标来提供一个很好的用户体验
当面对一些互相冲突的目标的时候,提供一个最优化的调度算法,例如既要为关键实时任务最小响应时间,又要最大限度的提高CPU的总体利用率
2. 2 进程分类
如果站在CPU的角度来看进程,有些进程一直占用处理器,有些进程只需要一部分处理器资源即可。所以进程按照这个特性可以分为两类
- CPU消耗型:
CPU消耗型的进程会把大部分的时间用在运行代码上,并且会一直占用CPU。一个常见的例子就是while循环的运行,如运行大量计算的程序等。
- IO消耗性:
IO消耗性的进程会把大部分的时间用在提交I/O请求或等待I/O请求,所以这类的进程通常只需要很少的处理器计算资源即可,如需要键盘的输入进程或等待网路I/O的进程。
2.3 调度器目标
知道了进程的分类,那就可以知道哪些场景需要调度来协调,如IO消耗性的,例如磁盘,打印机,网络等场景。调度在不同场景下的目标有
- 高吞吐量: 最大系统利用率(高吞吐量),对于一些批处理系统中需要考虑
- 低响应时间: 此类进程经常与用户进行交互, 因此需要花费很多时间等待键盘和鼠标操作. 当接受了用户的输入后, 进程必须很快被唤醒, 否则用户会感觉系统反应迟钝,主要用于一些交互式系统需要重点考虑
- 低功耗: 对于目前的移动设备,如何设计一个更优的调度算法,来保证系统的低功耗也需要重点考虑
- 实时性: 这些进程由很强的调度需要, 这样的进程绝不会被低优先级的进程阻塞. 并且他们的响应时间要尽可能的短
- 为了达到一些共有的目标,要达到系统资源的高利用率,多任务公平性,低调度开销,所以需要设计调度器基于以下的场景进行考虑
- 降低周转时间: 任务第一次进入系统到执行结束的时间,使批处理用户等待输出的时间尽可能短
- 降低响应时间: 任务第一次进入系统到第一次给用户输出时间,使交互用户的响应时间尽可能短
- 实时性: 在任务的截止时间内要完成任务
- 公平性: 每个任务都应该有机会执行,不能饿死,保证每个进程得到合理的CPU时间
- 开销低: 调度器是为了优化系统,而非制造性能Bug
- 可扩展性: 随着任务数量不断增加,仍然能正常工作
- 吞吐量: 使单位时间内处理的进程数量尽可能多
2.4 调度策略
确定如何从就绪队列中选择下一个执行的进程进入调度,需要解决以下问题
- 如何挑选就绪队列中的哪一个进程
- 通过什么样的调度准则来选择
2.5 如何设计好的调度算法
调度算法的要求,希望得到**“更快”**服务,那么如何定义什么是更快呢?根据调度器的目标,其可以重点关注:
- 高吞吐量:传输文件时的高带宽
- 低响应延时:玩游戏时的低延迟
调度器的响应目标考虑:
- 减小响应时间:及时处理用户的输入请求,尽快将输出反馈给用户
- 减小平均响应的时间波动:在交互系统中,可预测性比高差异低平均更重要
- 低延迟调度改善了用户的交互体验:如果移动鼠标时,屏幕中的光标没动,那么客户会如何做呢?会不会重启
处理器调度吞吐 量目标考虑:
- 增加吞吐量:减小开销,主要是上下文切换的开销,系统资源的高利用(CPU /IO设备)
- 减小等待时间:减小每个进程的等待时间
处理器公平的定义:
- 保证每个进程占用相同的CPU时间
- 保证每个进程的等待时间相同
3 调度算法
3.1 先来先服务算法(First Come First Served, FCFS)
每次从就绪队列选择最先进入队列的进程,然后一直运行,直到进程退出或被阻塞,才会继续从队列中选择第一个进程接着运行。
依据进程进入就绪队列的先后顺序排列,进程进入等待或者结束状态时,就绪队列中的下一个进程占用CPU,3个进程,计算时间分别为12,3,3,FCFS算法的周转时间,根据任务到达的顺序不同,周转时间不同

结合大家学习中,遇到的实际例子,我们来学习下整个过程,例如该过程中,调度器是我们生活中遇到的学霸,而此时有3个同学想学霸请教问题,其思路如下:

该问题对于C同学来说,有一个很大的问题是,我的问题很简单,却需要等那么长的时间。
3.2 短进程优先算法(SPN)
它会优先选择运行时间最短的进程来运行,这有助于提高系统的吞吐量。
选择就绪队列中执行时间最短进程占用CPU进入运行状态,就绪队列按预期的执行时间来排序

进程的平均周转时间为:

还是基于刚才学霸解决问题的实例来看看这个算法的执行顺序,首先A同学先执行,当执行到2后,同学B和C都来寻求学霸解决问题,但是此时A占用了学霸,所以当A解决完问题后,发现同学C问题简单,所以就优先解决C的问题:

3.3 时间片轮转算法(RR, Round-Robin)
每个进程被分配一个时间段,称为时间片(*Quantum*),即允许该进程在该时间段中运行。
如果时间片用完,进程还在运行,那么将会把此进程从 CPU 释放出来,并把 CPU 分配另外一个进程;如果该进程在时间片结束前阻塞或结束,则 CPU 立即进行切换;
通过时间片,分配处理器资源的基本单元,当时间片结束后,按FCFS算法切换到下一个就绪进程,我们还是以刚才例子为例,此时为:

时间片太长
- 等待时间过长
- 极限情况下退化成FCFS
时间片太短
- 反应迅速,但产生大量的上下文切换
- 大量上下文切换开销会影响系统的吞吐量
时间片长度选择目标
- 选择一个合适的时间片长度
- 经验规律:维持上下文切换开销处于1%以内
3.4 调度优先级
对于操作系统中的任务是不同的,例如,系统进程和用户进程、前台进程和后台进程,如果不加以区分,那么系统中关键的任务无法及时处理,后台运算导致视频播放卡顿,所以基于此,重要的任务需要被优先调度,就产生了优先级的概念。
3.4.1 多队列调度算法(MQ)
对于该调度算法,就绪队列被划分成多个独立的子队列,如前台(交互)、后台(批处理),每个队列拥有自己的调度策略,如前台-RR,后台-FCFS,队列间的调度
- 固定优先级:先处理前台,后处理后台,可能导致饥饿
- 时间片轮转:每个队列读的到一个确定的能够调度器进程的总时间,如80%CPU时间用于前台,20%CPU时间用于后台

还是以学霸解决问题为例,基于此的算法为:

所以该算法特征为:
- 维护多个优先级队列
- 高优先级的任务优先执行
- 同优先级内使用Round Robin调度
3.4.2 公平共享调度(FSS, Fair Share Scheduling)
公平共享调度控制用户对系统资源的访问
一些用户组比其他用户组更重要
- 保证不重要的组无法垄断资源
- 未使用的资源按比例分配
- 没有达到资源使用率目标的组获得更高的优先级
相关文章:
一文搞懂Linux内核进程CPU调度基本原理
为什么需要调度 进程调度的概念比较简单,我们假设在一个单核处理器的系统中,同一时刻只有一个进程可以拥有处理器资源,那么其他的进程只能在就绪队列中等待,等到处理器空闲之后才有计划获得处理器资源来运行。在这种场景下&#…...
java ssm爱宠宠物医院挂号预约系统管理系统设计与实现
本课题所实现的宠物医院网站是基于网页,它可以实现网上预约挂号,评价等基本功能。用户只要手边有一部手机或者一台电脑,可以上网浏览网页,便可以使用本系统,没有时间和地点的限制,使得就医预约,…...
自动化测试工具_Jmeter
【课程简介】 接口测试是测试系统组件间接口的一种测试,接口测试天生为高复杂性的平台带来高效的缺陷监测和质量监督能力,平台越复杂,系统越庞大,接口测试的效果越明显。在接口测试大行其道的今天,测试工具也愈发重要,Jmeter作为一款纯 Java 开发的测试…...
不是所有人都适合职场
一个读者的提问: 洋哥,我目前工作五年在一家大厂,属于那种什么事情上手都很快的人,并且搞定新问题能产生沉浸般的快感。我的本职是程序员,但运营思路产品方法也都会一些,甚至有时候提出的方案效果比产品&a…...
JSP 和 JSTL
文章目录🍓摘要🍓一、JSP🍉1.1 JSP的基础语法🍫1.1.1 简介🍫1.1.2 依赖🍫1.1.3 注释🍫1.1.4 Scriptlet 脚本🍉1.2 JSP的指令标签🍫1.2.1 include 静态包含🍫1…...
数据分析| Pandas200道练习题,使用Pandas连接MySQL数据库
文章目录使用Pandas连接数据库编码环境依赖包read_sql_query()的使用read_sql_table()的使用read_sql() 函数的使用to_sql()写入数据库的操作删除操作更新操作总结:使用Pandas连接数据库 通过pandas实现数据库的读,写操作时,首先需要进行数据…...
【Node.js】全局可用变量、函数和对象
文章目录前言_dirname和_filename变量全局函数setTimeout(cb,ms)clearTimeout(t)setInterval(cb,ms)clearInterval(t)setImmediate(cb)clearImmediate()console对象console.info([data][,...])console.error([data][,...])console.warn([data][,...])console.dir(obj[,options]…...
package.json 开发依赖与运行时依赖
文章目录前言一、生产环境与开发环境二、dependencies二、devDependencies总结前言 我已经使用npm接近两年了, 但对于package.json内的dependencies 和devDependencies也只是知道什么依赖该放什么部分, 至于为什么放到这个部分, 我不是很了解… 呃, 还是去了解一下. 一、生产环…...
关于最短路径算法中边的权值的思考
关于最短路径算法中边的权值的思考 不管是单源最短路径算法:Dijkstra Bellman-ford 还是多源最短路径算法:floyed Johnson 我们都绕不开的一件事就是,边的权值wi,jw_{i,j}wi,j 下面我们从多个角度谈边的权值 1.权值恒定 它是指对于每条边…...
LVGL开发教程:二、ESP-IDF 使用CmakeList管理自己的文件以及文件夹
本文需要已经安装了Vscode+IDF插件没有安装的请提前安装一下,IDF插件为乐鑫的插件不需要翻墙。需要环境搭建请看下面链接。 环境搭建: VScode+platformIO和Vscode+ESP-IDF两种开发环境搭建 项目例程下载地址: IDF-CmakeTes,密码:8888 另外,由于你和我的路径不一致,下载的工…...
与感受野相关的几种网络结构
一、Inception 1. Inception v1 目的 通过设计一个稀疏网络结构,但是能够产生稠密的数据,既能增加神经网络表现,又能保证计算资源的使用效率。 结构 图1-1 Inception v1结构图 特点 共4个通道,其中3个卷积通道分别使用111111…...
day19_抽象类丶接口
由来 当我们声明一个几何图形类:圆、矩形、三角形类等,发现这些类都有共同特征:求面积、求周长、获取图形详细信息。那么这些共同特征应该抽取到一个公共父类中。但是这些方法在父类中又无法给出具体的实现,而是应该交给子类各自…...
【网安神器篇】——系统指纹探测工具finger
作者名:白昼安全主页面链接: 主页传送门创作初心: 以后赚大钱座右铭: 不要让时代的悲哀成为你的悲哀专研方向: web安全,后渗透技术每日鸡汤: 我不想停下,因为这次出发的感觉太好了一…...
Prometheus离线tar包安装
Prometheus离线tar包安装实验环境一、部署前操作二、Master2.1下载2.2解压2.3更改服务目录名称2.4创建系统服务启动文件2.5配置修改2.6启动并设置开机自启2.7访问2.8添加node节点2.8.1 添加方法2.8.2修改Prometheus配置(Master)————————————…...
PostgreSQL查询引擎——SELECT STATEMENTS SelectStmt
SelectStmt: select_no_parens %prec UMINUS| select_with_parens %prec UMINUS select_with_parens:( select_no_parens ) { $$ $2; }| ( select_with_parens ) { $$ $2; } 该规则返回单个SelectStmt节点或它们的树,表示集合操作树(set-operation tree…...
零信任-易安联零信任介绍(11)
目录 易安联零信任公司介绍 易安联零信任发展路线 易安联零信任产品介绍 易安联零信任架构 易安联零信任解决方案 易安联零信任发展展望 易安联零信任公司介绍 易安联是一家专业从事网络信息安全产品研发与销售,是行业内领先的“零信任”解决方案提供商&…...
C++ STL——map和set的使用
文章目录1. 关联式容器1.1 键值对1.2 树形结构的关联式容器2. set2.1 set的介绍2.2 set的插入2.3 set的删除和查找2.4 lower_bound和upper_bound3. multiset3.1 count4. map4.1 map的介绍4.2 map的插入4.3 map的遍历4.4 map的[ ]5. multimap1. 关联式容器 我们之前学的vector、…...
【Python】thread使用
目录1、Condition条件变量使用2、event通信3、Semaphore信号量使用4、setDaemon设置守护线程5、threadPool_map使用6、threadPool使用7、threadingTimer1、Condition条件变量使用 # encoding:utf-8 Condition 提供了一种多线程通信机制, 假如线程 1 需要数据&#…...
计网传输层协议:UDP和TCP
文章目录一. 应用层和传输层的联系二. UDP协议三. TCP协议1. TCP报头介绍2. TCP实现可靠传输的核心机制2.1 确认应答2.2 超时重传3. 连接管理(三次握手, 四次挥手)3.1 建立连接(三次握手)3.2 断开连接(四次挥手)4. 滑动窗口5. 流量控制6.拥塞控制7. 延时应答8. 捎带应答9. 面向…...
一文讲明TCP网络编程、Socket套接字的讲解使用、网络编程案例
文章目录1 Socket讲解2 基于Socket的TCP编程3 客户端Socket的工作过程包含以下四个基本的步骤3.1 客户端创建Socket对象4 服务器程序的工作过程包含以下四个基本的步骤:4.1 服务器建立ServerSocket对象5 案例实现 客户端和服务端通信5.1 代码实现5.2 实现结果6 更多…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
