现在的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. thinkphp 3.2.3 - App.class.php 解析

    class App { public static function init() { load_ext_file(COMMON_PATH); // { // /home/www/www.domain ...

  2. CCPC_1003

    这个题可以暴力的哟,直接暴力的哟 不用做什么订立的哟 不需要特别判断的哟 去死吧!!!愚蠢的我! #include<bits/stdc++.h> using namespace std; ...

  3. volatile、synchronized、lock有什么区别,以及在哪些场景下使用哪种方式?

    [转]JVM锁机制volatile/synchronized/lock 1.volatile实现原理 (1)聊聊并发(一)——深入分析Volatile的实现原理 --硬件级别锁实现,Lock前缀指令会 ...

  4. AD管理中心

    (一).安装 Active Directory 管理中心 引用位置: http://technet.microsoft.com/zh-cn/library/dd560652(WS.10).aspx ( ...

  5. 【Maximum Subarray 】cpp

    题目: Find the contiguous subarray within an array (containing at least one number) which has the larg ...

  6. 想进BAT?这些面试题助你一臂之力

    1 软性热身题 这种题目,考的就是你的软性能力,比如表达能力,理解能力,协调能力,一个词概括就是套路.这类题目会在面试开始热身的时候,问一道两题,不会多,但是如果你能回答的有条不紊,清晰达意,那么就会 ...

  7. java中常用的几种缓存类型介绍

    在平时的开发中会经常用到缓存,比如locache.redis等,但一直没有对缓存有过比较全面的总结.下面从什么是缓存.为什么使用缓存.缓存的分类以及对每种缓存的使用分别进行分析,从而对缓存有更深入的了 ...

  8. Django中从本地上传excel文件并将数据存储到数据库

    Django中从本地上传excel文件并将数据存储到数据库 一.前端界面 <div class="page-container"> <form action=&q ...

  9. Halcon11 Windows版 下载

    Halcon11 下载地址:http://www.211xun.com/download_page_2.html HALCON 11 是一套机器视觉图像处理库,由一千多个算子以及底层的数据管理核心构成 ...

  10. 实战小项目之RTMP流媒体演示系统

    项目简介 windows下使用基于Qt对之前的RtmpApp进行封装与应用,单独功能使用线程执行,主要包括以下几个功能: 视频下载 推送文件 推送摄像头数据或者桌面 基于libvlc的播放器 视频下载 ...