现在的Android手机双核、四核变得非常普遍,同时CPU频率经常轻松上2G,功耗肯定会显著增加。而大多数的ARM架构的CPU采用的是对称多处理(SMP)的方式处理多CPU。这就意味着每个CPU核心是被平等对待的,同时打开又同时关闭。显然,这样的做法在Mobile Device上显得很耗能。所以,Qualcomm的Snapdragon CPU使用了一种叫非对称多处理(aSMP)的技术,每个CPU核心可以独立的开启和关闭,也能设置不同的频率。因此,针对使用Snapdragon CPU的Android手机,我们可以通过限制CPU核心数或者限制CPU的频率达到节能的目的。

关闭mpdecision

Snapdragon有一个叫做mpdecision的程序管理CPU各个核心的开、关和频率。所以如果想手动开关CPU的核心或者设置CPU核心的频率就必须把这个程序关闭。

1
stop mpdecision

需要注意的是,这个程序会在每次启动后执行,所以每次重启后都需要重新执行上面的命令停止mpdecisiopn。

设置CPU的核心数

在/sys/devices/system/cpu目录下可以看到你的CPU有几个核心,如果是双核,就是cpu0和cpu1,如果是四核,还会加上cpu2和cpu3。
随便进一个文件夹,比如cpu1,里面有个online文件。我们可以用cat命令查看该文件的内容

1
cat /sys/devices/system/cpu/cpu1/online

这个文件只有一个数字,0或1。0表示该核心是offline状态的,1表示该核心是online状态的。所以,如果你想关闭这个核心,就把online文件的内容改为“0”;如果想打开该核心,就把文件内容改为“1”。

1
2
echo "0" /sys/devices/system/cpu/cpu1/online # 关闭该CPU核心
echo "1" /sys/devices/system/cpu/cpu1/online # 打开该CPU核心

设置CPU的频率

首先我们要修改governor的模式,但在修改前需要查下CPU支持哪些governor的模式

1
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors

我用的是Nexus 4手机,所以有以下5个选择,其他的手机型号可能略有不同

1
interactive ondemand userspace powersave performance

这里performance表示不降频,ondemand表示使用内核提供的功能,可以动态调节频率,powersvae表示省电模式,通常是在最低频率下运行,userspace表示用户模式,在此模式下允许其他用户程序调节CPU频率。
在这里,我们将模式调整为“userspace”。

1
echo "userspace" /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

然后我们对CPU的频率进行修改,CPU的频率不是可以任意设置的,需要查看scaling_available_frequencies文件,看CPU支持哪些频率。

1
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies

从我的手机中可以获得以下的值
384000 486000 594000 702000 810000 918000 1026000 1134000 1242000 1350000 1458000 1512000
这里的频率是以Hz为单位的,我准备将cpu0设置为1.242GHz,那就将1242000写入scaling_setspeed即可。

1
echo "1242000" /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed

设置好后,我们可以通过scaling_cur_freq文件查看当前这个核心的频率

1
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq

最后我们也可以设置下CPU的最大和最小频率,只需要将需要设置的频率值写入scaling_max_freq和scaling_min_freq即可

1
2
echo "1350000" /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq # 设置最大频率
echo "384000" /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq # 设置最小频率

这里要注意的是“最大值”需要大于等于“最小值”。

注意,这里设置的仅为某个CPU核心的频率,你需要对每个online的CPU核心都进行设置,同时以上对文件的修改均需要root权限。

通过减少online的核心数和限制CPU频率固然可以起到节省电量的目的,但是性能也是显著降低,所以需要做一个权衡。

Android下设置CPU核心数和频率的更多相关文章

  1. 如何获取 Android CPU 核心数 (Java/C++)

    1 前言 最近学习Power HAL方面相关知识,透过Power HAL 去配置CPU的Freq需要先确定 CPU 核数.便先了解如何获取 Android CPU 核数. 2 Java层获取方式 // ...

  2. 根据CPU核心数确定线程池并发线程数(转)

    一.抛出问题 关于如何计算并发线程数,一般分两派,来自两本书,且都是好书,到底哪个是对的?问题追踪后,整理如下: 第一派:<Java Concurrency in Practice>即&l ...

  3. 查看电脑CPU核心数的方法

    查看电脑CPU核心数的方法: 方法一: 同时按下[Ctrl+Shift+Esc]组合快捷键打开任务管理器: 点击[性能]就可以看出是几核CPU了: 方法二: 在计算机图标上面点击右键,选择“管理”: ...

  4. 物理CPU数、CPU核心数、进程数

    参考CSDN博客:https://blog.csdn.net/helloworld0906/article/details/90547159 一. 物理cpu数.cpu核数.线程数(逻辑cpu数)的关 ...

  5. 使用GetLogicalProcessorInformation获取逻辑处理器的详细信息(NUMA节点数、物理CPU数、CPU核心数、逻辑CPU数、各级Cache)

    不过必须XP SP3以上才行.所有API大全: https://msdn.microsoft.com/en-us/library/windows/desktop/aa363804(v=vs.85).a ...

  6. using 40 logical processors based on SQL Server licensing SqlServer CPU核心数限制问题

    公司服务器是120核心cpu,但是实际应用中只有40核,原因是业务部门发现服务器cpu承载30%的时候sql 就会卡死: 然后从sqlserver 去查询,cpu核心数: SELECT COUNT(1 ...

  7. Nginx 关于进程数 与CPU核心数相等时,进程间切换的代价是最小的-- 绑定CPU核心

    在阅读Nginx模块开发与架构模式一书时: "Nginx  上的进程数 与CPU核心数相等时(最好每个worker进程都绑定特定的CPU核心),进程间切换的代价是最小的;" &am ...

  8. 如何查看服务器CPU核心数和线程数

    知道服务器CPU型号,那么我们如何在服务器里面查看服务器CPU核心数和线程数呢? 步骤: 先用鼠标右键点击屏幕最下方的任务栏空白处.会弹出一个菜单. 在菜单中用鼠标左键点选“启动任务管理器”. 点击任 ...

  9. 转 根据CPU核心数确定线程池并发线程数

    转自: https://www.cnblogs.com/dennyzhangdd/p/6909771.html?utm_source=itdadao&utm_medium=referral 目 ...

随机推荐

  1. Python9-IO模型-day41

    # 进程:启动多个进程,进程之间是由操作系统负责调用# 线程:启动多个线程,真正由被cpu执行的最小单位实际是线程# 开启一个线程,创建一个线程,寄存器.堆栈# 关闭一个线程# 协程# 本质上是一个线 ...

  2. 893E - Counting Arrays

    E. Counting Arrays time limit per test 3 seconds memory limit per test 256 megabytes input standard ...

  3. CodeForces:#448 div2 a Pizza Separation

    传送门:http://codeforces.com/contest/895/problem/A A. Pizza Separation time limit per test1 second memo ...

  4. JQ剪辑图片插件,适用于移动端和PC端

    主要用到以下JS文件: <script src="js/photo/iscroll-zoom.js"></script> <script src=&q ...

  5. git使用问题整理

    git访问远端仓库报"fatal: Authentication failed for"错误的,可能原因是账户密码变更,git配置了使用creditial helper,所以需要取 ...

  6. 怎么使用瓦特平台下面的“代码工厂”快速生成BS程序代码

    这里说一下怎么使用瓦特平台下面的“代码工厂”快速生成程序代码 使用平台:windows+"visual studio 2010"+"SqlServer2000+" ...

  7. Mac: mac git 的安装 及实现自动补全

    1.检查是否装了brew $ brew list 如果没有,拷贝以下命令到终端 回车.可以安装好brewruby -e "$(curl -fsSL https://raw.githubuse ...

  8. python 冒泡排序,快排

    一.冒泡排序 1.1.冒泡的原理 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有的 ...

  9. web 大规模并发访问的解决方案

    电商的秒杀和抢购,对我们来说,都不是一个陌生的东西.然而,从技术的角度来说,这对于Web系统是一个巨大的考验.当一个Web系统,在一秒钟内收到数以万计甚至更多请求时,系统的优化和稳定至关重要.这次我们 ...

  10. 练习题 - js函数

    代码贴出来 1 function Cat() { 2 getColor = function(){ console.log(1);} 3 return this; 4 } 5 Cat.getColor ...