前言

首先请大家思考一个问题,当前移动设备的性能瓶颈究竟是什么呢?

抛砖引玉一下,笔者认为当前移动设备的主要矛盾是有限空间内的散热、续航以及增长的性能需求之间的矛盾。性能需求究竟是什么呢?其实是CPU的频率,频率越快,单位时间能够处理的指令数越多,直观上CPU也就运行的越快。

性能与功耗的平衡

那么,我们一直让CPU在最高频率下运行不就行了么?答案显然是否定的,这会带来更高的功耗,性能和功耗之间的关系有一个经典的公式:

为什么是V^2乘以f,这要从CPU的架构开始说起,CPU的基本组成单元其实是若干个三极管。

三极管通过控制gate的电压实现源极和漏极之间的通断,最终形成二进制0和1的表示。想象成两个水系和闸门之间的关系吧,水系沟通和阻断是通过提起和放下闸门控制的。

提起和放下这个三极管上的闸门的功耗,就是CPU实现翻转的功耗,闸门本质上是一个电容。通断控制的过程其实本质上是电容的充放电过程。公式中的P其实就是电容充放电中的功耗了。C是电容的常数项系数。V是施加在电容上的电压。开关一次的功耗是C*V^2,注意这里的单位是J(焦耳),f是频率,频率是Hz,相当于每秒调整f次,每秒消耗的能量(单位W)即这么计算出了。

这里还要说明一点,电压和频率往往是正相关的,电压给的越高,电容能够在更短的时间内完成充放电的过程,每秒内能够翻转的次数也就越多,这就可以给到更高的运行频率了。

动态频率和电压的调整

Power是与电压和频率相关的,内核中有个非常牛逼的方案——DVFS(Dynamic Voltage Frequency Scaling)。这个方案的存在在很大程度上衡量了性能与功耗的需求。简单来说,就是芯片可以动态调节自己的电压和频率,在性能需求低的时候用低的电压和频率去跑。性能需求高的时候用高的电压和频率去跑。

这里的方案其实已经非常完备了。有控制CPU频率的DVFS方案,有控制任务在各个核心上迁移,达到最优性能功耗表现的EAS(energy aware scheduling)方案。相关的power model、energy model等也在出厂时由各大芯片厂商已经预制在了芯片中。

linux的温控框架

再叨叨两句linux的温控框架。

Linux的温控框架其实是由三个核心的抽象组成的。即测量温度的设备的抽象thermal_zone、温度控制策略的抽象thermal_governor、温度控制设备的抽象thermal_cooling_device。

三个结构体都定义于Linux/thermal.h中。

thermal_zone其实可以理解为各种温度的sensor,用处是采集各个部位的温度,向上层提交。thermal_cooling_device是温度控制设备的抽象。包括风扇、CPU频率都是thermal_cooling_device。风扇和CPU频率为什么会被CPU看做同一类设备呢?它们看起来风马牛不相及。这恰恰就是软件工程中抽象的魅力。我们翻翻字典,抽象的解释是:从众多事物中抽取出共同的本质性的特质,舍弃其非本质的特征的过程。在温控的过程中风扇的作用是物理的送风,通过增加强制对流系数从而带走更多的热量,达到降温的效果。而CPU频率的调整是通过减小CPU的计算量,从而达到降温的效果。既然他们都能达到降温的效果,那么把他们抽象为一个东西是可以的,方便的。

thermal_cooling_device的结构体定义,thermal_cooling_device和thermal_zone_device通过thermal_instance链表挂载在一起,这个是后话,我们放在后面讲。

struct thermal_cooling_device {int id;char *type;struct device device;struct device_node *np;void *devdata;void *stats;const struct thermal_cooling_device_ops *ops;bool updated; /* true if the cooling device does not need update */struct mutex lock; /* protect thermal_instances list */struct list_head thermal_instances;struct list_head node;
};

IPA属于thermal_governor,是整个控制框架的核心部分,其上承接thermal_zone的采集设备,其下控制thermal_cooling_device的运作。具体的作用是根据thermal_zone采集的温度判断需不需要进入温控,需要进入什么样的温控,进而再判断是否需要thermal_cooling_device进行运作、进行怎么样的运作。

什么是IPA呢

终于说到IPA了。IPA提出前,整个DVFS的动态调整其实是一个相对原始的状态。使用的是step-wise的调整形式。即人为先预设好对应的温度和频率的关系,达到多少度,降多少频——这多少有点太原始了,而且每个平台都需要根据芯片的能效曲线进行特制的调整。

我们为什么不能像DVFS一样呢?有一个自动的性能和功耗的度量,对实时的工作负载和功耗进行适配,最终达到最优的温控效果呢?

IPA(intelligence power allocator)就应运而生了,IPA最早由ARM提出,用来作为DVFS框架下的温控方案。主要由两方面构成

  • 基于PID的温度控制器

  • 基于功耗预算的功耗分配系统

接下来先埋个坑,计划用两到三篇文章,详细讲讲IPA的工作流程。

Linux内核中最牛逼的温控方案——IPA(一)相关推荐

  1. Linux内核中Makefile、Kconfig、

    核心:学习过数据结构的童鞋应该知道,对于一棵非标准树,还是有办法将其进行遍历的,只是算法比较复杂而已.那么在Linux内核源码的这棵树,就是通过Kconfig文件建立各层子目录之间的连接,通过Make ...

  2. Linux内核中锁机制之完成量、互斥量

    在上一篇博文中笔者分析了关于信号量.读写信号量的使用及源码实现,接下来本篇博文将讨论有关完成量和互斥量的使用和一些经典问题. 八.完成量 下面讨论完成量的内容,首先需明确完成量表示为一个执行单元需要等 ...

  3. 简单谈一点linux内核中套接字的bind机制--数据结构以及端口确定

    众所周知,创建一个套接字可以bind到一个特定的ip地址和端口,实际上套接字这一概念代表了TCP/IP协议栈的应用层标识,协议栈中的应用层就是通过一个ip地址和一个端口号标识的,当然这仅仅是对于TCP ...

  4. Linux 内核中的 Device Mapper 机制

    本文结合具体代码对 Linux 内核中的 device mapper 映射机制进行了介绍.Device mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物理设备的映射框架机制,在该机 ...

  5. 如何放出Linux内核中的链表大招

    前言 上回,我们说到Linux内核中max()宏的终极奥义,Linux内核链表也不甘示弱,那么接下来,让我们看看Linux内核中的链表大招. 如何放出Linux内核中的链表大招 前言 一.链表简介 ( ...

  6. Linux内核中max()宏的奥妙何在?(一)

    Linux内核中max()宏的奥妙何在?(一) 1.max()宏那点事 在Linux内核中,有这样四个比较大小的函数,如下: max(x,y) //两个数求最大值 min(x,y) //两个数求最小值 ...

  7. Linux内核中max()宏的奥妙何在?(二)——大神Linus对这个宏怎么看?

    最新max()宏 上回,我们在<Linux内核中max()宏的奥妙何在?(一)>一文中说到,在3.18.34版Linux内核源码中的max()宏,采用了GCC的扩展特性,可以避免一些错误. ...

  8. Linux中文件描述符1,linux内核中的文件描述符(一)--基础知识简介

    原标题:linux内核中的文件描述符(一)--基础知识简介 Kernel version:2.6.14 CPU architecture:ARM920T Author:ce123(http://blo ...

  9. Linux 内核中的 GCC 特性(zz)

    from:http://www.ibm.com/developerworks/cn/linux/l-gcc-hacks/ GCC 和 Linux 是出色的组合.尽管它们是独立的软件,但是 Linux ...

最新文章

  1. 【linux】Valgrind工具集详解(十五):Callgrind(性能分析图)
  2. CentOS7系统下修改网卡为eth0
  3. 统计简单学_回归分析
  4. There is no Action mapped for namespace [/] and action name [LoginAction_home] associ
  5. socket编程总结
  6. Android Studio目录结构分析
  7. 工作81:图片间隙问题
  8. php7 测试数据库_达梦数据库PHP连接测试
  9. centos使用vnc实现远程访问图形化界面
  10. 13.远程登录 Linux
  11. 独家对话微软顶级代码女神潘正磊:Visual Studio 与 VS Code 的未来走向 | 人物志...
  12. Java--中文转换拼音,jpinyin-1.0.jar
  13. windows 安装cab文件
  14. cat 常用的日志分析架构方案_深度剖析|数据库生产常用架构方案
  15. dying relu 和weight decay
  16. 易經大意(21) 三和 韓長庚 著
  17. 海阳顶端网php,海阳顶端网的ASP木马的一个漏洞和利用
  18. 遇见2016年最值得期待的新产品
  19. 如何将中文地址翻译成英文
  20. text/template与html/template的区别

热门文章

  1. 4大重要营销概念的正本清源
  2. 两台电脑通过trunk口互通,修改trunk 接口pvid后不通了 <1>
  3. [安全攻防进阶篇] 二.如何学好逆向分析、逆向路线推荐及吕布传游戏逆向案例
  4. mysql 人员查询总结
  5. C++实现双人中国象棋(一)——算法篇(附完整代码)
  6. 关于谷歌浏览器不能用flash插件的问题
  7. 环境配置 | 更改注册表使PPT导出的图片分辨率达到300dpi
  8. Android:从零开始打造自己的深度链接库(一):ARouter简介
  9. 运用CS-LBP提取裂纹的梯度特征
  10. C# Chart 曲线(多曲线展示)