0

0

Linux cpuidle framework(1)_概述和软件架构

爱谁谁

爱谁谁

发布时间:2025-04-19 10:16:25

|

642人浏览过

|

来源于php中文网

原创

  1. 前言

在计算机系统中,cpu的主要任务是执行程序,其核心步骤包括取指、译码和执行。然而,若无程序需要执行,cpu如何处理这一情况呢?有人可能会认为直接停止运行即可,但实际上,决定何时停止以及如何停止需要在复杂的软硬件环境中仔细考虑。

让我们转向Linux内核,Linux系统中的CPU被两种程序所占用:一类是进程(或线程),即进程上下文;另一类是中断和异常的处理程序,即中断上下文。

进程负责处理事务,例如读取用户输入并在屏幕上显示。当事务处理完毕,如用户不再输入且无新内容需显示时,进程可以释放CPU,但随时准备重新占用(如用户突然按键)。同样,若系统无中断或异常事件,CPU不会在中断上下文中花费时间。

在Linux内核中,CPU这种无所事事的状态被称为idle状态,而cpuidle框架正是管理这种状态的工具

注:cpuidle框架系列文章将以ARM64为例平台。由于ARM64发布时间较短,早期版本的内核中没有相关代码,因此我们选择了最新的3.18-rc4版本的内核。

  1. 功能概述

曾经,Linux内核的cpu idle框架非常简单,简单到driver工程师只需在“include\asm-arm\arch-xxx\system.h”中定义一个名为arch_idle的内联函数,并在该函数中调用内核提供的cpu_do_idle接口即可,其余的实现内核会帮我们完成,如下:

static inline void arch_idle(void)
{
    cpu_do_idle();
}

尽管简单,但这包含了idle处理的两个关键点:

1)idle进程

idle进程的存在是为了解决“何时idle”的问题。

我们知道,Linux系统运行的基础是进程调度。当所有进程都不再运行时,即为CPU idle状态。内核通过一个简单的方法来判断这种状态:在init进程(系统的第一个进程)完成初始化任务后,将其转变为idle进程。由于idle进程的优先级最低,当其被调度时,说明系统中其他进程已停止运行,即CPU已idle。最终,idle进程会调用idle指令(如WFI),使CPU进入idle状态。

“ARM WFI和WFE指令”中提到,WFI Wakeup events会将CPU从WFI状态唤醒,这些事件通常是一些中断事件。因此,CPU唤醒后会执行中断处理程序,处理程序中会唤醒某些进程。当处理程序返回时,进行调度,如果没有其他进程需要执行,调度器会恢复idle进程的运行,当然,idle进程不会做任何事情,继续进入idle状态,等待下一次唤醒。

2)WFI

WFI用于解决“如何idle”的问题。

通常情况下,ARM CPU在idle时可以使用WFI指令,将CPU置于等待中断状态。在这种状态下,至少会关闭ARM核的时钟,以节省功耗(具体实现取决于ARM核的设计,可参考“ARM WFI和WFE指令”)。

也许您会觉得,上述过程已经足够好,为什么还要开发cpuidle框架?我的理解是:

  1. 软件架构

在Linux内核中,cpuidle框架位于“drivers/cpuidle”文件夹中,包含cpuidle核心、cpuidle调控器和cpuidle驱动三个模块,再结合位于内核调度中的cpuidle入口,共同完成CPU的idle管理。软件架构如下图:

Linux cpuidle framework(1)_概述和软件架构

1)内核调度模块

位于kernel\sched\idle.c中,负责实现idle线程的通用入口(cpuidle入口)逻辑,包括idle模式的选择和idle的进入等。

2)cpuidle核心

多个迹象表明你还是PHP菜鸟
多个迹象表明你还是PHP菜鸟

我愿意把本文归入我的“编程糗事”系列。尽管在正规大学课程中,接触到软件工程、企业级软件架构和数据库设计,但我还是时不时地体会到下述事实带给我的“罪恶”感,当然,都是我的主观感受,并且面向Eclipse:   你是PHP菜鸟,如果你:   1. 不会利用如phpDoc这样的工具来恰当地注释你的代码   2. 对优秀的集成开发环境如Zend Studio或Eclipse PDT视而不见   3

下载

cpuidle核心负责实现cpuidle框架的整体结构,主要功能包括:

cpuidle核心的代码主要包括:cpuidle.c、driver.c、governor.c、sysfs.c。

3)cpuidle驱动

不同的架构和CPU核会有不同的cpuidle驱动,平台驱动开发者可以在cpuidle核心提供的框架下开发自己的cpuidle驱动。代码主要包括:cpuidle-xxx.c。

4)cpuidle调控器

Linux内核的框架有两种比较固定的抽象模式:

模式2的解释可能有些抽象,但在cpuidle的场景中容易理解:

前面提到,许多CPU提供了多种idle级别(即所谓的“方案”),这些idle级别的主要区别在于“idle时的功耗”和“退出时的延迟”。cpuidle驱动(机制)负责定义这些idle状态(每个状态的功耗和延迟分别是多少),并实现进入和退出的相关操作。最终,cpuidle驱动会将这些信息传递给调控器,由调控器根据具体的应用场景决定选择哪种idle状态(策略)。

内核中的cpuidle调控器都位于governors/目录下。

  1. 软件流程

在阅读本章之前,请先阅读以下三篇文章:

Linux cpuidle framework(2)_cpuidle核心

Linux cpuidle framework(3)_ARM64通用CPU idle驱动

Linux cpuidle framework(4)_menu调控器

前面提到过,内核会在系统启动完成后,在init进程(或线程)中处理cpuidle相关事务。大致过程如下(内核启动相关的分析将在其他文章中详细介绍):

cpu_startup_entry流程:

具体代码比较简单,不再分析,但有一点需要特别说明:

使用cpuidle框架进入idle状态时,本地irq处于关闭状态,因此从idle返回时,只能继续执行,直到irq被打开,才能执行相应的中断处理程序,这与传统的cpuidle不同。同时,这也间接验证了“Linux cpuidle framework(4)_menu调控器”中提到的,为什么menu调控器在reflect接口中只是简单地设置一个标志。因为reflect是在关闭中断时被调用的,需要尽快返回,以便处理中断事件。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1012

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

60

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

373

2025.12.29

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

480

2023.08.10

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1347

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

700

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

294

2023.06.30

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

776

2023.07.05

Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

4

2026.01.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7万人学习

Git 教程
Git 教程

共21课时 | 2.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号