2008-10-09 92 views

回答

28
System.Environment.ProcessorCount 

返回数字

http://msdn.microsoft.com/en-us/library/system.environment.processorcount.aspx

对于物理处理器数量,您可能需要使用WMI - 在XP/Win2k3以上版本支持以下元数据(在Vista/Win2k8之前在SP中启用的功能)。

Win32_ComputerSystem.NumberOfProcessors返回盘点

Win32_ComputerSystem.NumberOfLogicalProcessors返回逻辑(废话!)

,应谨慎使超线程CPU出现相同multicore'd CPU的尚未表现特点是很不一样

要检查启用HT的CPU是否检查Win32_Processor的每个实例并比较这两个属性。

Win32_Processor.NumberOfLogicalProcessors

Win32_Processor.NumberOfCores

在多核系统中,这些通常是相同的值。

此外,请注意系统可能有多个处理器组,这在有大量处理器的计算机上经常出现。默认情况下,.Net will only using the first processor group - 这意味着默认情况下,线程将仅使用第一个处理器组中的CPU,并且Environment.ProcessorCount将仅返回此组中的CPU数量。根据Alastair Maw's answer,这种行为可以通过改变在app.config如下改变:

<configuration> 
    <runtime> 
     <Thread_UseAllCpuGroups enabled="true"/> 
     <GCCpuGroup enabled="true"/> 
     <gcServer enabled="true"/> 
    </runtime> 
</configuration> 
+0

您应该注意,它仅在XP SP3/Win2k3及更高版本中受支持。 – 2008-10-09 20:10:43

+0

Rick有XPSP2的修补程序 http://support.microsoft.com/kb/936235 – stephbu 2008-10-10 03:18:15

2

System.Environment.ProcessorCount是你所需要的

+0

第一次发布Environment.GetEnvironmentVariable(“NUMBER_OF_PROCESSORS”),但后来我意识到它已经在一个单独的属性中解析了。 – 2008-10-09 18:22:27

+0

ProcessorCount返回逻辑处理器数量,而不是物理处理器数量,甚至核心数量。不是OP要求的。 – Conrad 2013-01-31 15:09:45

2

Environment.ProcessorCount

编辑:在.NET 2.0中提供,而不是在.NET逻辑处理器的1.1

+1

但是不返回核心数量。仅限逻辑CPU – stephbu 2008-10-09 18:33:15

3

Environment.ProcessorCount还将包括任何超线程处理器。

有没有办法(至少通过Windows 2003)区分超线程处理器和双核处理器。

+0

不完全正确 - 有几个服务包可为XP和Win2k3启用WMI CPU元数据 – stephbu 2008-10-09 18:31:29

3

实际上,这取决于目标平台的差异。 Stephbu的答案在XP SP3和更新的版本上效果很好。

如果您针对的是较旧的平台,则可能需要查看this article。我在半年前写了这篇文章,并在其中讨论了几种不同的方法来做到这一点,以及每种方法的个人利弊。

如果您有兴趣将影子核心与超线程与真实线程区分开来,您可能还想查看this code project article

10

虽然Environment.ProcessorCount确实会为您带来系统中虚拟处理器的数量,这可能不是您的进程可用的处理器数量。我掀起了一个小巧的静态类/属性来获取正是:

using System; 
using System.Diagnostics; 

/// <summary> 
/// Provides a single property which gets the number of processor threads 
/// available to the currently executing process. 
/// </summary> 
internal static class ProcessInfo 
{ 
    /// <summary> 
    /// Gets the number of processors. 
    /// </summary> 
    /// <value>The number of processors.</value> 
    internal static uint NumberOfProcessorThreads 
    { 
     get 
     { 
      uint processAffinityMask; 

      using (var currentProcess = Process.GetCurrentProcess()) 
      { 
       processAffinityMask = (uint)currentProcess.ProcessorAffinity; 
      } 

      const uint BitsPerByte = 8; 
      var loop = BitsPerByte * sizeof(uint); 
      uint result = 0; 

      while (--loop > 0) 
      { 
       result += processAffinityMask & 1; 
       processAffinityMask >>= 1; 
      } 

      return (result == 0) ? 1 : result; 
     } 
    } 
} 
1

您可以使用PowerShell来获取全面的处理器信息。例如,您可以运行以下命令来获取CPU核心数量:

Get-WmiObject -namespace root\CIMV2 -class Win32_Processor -Property NumberOfCores 

它更容易研究WMI使用某种资源管理器工具时。因此,我建议您使用WMI浏览工具(例如WMIExplorerWMI CIM Studio)来探索WMI类,属性和方法。