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

前言

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

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

性能与功耗的平衡

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

P=c\times V^{2} \times f

为什么是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的工作流程。

  • 9
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Linux0.11内核源码解读第一季——汇编启动部分》是一本深入解析Linux0.11内核源代码的书籍。汇编启动部分是整个内核启动过程的重要环节,能够帮助读者深入理解操作系统的启动和初始化流程。 首先,汇编启动部分是内核启动的第一步。它通过软件断机制在实模式下启动。通过设置系统段描述符和全局描述符表,为操作系统提供必要的运行环境。在启动过程,汇编启动部分会初始化断向量表、设置栈段(SS)和栈指针(SP),并跳转到引导扇区加载内核文件。 接着,书籍详细分析了引导扇区的装载过程。引导扇区会被BIOS加载到内存地址0x7C00处,然后执行引导扇区的代码。在引导扇区,汇编启动部分会进行一些必要的初始化工作,如设置栈段和栈指针,加载断描述符表以及读取磁盘上的内核文件。 此外,书籍还介绍了一些启动相关的概念和知识,如分段机制、实模式和保护模式之间的切换等。读者通过学习这些知识,可以更加清楚地了解硬件和操作系统之间的交互过程。 总之,汇编启动部分是Linux0.11内核启动的关键环节,对于理解操作系统的启动过程非常重要。《Linux0.11内核源码解读第一季——汇编启动部分》通过深入剖析源代码,让读者能够全面了解Linux内核的启动过程,并通过这些知识来探索更深入的操作系统原理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值