0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

深入Linux内核:进程调度的核心逻辑与实现细节

jf_44130326 来源:Linux1024 作者:Linux1024 2025-12-24 07:05 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Linux系统中,进程调度就像一位精明的“CPU管理员”——它决定着哪个进程能优先使用CPU,多久切换一次进程,如何平衡系统响应速度与资源利用率。小到桌面应用的流畅点击,大到服务器的多任务并发,背后都离不开内核调度算法的精准操控。今天,我们就从优先级、调度算法、时间片分配到底层实现,全方位拆解Linux内核进程调度的核心逻辑。

一、进程调度的“身份标识”:优先级与分类

要理解调度逻辑,首先得搞懂:进程凭什么“插队”?答案是——优先级。而进程的“性格”(CPU消耗型/I/O消耗型),也会影响调度器的决策。

1.进程的两种“性格”

从CPU使用习惯来看,进程分为两类:

CPU消耗型进程:像大型计算、程序编译这类任务,一旦运行就想长时间霸占CPU,对时间片的需求是“越长越好”。

I/O消耗型进程:像键盘输入、网络请求、磁盘读写这类任务,大部分时间在等待I/O设备响应,实际占用CPU的时间很短,不需要长时时间片,反而需要调度器快速响应,让它“随叫随到”。

Linux调度器的核心目标之一,就是平衡这两类进程的需求——既保证CPU消耗型进程的计算效率,又不牺牲I/O消耗型进程的响应速度。

2.优先级的“双重表达”:nice值与内核优先级

进程的优先级有两种常用表述,我们可以理解为“用户视角”和“内核视角”:

用户视角:nice值:这是用户能直接操作的优先级指标,取值范围是-20~19。核心规则很简单:nice值越小,优先级越高(比如nice=-20是最高用户优先级,nice=19是最低),默认值为0。

内核视角:内核优先级:内核内部用0~139的数值表示优先级,规则和nice值一致——数值越低,优先级越高。这个范围被划分为两部分:

○0~99:实时进程专用(比如工业控制音频处理等需要毫秒级响应的任务);

○100~139:普通进程专用(我们日常使用的浏览器、编辑器等都属于这类);

○特殊情况:Deadline进程优先级为-1,拥有比实时进程更高的调度优先级。

3.进程PCB中的“优先级档案”

每个进程在Linux内核中都有一个“身份档案”——struct task_struct(进程控制块PCB),其中4个成员专门记录优先级信息:

成员名 作用说明
static_prio 静态优先级,由nice值转换而来,一旦设定不会轻易改变
prio 动态优先级,内核根据进程运行状态动态调整(比如长时间等待的进程可能临时提权)
normal_prio 普通优先级:普通进程的normal_prio等于static_prio,实时进程会根据rt_priority重新计算
rt_priority 实时进程的优先级,专门用于实时进程的调度排序

二、经典与现代:两大核心调度算法

调度算法是进程调度的“大脑”,Linux内核先后采用过两种关键算法:MLFQ(多级反馈队列)和CFS(完全公平调度器),后者更是当前Linux系统的主流。

1.经典方案:MLFQ多级反馈队列算法

核心思想

把进程按优先级分成多个队列,高优先级队列的进程先被调度,同优先级队列内按“先进先出”(FIFO)规则执行。比如设置5个队列(队列5最高,队列1最低):

•高优先级进程(如I/O消耗型)进入队列5,优先占用CPU;

•低优先级进程(如CPU消耗型)进入队列1,等所有高优先级队列空闲后才执行;

•若高优先级队列的进程执行超时,会被“降级”到低一级队列,避免独占CPU。

调度流程(流程图见下文)

1.进程创建后,根据优先级进入对应队列;

2.调度器优先从最高优先级队列取进程执行;

3.同优先级队列内的进程依次执行,直到时间片耗尽;

4.超时进程降级到低一级队列,空闲队列的进程可能被提权;

5.低优先级队列进程只有在高优先级队列无任务时才执行。

2.现代方案:CFS完全公平调度器

MLFQ依赖固定时间片和队列分级,难以实现绝对公平。CFS彻底抛弃了“固定时间片”和“固定调度周期”,核心是“按权重分配CPU时间”,让每个进程都能获得“公平的运行机会”。

核心逻辑

权重量化:每个进程的权重由nice值转换而来(nice值越小,权重越大);

时间分配:CPU总时间按“进程权重/所有进程总权重”的比例分配给每个进程;

•举例:如果进程A权重是2,进程B权重是1,总权重是3,那么A获得2/3的CPU时间,B获得1/3,实现“按贡献分配”的公平性。

优势

•无需固定时间片:I/O消耗型进程权重高,能快速获得CPU响应;CPU消耗型进程权重低,但能获得持续的CPU时间,不会频繁被抢占;

•动态适应:进程权重随nice值调整,用户可以通过系统调用灵活控制进程优先级。

三、时间片与进程切换:CPU时间的“分配艺术”

1.时间片的本质

时间片是进程在被抢占前能持续运行的最大时间。传统调度器采用“固定时间片”,但存在明显缺陷:

•I/O消耗型进程用不完时间片,造成资源浪费;

•CPU消耗型进程觉得时间片太短,频繁切换导致开销增加。

2. CFS的“无时间片”革命

CFS不再使用固定时间片,而是通过“权重占比”动态分配CPU时间:

•权重高的进程(如nice值-20)获得更长的运行时间;

•权重低的进程(如nice值19)获得较短的运行时间;

•所有进程的运行时间占比与权重占比一致,实现“公平调度”。

3.进程切换的触发

当进程满足以下条件时,调度器会触发切换:

•进程运行时间达到分配的“公平时间”;

•进程主动放弃CPU(如等待I/O);

•有更高优先级进程被唤醒(抢占当前进程)。

四、底层实现:系统调用如何操控调度?

用户和内核通过系统调用来交互,调整进程优先级的核心函数是nice(),而内核通过task_nice()函数获取进程的nice值。

1.核心函数实现

C

2.关键逻辑

•nice(int inc):用户通过这个系统调用调整进程优先级,inc是nice值的变化量(比如inc=-5表示优先级提高);

•task_nice():内核通过这个函数读取进程的nice值,底层通过PRIO_TO_NICE宏将内核的static_prio(静态优先级)转换为用户可见的nice值;

•转换规则:static_prio范围100~139(普通进程),对应nice值-20~19(比如static_prio=100对应nice=-20,static_prio=139对应nice=19)。

五、总结:Linux进程调度的核心目标

Linux内核进程调度的本质,是在“公平性”和“响应性”之间寻找平衡:

•对普通用户:保证桌面应用、输入法等I/O消耗型进程快速响应,体感流畅;

•对服务器:保证多进程并发时的资源利用率,让CPU消耗型进程高效运行;

•对开发者:提供灵活的优先级调整接口(nice值),满足不同场景的调度需求。

从MLFQ的“分级调度”到CFS的“公平调度”,Linux内核的调度算法一直在进化,而核心逻辑始终围绕“让CPU资源得到最优分配”。理解这些底层细节,不仅能帮助我们排查系统性能问题,更能让我们在编写程序时,通过合理设置进程优先级,让应用运行得更高效。

附:Linux进程调度整体流程图

wKgZPGlLIUuAc6q9AAHObOXga5s998.png

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    88

    文章

    11860

    浏览量

    219839
  • LINUX内核
    +关注

    关注

    1

    文章

    321

    浏览量

    23327
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Linux内核参数sysctl.conf的工作原理和正确用法

    Linux 内核参数(kernel parameters)是操作系统运行时行为的控制开关,覆盖了内存管理、进程调度、网络协议栈、文件系统、虚拟内存、安全策略等方方面面。这些参数在系统安
    的头像 发表于 05-18 16:21 102次阅读

    如何理解Linux内核中的PCIe驱动

    我们习惯了用 Verilog 去死磕 PCIe 的底层协议状态机。但一旦越过硬件边界来到操作系统层面,Linux 内核是如何接管并驱动这些 PCI/PCIe 设备的呢?由于不同的 CPU 架构实现
    的头像 发表于 04-11 17:22 1407次阅读

    飞凌嵌入式ElfBoard-进程进程状态

    Linux系统中,进程状态对于系统调度、资源分配和管理非常重要,因为它表示了进程当前的执行状况和资源使用情况。在Linux 系统中使用ps
    发表于 03-27 09:12

    Linux内核三大核心模块深度解析:调度、内存与I/O

    Linux内核作为操作系统的核心,其进程调度、内存管理和文件I/O三大模块共同决定了系统的性能与稳定性。无论是多核服务器的高并发处理,还是嵌
    的头像 发表于 03-12 09:00 328次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>内核</b>三大<b class='flag-5'>核心</b>模块深度解析:<b class='flag-5'>调度</b>、内存与I/O

    Binder 驱动深度解析:Android IPC 的核心底层实现

     Binder 驱动的支撑。对于 Android 开发者而言,吃透 Binder 驱动的实现原理,不仅能深入理解 Android 系统的设计逻辑,更能高效定位性能问题、规避安全漏洞,实现
    的头像 发表于 03-12 08:11 734次阅读
    Binder 驱动深度解析:Android IPC 的<b class='flag-5'>核心</b>底层<b class='flag-5'>实现</b>

    Linux内核驱动开发的技术核心精要

    嵌入式Linux驱动开发是连接硬件与操作系统的关键环节。随着内核演进(如Linux 6.13)和硬件复杂度提升,开发者需掌握并发控制、中断分层、内存管理、设备树、调试工具等核心知识。本
    发表于 03-10 13:56

    Linux内核的“心跳”:jiffies如何为系统计时?

    Linux 内核的世界里,有一个默默工作的 "计时器"——jiffies。它不像我们手机上的时钟那样显示年月日,却掌控着内核中绝大多数时间相关的操作:从进程
    的头像 发表于 02-04 16:27 986次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>内核</b>的“心跳”:jiffies如何为系统计时?

    深入RK3588内核:rockchip_linux_defconfig的作用与调试价值

    在 RK3588 芯片的 Linux 开发中,有一个文件始终是开发者绕不开的核心 ——kernel/arch/arm64/configs/rockchip_linux_defconfig。无论是首次
    的头像 发表于 02-03 15:56 1471次阅读
    <b class='flag-5'>深入</b>RK3588<b class='flag-5'>内核</b>:rockchip_<b class='flag-5'>linux</b>_defconfig的作用与调试价值

    【「Linux 设备驱动开发(第 2 版)」阅读体验】+读深入理解Linux内核内存分配

    作者引入内存相关术语,物理地址标识物理内存位置。由于虚拟内存机制,用户和内核从不直接访问物理地址,而是通过相应的逻辑地址来访问的。MMU(内存管理单元)位于CPU核心和内存之间,通常是物理CPU本身
    发表于 01-16 20:05

    【「Linux 设备驱动开发(第 2 版)」阅读体验】+读内核处理的核心辅助函数

    “处理内核核心辅助函数”进行学习。 第3章又是以5个主题展开讨论学习,①、Linux内核加锁机制和共享资源;②、处理内核等待、睡眠和延迟机
    发表于 01-10 22:08

    深入解析RK平台Android/Linux Bootloader核心文件:android_bootloader.c

    是对接Android启动逻辑核心文件——它决定了设备是进入正常系统、Recovery模式还是Fastboot模式,同时承担了AVB(Android Verified Boot)验证、内核加载、命令行
    的头像 发表于 01-09 10:58 1556次阅读
    <b class='flag-5'>深入</b>解析RK平台Android/<b class='flag-5'>Linux</b> Bootloader<b class='flag-5'>核心</b>文件:android_bootloader.c

    解析Linux进程、线程和协程

    和协程管理 进程管理 Linux通过fork()系统调用创建新进程,每个进程拥有独立的内存空间和资源。新程序可以通过exec()来加载,从而实现
    发表于 12-22 11:00

    从小白到大牛:Linux嵌入式系统开发的完整指南

    编写简单的 Shell 脚本(如自动备份文件、批量编译程序)巩固技能。​ 二、能力进阶:攻克核心技术模块​ 入门后需聚焦嵌入式 Linux核心技术栈,分模块突破,形成系统化能力:​
    发表于 12-16 10:42

    Linux-RT特点及简单应用

    Linux-RT支持优先级继承(Priority Inheritance),避免了优先级反转问题,提高了实时任务的响应性能。 标准Linux内核调度器(也称为CFS
    发表于 12-05 07:37

    深入解析米尔全志T536核心板的实时性技术突破

    实现O(log n)调度复杂度,追求整体吞吐量最大化。实时缺陷:内核不可抢占、自旋锁阻塞、中断屏蔽窗口等因素导致延迟不可预测。2.2 标准内核+软隔离方案
    发表于 10-17 17:41