Runtime.availableProcessors:它将返回什么?

时间:2012-02-23 22:28:16

标签: java

Java 1.6中Runtime.availableProcessors()的javadoc非常不明确。它只关注硬件配置,还是负载?它是否足够智能以避免被超线程所愚弄?它是否通过linux taskset命令尊重一组有限的处理器?

我可以添加一个我自己的数据点:在这里有12个内核和超线程的计算机上,Runtime.availableProcessors()确实返回24,这不是一个很好的数字,用于决定尝试运行多少个线程。机器显然没有死机,因此它也无法以任何有效的方式查看负载。

3 个答案:

答案 0 :(得分:8)

在Windows上,使用GetSystemInfo并从返回的dwNumberOfProcessors结构中SYSTEM_INFO

这可以从OpenJDK源代码的void os::win32::initialize_system_info()中的int os::active_processor_count()os_windows.cpp看出。

来自MSDN文档的

dwNumberOfProcessors表示它报告了当前组中的逻辑处理器数量,这意味着超线程将增加报告的CPU数量。

在Linux上,os::active_processor_count()使用sysconf

int os::active_processor_count() {
  // Linux doesn't yet have a (official) notion of processor sets,
  // so just return the number of online processors.
  int online_cpus = ::sysconf(_SC_NPROCESSORS_ONLN);
  assert(online_cpus > 0 && online_cpus <= processor_count(), "sanity check");
  return online_cpus;
}

_SC_NPROCESSORS_ONLN文档说明&#39;当前在线(可用)的处理器数量。&#39;这不受过程亲和力的影响,也受超线程的影响。

答案 1 :(得分:2)

根据Sun Bug 6673124

  

active_processor_count使用的Runtime.availableProcessors()代码如下:

int os::active_processor_count() {
  int online_cpus = sysconf(_SC_NPROCESSORS_ONLN);
  pid_t pid = getpid();
  psetid_t pset = PS_NONE;
  // Are we running in a processor set?
  if (pset_bind(PS_QUERY, P_PID, pid, &pset) == 0) {
    if (pset != PS_NONE) {
      uint_t pset_cpus;
      // Query number of cpus in processor set
      if (pset_info(pset, NULL, &pset_cpus, NULL) == 0) {
    assert(pset_cpus > 0 && pset_cpus <= online_cpus, "sanity check");
    _processors_online = pset_cpus;
    return pset_cpus;
      }
    }
  }
  // Otherwise return number of online cpus
  return online_cpus;
}

此特定代码可能是特定于Solaris的。但我认为这种行为在其他平台上至少会有些相似。

答案 2 :(得分:1)

AFAIK,它总是为您提供可用CPU的总数,即使那些不可用于调度的CPU也是如此。我有一个库,使用这个事实来找到保留的cpus。我读取了/ proc / cpuinfo和进程的默认线程关联,以确定可用的内容。