当你运行Mac OS X时,你如何从命令行得知机器上有多少核?在Linux上,我使用:

x=$(awk '/^processor/ {++n} END {print n+1}' /proc/cpuinfo)

虽然不完美,但已经很接近了。这是为了让feedto make,这就是为什么它给出的结果比实际数字高1。我知道上面的代码可以用Perl写得更密集,也可以用grep、wc和cut来写,但我认为上面的代码是简洁和可读性之间的一个很好的折衷。

非常晚的编辑:澄清一下:我问的是有多少逻辑核可用,因为这对应于我想要生成多少同步作业。jkp的回答,经过Chris Lloyd的进一步完善,正是我所需要的。YMMV。


当前回答

下面的命令提供了关于CPU的所有信息

$ sysctl -a | sort | grep cpu

其他回答

system_profiler SPHardwareDataType显示我有1个处理器和4个核心。

[~] system_profiler SPHardwareDataType
Hardware:

    Hardware Overview:

      Model Name: MacBook Pro
      Model Identifier: MacBookPro9,1
      Processor Name: Intel Core i7
      Processor Speed: 2.6 GHz
      Number of Processors: 1
      Total Number of Cores: 4

      <snip>

[~] 

然而,sysctl不同意:

[~] sysctl -n hw.logicalcpu
8
[~] sysctl -n hw.physicalcpu
4
[~] 

但是sysctl似乎是正确的,因为当我运行一个应该占用所有CPU插槽的程序时,我看到这个程序占用了接近800%的CPU时间(在顶部):

PID   COMMAND      %CPU  
4306  top          5.6   
4304  java         745.7 
4296  locationd    0.0  

执行system_profiler | grep "Cores"命令。

我有一个:

MacBook Pro Retina, 2012年年中。 处理器:2.6 GHz英特尔酷睿i7

user$ system_profiler | grep "Cores"
      Total Number of Cores: 4

user$ sysctl -n hw.ncpu
8

根据维基百科(http://en.wikipedia.org/wiki/Intel_Core#Core_i7),没有8个物理核的Core i7,所以超线程的想法肯定是这样的。忽略sysctl,使用system_profiler值以保证准确性。真正的问题是,您是否能够有效地运行具有4核的应用程序(长编译作业?)而不中断其他进程。

运行4核并行编译器似乎不会显著影响常规操作系统。所以,把它当作8核来处理也不是那么糟糕。

下面的命令提供了关于CPU的所有信息

$ sysctl -a | sort | grep cpu

要在C中做到这一点,你可以使用sysctl(3)函数族:

int count;
size_t count_len = sizeof(count);
sysctlbyname("hw.logicalcpu", &count, &count_len, NULL, 0);
fprintf(stderr,"you have %i cpu cores", count);

用有趣的值来代替“hw”。Logicalcpu”,用于计算内核数,是(来自内核源代码中的注释):

hw.ncpu: The maximum number of processors that could be available this boot. Use this value for sizing of static per processor arrays; i.e. processor load statistics. hw.activecpu: The number of processors currently available for executing threads. Use this number to determine the number threads to create in SMP aware applications. This number can change when power management modes are changed. hw.physicalcpu: The number of physical processors available in the current power management mode. hw.physicalcpu_max: The maximum number of physical processors that could be available this boot. hw.logicalcpu: The number of logical processors available in the current power management mode. hw.logicalcpu_max: The maximum number of logical processors that could be available this boot.

在运行Mavericks的MacBook Pro上,sysctl -a | grep hw。CPU只会返回一些神秘的细节。在machdep中显示了更详细和可访问的信息。CPU部分,即:

sysctl -a | grep machdep.cpu

特别是,对于具有超线程(HT)的处理器,您将看到枚举的总CPU计数(logical_per_package)是物理核心计数(cores_per_package)的两倍。

sysctl -a | grep machdep.cpu  | grep per_package