检测处理器数量

时间:2008-10-09 18:18:24

标签: .net wmi cpu environment

如何检测.net中的物理处理器/核心数?

8 个答案:

答案 0 :(得分: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 返回逻辑(duh!)

请注意,HyperThreaded CPU看起来与多核CPU相同,但性能特征非常不同。

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

  

Win32_Processor.NumberOfLogicalProcessors

     

Win32_Processor.NumberOfCores

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

另外,请注意可能具有多个处理器组的系统,这通常出现在具有大量处理器的计算机上。默认情况下为.Net will only using the first processor group - 这意味着默认情况下,线程将仅使用第一个处理器组中的CPU,而Environment.ProcessorCount将仅返回该组中的CPU数。根据{{​​3}},可以通过更改app.config来更改此行为,如下所示:

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

答案 1 :(得分: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;
        }
    }
}

答案 2 :(得分:3)

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

没有办法(至少通过Windows 2003)将超线程处理器与具有两个核心的处理器区分开来。

答案 3 :(得分:3)

这实际上根据目标平台的不同而有所不同。 Stephbu的答案将在XP SP3和更新版本上运行良好。

如果您定位的是较旧的平台,则可能需要查看this article。我大约半年前写过它,在其中我讨论了几种不同的方法,以及每种方法的个别优缺点。

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

答案 4 :(得分:2)

System.Environment.ProcessorCount是您需要的

答案 5 :(得分:2)

Environment.ProcessorCount

编辑:在.NET 2.0中提供,而不是在.NET 1.1中提供

答案 6 :(得分:1)

没有足够的wiki代表,但请注意,除了XPSP2之外,Windows 2003 Server SP1和SP2还需要一个修补程序才能启用此功能:

http://support.microsoft.com/kb/932370

答案 7 :(得分:1)

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

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

使用某种浏览器工具时,研究WMI要容易得多。因此,我建议使用WMI浏览工具(例如WMIExplorerWMI CIM Studio)来探索WMI类,属性和方法。