专栏名称: 安卓开发精选
伯乐在线旗下账号,分享安卓应用相关内容,包括:安卓应用开发、设计和动态等。
目录
相关文章推荐
开发者全社区  ·  中高端岗位也不保?deepseek干掉了量化研究员 ·  10 小时前  
开发者全社区  ·  真High! ·  18 小时前  
开发者全社区  ·  计算机开始跌落神坛,想不到这么差... ·  20 小时前  
开发者全社区  ·  北舞身材管理曝光 ·  昨天  
开发者全社区  ·  微信+DeepSeek来了 ·  2 天前  
51好读  ›  专栏  ›  安卓开发精选

对 Android 设备 CPU 进行锁频

安卓开发精选  · 公众号  · android  · 2017-03-03 21:36

正文

(点击 上方公众号 ,可快速关注)

来源: 伯乐在线专栏作者 - debugtalk

http://android.jobbole.com/82921/

如有好文章投稿,请点击 → 这里了解详情


本文对Android设备CPU的状态查看方法和锁频(lock frequency)方法进行详细介绍。这有什么用?作为测试工程师,你值得了解。


CPU频率


首先说下CPU的频率。我们都知道,CPU的工作频率越高,运算就越快,但能耗也更高。然而很多时候,设备并不需要那么高的计算性能,这个时候,我们就希望能降低CPU的工作频率,追求较低的能耗,以此实现更长的待机时间。


基于此需求,当前电子设备的CPU都会存在多个工作频率,并能根据实际场景进行CPU频率的自动切换,以此达到平衡计算性能与能耗的目的。


锁频的用途


那么为什么需要锁频呢?


对于普通用户来说,可能对这些场景比较熟悉:


在家用笔记本电脑玩游戏的时候,电脑连着电源,不在乎能耗,只想要尽可能高的性能,这个时候就选择高性能模式,即保持CPU在最高频率工作。


旅行途中使用笔记本电脑,靠电池供电,希望电脑能待机尽可能久,这时就选择省电模式,即CPU保持在最低频率运行。


作为一名测试工程师,我们在进行软件测试的时候,为了让测试结果真实反映软件本身的效率,从控制变量法的角度,我们希望测试结果尽量不受到硬件本身的影响。这个时候,我们就可以尝试对设备的CPU进行锁频,即保证在测试的过程中,硬件设备的CPU运行在一个恒定的频率。


说到这里先埋个伏笔,在chromium官方测试库中,部分测试场景在初始化测试环境时,就会将设备所有CPU的频率调到最高状态,后续我会单独以一篇博客的形式对那部分的源码进行分析。对于等不及的朋友,可以先去看下源码,源码路径为pylib/perf/PerfControl.SetHighPerfMode。


查看CPU状态信息


在修改CPU的状态之前,我们需要先查看CPU的属性和状态信息,这样才能有针对性地进行正确的设置。


对于CPU的状态,我们通常会关注两类信息,一是整体层面的,即CPU运行的核数;二是细节层面的,即各个CPU的工作状态,包括所处工作模式、频率大小等。


在Android系统中,CPU相关的信息存储在/sys/devices/system/cpu目录的文件中,我们可以通过读取该目录下的特定文件获得当前设备的CPU状态信息,也可以通过对该目录下的特定文件进行写值,实现对CPU频率等状态信息的更改。


本文以Nexus 5(系统版本5.1.1)为例,后面的例子均以该设备为例。不同的机型和Android系统版本可能会存在一些差异,请知悉。


在/sys/devices/system/cpu目录中,文件结构如下所示。


shell @ hammerhead :/ sys / devices / system / cpu $ ll

drwxr - xr - x root root 2016 - 01 - 20 01 : 36 cpu0

drwxr - xr - x root root 2016 - 01 - 20 21 : 06 cpu1

drwxr - xr - x root root 2016 - 01 - 20 21 : 07 cpu2

drwxr - xr - x root root 2016 - 01 - 20 21 : 07 cpu3

- rw ------- root root 4096 1970 - 01 - 17 10 : 27 cpuctl

drwxr - xr - x root root 1970 - 01 - 17 10 : 27 cpufreq

drwxr - xr - x root root 1970 - 01 - 17 10 : 27 cpuidle

- r -- r -- r -- root root 4096 1970 - 01 - 17 10 : 27 kernel_max

- r -- r -- r -- root root 4096 1970 - 01 - 17 10 : 27 offline

- r -- r -- r -- root root 4096 1970 - 01 - 17 10 : 27 online

- r -- r -- r -- root root 4096 1970 - 01 - 17 10 : 27 possible

drwxr - xr - x root root 1970 - 01 - 17 10 : 27 power

- r -- r -- r -- root root 4096 1970 - 01 - 17 10 : 27 present

- rw - r -- r -- root root 4096 1970 - 01 - 17 10 : 27 uevent


1、view overall cpu info


在possible文件中,存储的是当前设备可用的CPU,显示形式以数字的形式。例如0-3代表的就是当前设备总共有4个核,编号分别为0,1,2,3。


shell @ hammerhead :/ sys / devices / system / cpu $ cat possible

0 - 3


在online文件中,存储的是当前设备正在运行的CPU。因为有时候设备不需要很高的性能,就可以将部分CPU关闭。不过需要注意的是,不管什么时候,CPU0始终都会处于运行状态。online文件的存储格式与possible类似,如果只有部分CPU运行,且CPU编号不连续的时候,会以逗号进行隔开;例如,0,2表示当前CPU0和CPU2处于运行状态。


shell @ hammerhead :/ sys / devices / system / cpu $ cat online

0 , 2


对应的,offline文件标示的是当前设备处于关闭状态的CPU,这和online作为互补,并集刚好就是设备的所有CPU,即possible文件中的内容。


shell @ hammerhead :/ sys / devices / system / cpu $ cat offline

1 , 3


2、view specified cpu info


接下来,我们要获取到特定CPU的信息,就需要进入到对应的文件夹,例如,cpu0/对应的就是CPU0的信息。


在/sys/devices/system/cpu/cpu0目录中,文件结构如下所示。


shell @ hammerhead :/ sys / devices / system / cpu $ ll cpu0

drwxr - xr - x root root 2016 - 01 - 20 01 : 37 cpufreq

drwxr - xr - x root root 1970 - 01 - 17 10 : 27 cpuidle

- r -------- root root 4096 1970 - 01 - 17 10 : 27 crash_notes

- rw - r -- r -- root root 4096 2016 - 01 - 20 01 : 36 online

drwxr - xr - x root root 1970 - 01 - 17 10 : 27 power

drwxr - xr - x root root 1970 - 01 - 17 10 : 27 rq - stats

lrwxrwxrwx root root 1970 - 01 - 17 10 : 27 subsystem

drwxr - xr - x root root 1970 - 01 - 17 10 : 27 topology

- rw - r -- r -- root root 4096 1970 - 01 - 17 10 : 27 uevent


其中,online文件的内容表示当前CPU是否处于运行状态,若处于运行状态,则内容为1,否则为0;这个和上面讲到的/sys/devices/system/cpu/online能进行对应。


shell @ hammerhead :/ sys / devices / system / cpu $ cat cpu0 / online

1


在cpu0/cpufreq/目录下,存储的就是与CPU0的频率相关的信息,文件结构如下所示。


shell @ hammerhead :/ sys / devices / system / cpu $ ll cpu0 / cpufreq /

- rw - r -- r -- root root 4096 2016 - 01 - 20 01 : 57 UV_mV_table

- r -- r -- r -- root root 4096 2016 - 01 - 20 01 : 57 affected_cpus

- r -- r -- r -- root root 4096 2016 - 01 - 20 01 : 57 cpu_utilization

- r -------- root root 4096 2016 - 01 - 20 01 : 57 cpuinfo_cur_freq

- r -- r -- r -- root root 4096 2016 - 01 - 20 02 : 00 cpuinfo_max_freq

- r -- r -- r -- root root 4096 2016 - 01 - 20 01 : 39 cpuinfo_min_freq

- r -- r -- r -- root root 4096 2016 - 01 - 20 01 : 57 cpuinfo_transition_latency

- r -- r -- r -- root root 4096 2016 - 01 - 20 01 : 57 related_cpus

- r -- r -- r -- root root 4096 2016 - 01 - 20 01 : 39 scaling_available_frequencies

- r -- r -- r -- root root 4096 2016 - 01 - 20 01 : 57 scaling_available_governors

- r -- r -- r -- root root 4096 2016 - 01 - 20 01 : 50 scaling_cur_freq

- r -- r -- r -- root root 4096 2016 - 01 - 20 01 : 57 scaling_driver

- rw - r -- r -- root root 4096 2016 - 01 - 20 01 : 50 scaling_governor

- rw - r -- r -- root root 4096 2016 - 01 - 20 08 : 29 scaling_max_freq

- rw - r -- r -- root root 4096 2016 - 01 - 20 08 : 29 scaling_min_freq

- rw - r -- r -- root root 4096 2016 - 01 - 20 02 : 52 scaling_setspeed


在这个目录中,我们需要关注的文件比较多。


首先是scaling_available_governors和scaling_governor。这里的governor大家可以理解为CPU的工作模式,scaling_available_governors中存储了当前CPU支持的所有工作模式,而scaling_governor存储的是CPU当前所处的工作模式。


shell @ hammerhead :/ sys / devices / system / cpu $ cat cpu0 / cpufreq / scaling_available_governors

impulse dancedance smartmax interactive conservative ondemand userspace powersave Lionheart bioshock performance







请到「今天看啥」查看全文


推荐文章
开发者全社区  ·  中高端岗位也不保?deepseek干掉了量化研究员
10 小时前
开发者全社区  ·  真High!
18 小时前
开发者全社区  ·  计算机开始跌落神坛,想不到这么差...
20 小时前
开发者全社区  ·  北舞身材管理曝光
昨天
开发者全社区  ·  微信+DeepSeek来了
2 天前
廣告狂人  ·  文案,一定要听林夕!
7 年前
供应链金融  ·  供应链金融风险管控的浅析贸易金融
7 年前
智谷趋势  ·  如果不出意外,你的孩子必将平凡
7 年前
冯站长之家  ·  2017年7月16日医疗晨报(语音版)
7 年前