如何获取 Android CPU 核心数 (Java/C++)
1 前言
最近学习Power HAL方面相关知识,透过Power HAL 去配置CPU的Freq需要先确定 CPU 核数。便先了解如何获取 Android CPU 核数。
2 Java层获取方式
// 获取 CPU 核数
Runtime.getRuntime().availableProcessors()
3 C++层获取方式
#include <unistd.h>
// 获取CPU核心数(包含禁用的)
long result = sysconf(_SC_NPROCESSORS_CONF);
// 获取可用的CPU核心数
long result = sysconf(_SC_NPROCESSORS_ONLN);
而在Linux平台下,我们可以使用sysconf()来获取处理器核数。
sysconf( )有unistd.h提供,要使用该函数需要#include<unistd.h>
其参数可以是 _SC_NPROCESSORS_CONF,也可以是 _SC_NPROCESSORS_ONLN。两者差异:
_SC_NPROCESSORS_CONF -- 返回系统可以使用的核数,但是其值会包括系统中禁用的核的数目,因此该值并不代表当前系统中可用的核数。
_SC_NPROCESSORS_ONLN -- 返回值真正的代表了系统 当前可用的核数
4 再多说两句--底层逻辑
针对上面的sysconf()函数我们看一下它的源码:
http://androidxref.com/9.0.0_r3/xref/bionic/libc/bionic/sysconf.cpp#69
long sysconf(int name) {
switch (name) {
......
case _SC_NPROCESSORS_CONF: return get_nprocs_conf();
case _SC_NPROCESSORS_ONLN: return get_nprocs();
......
}
}
上述流程也非常简单,分别调用到get_nprocs()和get_nprocs_conf(),其源码分别如下:
int get_nprocs_conf() {
// On x86 kernels you can use /proc/cpuinfo for this, but on ARM kernels offline CPUs disappear
// from there. This method works on both.
ScopedReaddir reader("/sys/devices/system/cpu");
if (reader.IsBad()) {
return 1;
}
int result = 0;
dirent* entry;
while ((entry = reader.ReadEntry()) != NULL) {
if (entry->d_type == DT_DIR && __matches_cpuN(entry->d_name)) {
++result;
}
}
return result;
}
int get_nprocs() {
int cpu_count = 1;
FILE* fp = fopen("/sys/devices/system/cpu/online", "re");
if (fp != nullptr) {
char* line = nullptr;
size_t len = 0;
if (getline(&line, &len, fp) != -1) {
cpu_count = GetCpuCountFromString(line);
free(line);
}
fclose(fp);
}
return cpu_count;
}
查看上面的源码是不是就一目了然了
_SC_NPROCESSORS_CONF ==> get_nprocs_conf() ==> 读取系统目录sys/devices/system/cpu下的文件,并匹配cpu0,cpu1,cpu2,cpu3....形式的目录来统计数目 -- 返回系统CPU核心数,但是其值会包括系统中禁用的核的数目
_SC_NPROCESSORS_ONLN ==> get_nprocs() ==> 读取系统文件/sys/devices/system/cpu/online的值 ==> 获取当前系统可用的CPU核心数
注意:
上面提到的Java层获取CPU数目的方法本质上也是经过一路的流程,最终调用到sysconf(_SC_NPROCESSORS_CONF)来获取的。
5 再多说两句--真机console下瞧一瞧
1. 切换到/sys/devices/system/cpu目录下,执行ls -l, 可以看到我的机子有4个核心:cpu0,cpu1,cpu2,cpu3

2. 执行 cat online 可以看到在线工作的有 0-3四个核心

3. 执行echo 0 > /sys/devices/system/cpu/cpu1/online 关掉cpu1这个核心,再看 cat online 就剩3个在工作了,cat offline 不在线的有1个

个人拙见,不当之处请指教
如何获取 Android CPU 核心数 (Java/C++)的更多相关文章
- 使用GetLogicalProcessorInformation获取逻辑处理器的详细信息(NUMA节点数、物理CPU数、CPU核心数、逻辑CPU数、各级Cache)
不过必须XP SP3以上才行.所有API大全: https://msdn.microsoft.com/en-us/library/windows/desktop/aa363804(v=vs.85).a ...
- Android下设置CPU核心数和频率
现在的Android手机双核.四核变得非常普遍,同时CPU频率经常轻松上2G,功耗肯定会显著增加.而大多数的ARM架构的CPU采用的是对称多处理(SMP)的方式处理多CPU.这就意味着每个CPU核心是 ...
- 根据CPU核心数确定线程池并发线程数(转)
一.抛出问题 关于如何计算并发线程数,一般分两派,来自两本书,且都是好书,到底哪个是对的?问题追踪后,整理如下: 第一派:<Java Concurrency in Practice>即&l ...
- using 40 logical processors based on SQL Server licensing SqlServer CPU核心数限制问题
公司服务器是120核心cpu,但是实际应用中只有40核,原因是业务部门发现服务器cpu承载30%的时候sql 就会卡死: 然后从sqlserver 去查询,cpu核心数: SELECT COUNT(1 ...
- Nginx 关于进程数 与CPU核心数相等时,进程间切换的代价是最小的-- 绑定CPU核心
在阅读Nginx模块开发与架构模式一书时: "Nginx 上的进程数 与CPU核心数相等时(最好每个worker进程都绑定特定的CPU核心),进程间切换的代价是最小的;" &am ...
- 如何查看服务器CPU核心数和线程数
知道服务器CPU型号,那么我们如何在服务器里面查看服务器CPU核心数和线程数呢? 步骤: 先用鼠标右键点击屏幕最下方的任务栏空白处.会弹出一个菜单. 在菜单中用鼠标左键点选“启动任务管理器”. 点击任 ...
- 查看电脑CPU核心数的方法
查看电脑CPU核心数的方法: 方法一: 同时按下[Ctrl+Shift+Esc]组合快捷键打开任务管理器: 点击[性能]就可以看出是几核CPU了: 方法二: 在计算机图标上面点击右键,选择“管理”: ...
- 物理CPU数、CPU核心数、进程数
参考CSDN博客:https://blog.csdn.net/helloworld0906/article/details/90547159 一. 物理cpu数.cpu核数.线程数(逻辑cpu数)的关 ...
- 转 根据CPU核心数确定线程池并发线程数
转自: https://www.cnblogs.com/dennyzhangdd/p/6909771.html?utm_source=itdadao&utm_medium=referral 目 ...
随机推荐
- Selenium环境搭建 - Mac电脑
一. JDK安装 1.1.官网下载1.8版本 可参考以下链接步骤: 'https://blog.csdn.net/u014801367/article/details/86288078' 1.2.jd ...
- 透视RPC协议:SOFA-BOLT协议源码分析
前提 最近在看Netty相关的资料,刚好SOFA-BOLT是一个比较成熟的Netty自定义协议栈实现,于是决定研读SOFA-BOLT的源码,详细分析其协议的组成,简单分析其客户端和服务端的源码实现. ...
- MySQL 执行优化查询
查询执行的基础 当希望MySQL能够以更高的性能运行查询时,最好的办法就是弄清楚MySQL是如何优化和执行查询的.当向MySQL发送一个请求的时候,MySQL执行过程如图1-1所示: 图1-1 查询执 ...
- C++ 二进制文件 读 写文件
1 #include <iostream> 2 #include <string> 3 #include<fstream> 4 using namespace st ...
- 《Python Cookbook v3.0.0》Chapter1 数据结构和算法
感谢: https://github.com/yidao620c/python3-cookbook 如有侵权,请联系我整改. 本文章节会严格按照原书(以便和原书对照,章节标题可能会略有修改),内容会有 ...
- 适配Android10 拍照,相册,裁剪,上传图片
这篇文章主要介绍了适配Android 10(Q)后,调用系统拍照,系统相册,系统裁剪和上传问题,这是一个很常用的功能,但是在Android 6.0,Android 7.0和Android 10.0以上 ...
- 007 GMII、SGMII和SerDes的区别和联系
一.GMII和SGMII的区别和联系 GMII和SGMII区别,上一篇已经介绍了,这一篇重点介绍SGMII和SerDes区别. GMII和SGMII GMII 在MII接口基础上提升了数据位宽和Clo ...
- HTML界的“苏炳添”——详解Canvas优越性能和实际应用
Google Docs宣布将会把HTML迁移到基于Canvas渲染,这一消息的出现再次把几年前随HTML5诞生的标签重新推到了人们视线之中.Canvas在刚推出时主打的优势就是更快的渲染速度,堪称HT ...
- wpf Button 动态改变效果
<Button x:Name="LearnMore" Grid.Row="6" HorizontalAlignment="Left&quo ...
- 【spring 注解驱动开发】spring事务处理原理
尚学堂spring 注解驱动开发学习笔记之 - 事务处理 事务处理 1.事务处理实现 实现步骤: * 声明式事务: * * 环境搭建: * 1.导入相关依赖 * 数据源.数据库驱动.Spring-jd ...