zoukankan      html  css  js  c++  java
  • 如何获取 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平台(Android based on 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(),其源码分别如下:

    http://androidxref.com/9.0.0_r3/xref/bionic/libc/bionic/sysinfo.cpp#64

    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个

    6 再多说就要挨打了,差不多就这样了

      个人拙见,不当之处请指教

    心有猛虎,细嗅蔷薇,生活就该无惧无悔
    ----------------------------------------------------------------------------
    作者:二的次方
    本文版权归作者和博客园共有,转载必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利
  • 相关阅读:
    bzoj1178/luogu3626 会议中心 (倍增+STL::set)
    suoi31 最近公共祖先2 (倍增lca)
    luogu4155/bzoj4444 国旗计划 (倍增)
    [BZOJ1864][Zjoi2006]三色二叉树
    [Luogu3070][USACO13JAN]岛游记Island Travels
    [Luogu2458][SDOI2006]保安站岗
    [BZOJ1191][HNOI2006]超级英雄Hero
    [BZOJ1050][HAOI2006]旅行
    [Luogu2973][USACO10HOL]赶小猪Driving Out the Piggi…
    [BZOJ1833][ZJOI2010]数字计数
  • 原文地址:https://www.cnblogs.com/roger-yu/p/15233874.html
Copyright © 2011-2022 走看看