【原创】Linux cpuidle framework
背景
Read the fucking source code!
--By 鲁迅A picture is worth a thousand words.
--By 高尔基
说明:
- Kernel版本:4.14
- ARM64处理器
- 使用工具:Source Insight 3.5, Visio
1. 介绍
在Linux OS中,Idle进程的运行会让CPU进入cpuidle状态。当没有其他进程处于运行状态时,Scheduler会选择Idle进程来运行,此时CPU无所事事。
在ARM64架构中,当CPU Idle时,会调用WFI
指令(wait for interrupt
),关掉CPU的Clock以便降低功耗,当有外设中断触发时,CPU又会恢复回来。
cpuidle framework
就是用来向上给Scheduler/Sysfs
提供使用接口,向下用来对接不同架构的处理器,凡是框架基本都大同小异,屏蔽硬件层并抽象使用接口。
相信你已经猜到了,cpuidle和电源管理相关。
2. 框架
代码路径:
driver/cpuidle/cpuidle.c
driver/cpuidle/driver.c
driver/cpuidle/governor.c
driver/cpuidle/sysfs.c
kernel/shced/idle.c
老规矩,上图:
简单说明一下吧:调度器发现没有Task处在运行状态时,切换到Idle进程,此时通过cpuidle_idle_call
接口调到cpuidle framework
,cpuidle framework
会选择合适的策略来决定进入哪种状态,最终回调到底层的平台实现。
SMP处理器
都有cpuidle状态,而各个状态下的功耗都不同,是否进入cpuidle状态有两个重要的参考因素:
- CPU
进入-退出
cpuidle状态的latency; - CPU处在cpuidle状态的功耗;
Latency和功耗的tradeoff,是需要根据实际情况来选择策略的,也就是Governor的作用。
3. 数据结构
cpuidle core
抽象出了三个数据结构:
cpuidle device
:用于描述CPU核;cpuidle driver
: 针对CPU核的驱动;cpuidle governor
:主要根据cpuidle的device和driver状态来选择策略;
图如下:
3.1 cpuidle device
针对每个CPU核都对应一个struct cpuidle_device
结构,主要字段介绍如下:
registered
:该cpu核是否注册进内核中;enabled
:该cpu核是否已经使能;cpu
:对应的cpu number;last_residency
:该cpu核上一次停留在cpuidle状态的时间(us);state_count
:cpuidle状态的个数;states_usage
:struct cpuidle_state_usage
数组,记录每个cpuidle状态的统计信息,包括是否使能、进入该cpuidle状态的次数,停留在该cpuidle状态的总时间(us);kobjs*
:与sysfs组织相关,开发给用户层来操作底层;device_list
:全局链表,链接到cpuidle_detected_device
上;
3.2 cpuidle driver
cpuidle driver
用于驱动一个或多个CPU核,关键字段描述如下:
bctimer
:用于驱动注册时判断是否需要设置broadcast timer;states[]
:struct cpuidle_state
数组,用于描述cpuidle的状态,需要按照功耗从大到小来排序,具体有多少个cpuidle状态,取决于device Tree中的定义,默认已经有state[0]
,如上图所示。cpumask
:用于表明支持哪些CPU核;
struct cpuidle_state
中的enter
函数,是最终进入cpuidle状态的函数。不同处理器的cpuidle驱动实现,主要是填充state
结构体。
3.3 cpuidle governor
governor结构主要提供不同的回调函数,最终由menu_governor
填充,主要字段如下:
enable/disable
:在设备驱动注册和注销的时候调用;select
:根据已有状态来选择一个cpuidle状态;reflect
:调用该接口告知governor,CPU上一次所处的cpuidle状态是哪个;
流程
以cpuidle-arm.c
为例,整个注册流程如下图:
注册之后便将设备和驱动建立起连接关系了,最终cpuidle framework
的用户便可通过接口来调用下层的接口,进而完成具体的硬件操作。
Idle Task通过cpuidle_enter
为入口,调用到cpuidle_framework
,流程如下图:
Idle Task调用cpuidle_enter
之前,需要先通过governor
来运用策略来选择将要进入的cpuidle state。入口为cpuidle_select
,当完成状态切换后会调用cpuidle_reflect
来将信息更新到governor
。具体的图如下:
其中Governor
关于状态的策略选择,可以参考menu.c
的注释,主要有三个决定因素:
- 功耗平衡点,也就是需要权衡考虑cpuidle状态带来的功耗节省和在该cpuidle状态下的停留时间,假如停留时间太短(小于
target_residency
),则不划算。 - 性能影响,那些具有大的延迟退出(
exit_latency
)的cpuidle state
,通常会对工作负载产生较大影响,这个对系统管理员来说是不可接受的。此外,低性能往往也意味着低功耗。 - 延迟容忍度(从
pmqos
框架获取),在满足延迟容忍度latency_req
的条件下,选择功耗最小的cpuidle状态。
具体的策略不再分析,请直接看driver/cpuilde/menu.c
代码及注释。
【原创】Linux cpuidle framework的更多相关文章
- 【原创】Linux cpufreq framework
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...
- Linux PWM framework简介和API描述【转】
本文转载自:https://blog.csdn.net/mike8825/article/details/51656400 1. 前言 PWM是Pulse Width Modulation(脉冲宽度调 ...
- Linux Regulator Framework(2)_regulator driver
转自蜗窝科技:http://www.wowotech.net/pm_subsystem/regulator_driver.html 说实话,这篇好难懂啊... 1. 前言 本文从regulator d ...
- Linux regulator framework(1) - 概述【转】
转自蜗窝科技:http://www.wowotech.net/pm_subsystem/regulator_framework_overview.html 1. 前言 Regulator,中文名翻译为 ...
- Linux电源管理-Linux regulator framework概述
前言 1. 什么是regulator? regulator翻译为"调节器",分为voltage regulator(电压调节器)和current(电流调节器).一般电源 ...
- [原创]Linux下网络性能测试Netperf工具介绍及安装
[原创]Linux下网络性能测试Netperf工具介绍及安装 1 官方网站 http://www.netperf.org/netperf/ 2 Netperf介绍 Netperf是一种网络性能的测试工 ...
- [原创]Linux-day1
原创:转发务必注明出处http://www.cnblogs.com/0zcl/p/6077298.html 一.Linux的基本原则 由目的单一的小程序组成:组合小程序完成复杂任务 一切皆文件 尽量避 ...
- (原创)linux下Microsoft/cpprestsdk支持https(server)
原创,转载请标明源地址 之前看网上一堆的资料说Microsoft/cpprestsdk不支持https或者说只支持window下的https,差点就被误导了,没办法,只好自己去翻了下源代码 先说明下l ...
- Linux Thermal Framework分析及实施
关键词:Zone.Cooling.Governor.Step Wise.Fair Share.trip等等. Linux Thermal的目的是控制系统运行过程中采样点温度,避免温度过高造成器件损坏, ...
随机推荐
- STL 优先队列 用法
今天做题用到了优先队列 对它的用法还不是很熟悉 现在整理一下. 需要的库 #include<queue> using namespace std; 不过我都用bits/stdc++.h.. ...
- Core CLR 自定义的Host官方推荐的一种形式(第一种)
.Net Core CLR提供两种Host API访问 托管代码的形式,按照微软官方的说法,一种是通过CoreClr.DLL来直接调用托管生成的DLL程序集,另外一种是通过CoreClr里面的C导出函 ...
- Ping、Traceroute工作原理
在工作开发过程中,我们经常会使用到ping和traceroute.在这里,我们将细述其工作原理,让你在会用的基础之上理解其内部工作过程. ICMP应用实例--Ping Ping 是 ICMP 的一个重 ...
- 【转载】【VSCode】Windows下VSCode编译调试c/c++
转载自:http://blog.csdn.net/c_duoduo/article/details/51615381 懒得自己配置或自己配置出现不明问题的朋友可以点这里: [VSCode]Window ...
- Python 之父再发文:构建一个 PEG 解析器
花下猫语: Python 之父在 Medium 上开了博客,现在写了两篇文章,本文是第二篇的译文.前一篇的译文 在此 ,宣布了将要用 PEG 解析器来替换当前的 pgen 解析器. 本文主要介绍了构建 ...
- Hadoop 系列(二)—— 集群资源管理器 YARN
一.hadoop yarn 简介 Apache YARN (Yet Another Resource Negotiator) 是 hadoop 2.0 引入的集群资源管理系统.用户可以将各种服务框架部 ...
- spring学习笔记之---bean管理的注解方式
bean管理的注解方式 (一)使用注解定义bean (1)常用注解 (2)实例 1.在pom.xml中进行配置 <dependencies> <dependency> < ...
- python基础之循环与迭代器
循环 python 循环语句有for循环和while循环. while循环while循环语法 while 判断条件: 语句 #while循环示例 i = 0 while i < 10: i += ...
- SQL和NoSQL的区别
一.概念 SQL (Structured Query Language) 数据库,指关系型数据库.主要代表:SQL Server,Oracle,MySQL(开源),PostgreSQL(开源). No ...
- python3学习-requests使用
前面我们讲过了urllib模块,知道他是用于网络请求的,这一节讲的requests还是用于网络请求的,只不过urllib是官方模块,而requests是第三方的模块.用过的人都说他才是'人类使用的', ...