Linux cpuidle framework

背景

  1. Kernel版本:4.14

  2. ARM64处理器

  3. 使用工具: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 frameworkcpuidle 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_usagestruct 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的注释,主要有三个决定因素:

  1. 功耗平衡点,也就是需要权衡考虑cpuidle状态带来的功耗节省和在该cpuidle状态下的停留时间,假如停留时间太短(小于target_residency),则不划算。

  2. 性能影响,那些具有大的延迟退出(exit_latency)的cpuidle state,通常会对工作负载产生较大影响,这个对系统管理员来说是不可接受的。此外,低性能往往也意味着低功耗。

  3. 延迟容忍度(从pmqos框架获取),在满足延迟容忍度latency_req的条件下,选择功耗最小的cpuidle状态。

具体的策略不再分析,请直接看driver/cpuilde/menu.c代码及注释。

    

推荐阅读:

    专辑|Linux文章汇总

    专辑|程序人生

    专辑|C语言

嵌入式Linux

微信扫描二维码,关注我的公众号 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467219.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Crystal 语法概述[转]

Crystal 语法概述创建公式时,可以选择使用 Crystal 语法或 Basic 语法。语法规则用于创建正确的公式。几乎任何使用某种语法编写的公式都可以使用另一种语法来编写。报表可以包含使用 Crystal 语法的公式,也可以包含使用 Basic 语法的公式。有关是使用 C…

上传源文件至虚拟服务器,C# 通过WebService上传视频文件到服务器虚拟机下源码...

【实例简介】请参考:http://blog.csdn.net/dwj901125/article/details/23701063这里有相当详尽的实现过程。【实例截图】【核心代码】WebServiceTest├── WebServiceTest│ ├── Backup│ │ ├── StateGrid95598│ │ │ ├── Properties│ …

Linux利器:QEMU!用它模拟开发板能替代真开发板?

不想错过我的推送,记得右上角-查看公众号-设为星标,摘下星星送给我!QEMU,搞嵌入式开发的一定不陌生,最近各大群里都讨论疯了,说它是Linux利器一点也不夸张。它是一款知名的而且开源的模拟器(官网…

前端模块化(二):模块化编程

所谓的模块化编程就是封装细节,提供使用接口,彼此之间互不影响,每个模块都是相互独立,实现某一特定的功能。如果其他模块想调用的时候,可以暴露我们所希望对外的公开的方法与数据。 1、函数写法 function f1(){ var va…

ASP.NET AJAX - Timer控件之摆放位置的影响

ASP.NET AJAX所提供的Timer 控件是一个服务器控件&#xff0c;它能够定时引发全网页回传&#xff0c;当然&#xff0c;在搭配了UpdatePanel 控件之后&#xff0c;就可以定时引发异步回传并局部更新UpdatePanel 控件的内容。<?xml:namespace prefix o />在此要请大家注意…

CPU怎么认识代码的?

# 语言这个东西&#xff1f;首先说明下&#xff0c;我们正常使用的python、C、C语言等等&#xff0c;我们自己能读得懂的语言&#xff0c;包括汇编语言&#xff0c;CPU都是不认识的&#xff0c;CPU 只认识一种语言&#xff0c;那就是 机器语言&#xff0c;也就是我们很多人&…

ajax 五种状态,ajax的五种状态

ajax的五种状态(readyState )0 &#xff0d; (未初始化)还没有调用send()方法1 &#xff0d; (载入)已调用send()方法&#xff0c;正在发送请求2 &#xff0d; (载入完成)send()方法执行完成&#xff0c;已经接收到全部响应内容3 &#xff0d; (交互)正在解析响应内容4 &#x…

nodeJs的学习之路(1)

一 什么是nodeJs nodeJs是一个后端技术&#xff0c;研究web应用的开发模式&#xff0c;能够开发一些简单的服务器&#xff0c;学会操作数据库等等。官方解释就是&#xff1a;nodeJs是基于谷歌v8引擎的javascript运行环境 nodeJs使用了一个事件驱动&#xff0c;非非阻塞式I/O模型…

u盘病毒之tel.xls.exe

系统症状每次双击盘符出现一个新窗口windows任务管理器出现了一个Excel的程序鼠标右键点盘符出现"Auto"字样无法显示隐藏文件无法 取消或者钩选 隐藏已知文件类型的扩展名 样本信息File size: 49152 bytes MD5: d88f7c6c15585404c30c92a11c429c36 SHA1: af2120915a1e…

节日才需要快乐吗?

---- 当然需要天天快乐2020年的国庆和中秋是挺特别的&#xff0c;也是国庆&#xff0c;也是中秋&#xff0c;而且今天还能看NBA总决赛助兴。这么愉快的节日&#xff0c;祝我们的国家繁荣昌盛&#xff0c;国泰民安&#xff0c;也祝大家中秋快乐&#xff0c;当然中秋后也需要快乐…

大屏幕服务器无信号,关于思讯互动平台大屏幕使用过程中错误的排查

关于思讯互动平台大屏幕使用过程中错误的排查一、错误原因分析 原因具体内容浏览器原因包括但不限于浏览器不兼容、浏览器设置出问题、浏览器安装了不明插件、浏览器有缓存电脑原因电脑性能太差、开启了太多程序进程、电脑系统老旧网络原因断网、多人共同占用网络导致网速过慢人…

我在富士康13年

以下是一个读者朋友的日记---- ???? 有点恨铁不成钢的感觉这个读者跟我一样的年纪&#xff0c;都是89年&#xff0c;好吧&#xff0c;说到这里突然觉得又马上要老一岁了&#xff0c;因为小云跟我说&#xff0c;我马上就要过生日了&#xff0c;我从来就记不清自己的生日&…

《Android源码设计模式》--装饰模式

No1&#xff1a; Activity继承于ContextThemeWrapper&#xff0c;继承于ContextWrapper&#xff0c;继承于Context。 No2&#xff1a; Context中方法的所有实现均由ContextImpl类承担。 No3&#xff1a; 启动一个Activity需要3个非常重要的对象&#xff1a;Application、Contex…

域名服务器的配置文档,dns域名服务器的配置

dns域名服务器的配置 内容精选换一换使用mount命令挂载文件系统到云服务器&#xff0c;云服务器系统提示timed out。原因1&#xff1a;网络状态不稳定。原因2&#xff1a;网络连接异常。原因3&#xff1a;云服务器DNS配置错误&#xff0c;导致解析不到文件系统的域名&#xff0…

ASP无组件上传带进度条

<%LANGUAGE"VBSCRIPT" CODEPAGE"936"%><%Option Explicit%><% 带进度条的ASP无组件断点续传下载简介&#xff1a; 1)利用xmlhttp方式 2)无组件 3)异步方式获取&#xff0c;节省服务器…

广东阳西的小城生活

国庆放假&#xff0c;回小云老家&#xff0c;广东阳江阳西县。我们是昨天下午5点出发&#xff0c;晚上11点到家&#xff0c;刚好错开拥堵高峰&#xff0c;不过在沿江高速上川岛附近还是遇到了交通堵塞&#xff0c;一直缓缓前行&#xff0c;等到我们通过那个事故点的时候&#x…

React Native之箭头函数和延展操作符(...)

箭头函数 在我们学习React Native的过程中&#xff0c;我们经常会遇到">"这样形式的书写&#xff0c;如下&#xff1a; import React, {Component} from react import {AppRegistry, StyleSheet, View, Text, TouchableOpacity} from react-nativeclass RN_Arrow_…

读《爱的艺术》书评而问

豆瓣关于这本书的评论 我回复了这一篇评论 其实&#xff0c;更想拿这些问题和读者诸君交流&#xff0c;你们怎么看的&#xff1f; -------------------------------------------------------------------------------------- “一个成熟的人最终能达到他既是自己的母亲&#xf…

10.5 0819吉米牛逼

吉米真牛逼&#xff0c;这场比赛热火赢得漂亮&#xff0c;没有阿德巴约&#xff0c;没有德拉季奇的情况下&#xff0c;吉米硬生生把自己变成了詹姆斯。右侧45度拿球&#xff0c;突破顶着老詹急停跳投&#xff0c;又一次在老詹面前拿下两分&#xff0c;马上回防&#xff0c;面对…

flex 布局示例

1 <!DOCTYPE html>2 <html>3 4 <head>5 <meta charset"utf-8">6 <title>flex实例</title>7 <style>8 * {9 font-family: "微软雅黑";10 }11 12 html,…