문제

.NET의 물리적 프로세서/코어 수를 어떻게 감지합니까?

도움이 되었습니까?

해결책

System.Environment.ProcessorCount

논리 프로세서 수를 반환합니다

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

물리적 프로세서 카운트의 경우 WMI를 사용해야 할 것입니다. 다음 메타 데이터는 XP/Win2K3에서 지원됩니다 (Vista/Win2K8 이전의 SP에서 기능성이 활성화 됨).

WIN32_COMPETERSYSTEM.NumberOfProcessors 물리적 수를 반환합니다

Win32_computersystem.numberoflogicalProcessors 논리를 반환합니다 (duh!)

하이퍼 스레드 CPU는 멀티 코어 CPU와 동일하게 보이지만 성능 특성은 매우 다른.

HT 지원 CPU를 확인하려면 Win32_Processor의 각 인스턴스를 검사 하고이 두 속성을 비교하십시오.

Win32_processor.numberoflogicalProcessors

Win32_processor.numberofcores

멀티 코어 시스템에서는 일반적으로 값과 동일합니다.

또한 여러 가지가있는 시스템을 알고 있어야합니다. 프로세서 그룹, 많은 프로세서가있는 컴퓨터에서 종종 볼 수 있습니다. 기본적으로 .NET은 첫 번째 프로세서 그룹 만 사용합니다 - 기본적으로 스레드는 첫 번째 프로세서 그룹에서 CPU 만 사용하고 Environment.ProcessorCount 이 그룹의 CPU 수만 반환합니다. 에 따르면 Alastair Maw의 대답,이 동작은 다음과 같이 app.config를 변경하여 변경할 수 있습니다.

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

다른 팁

하는 동안 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;
        }
    }
}

Environment.ProcessOrcount에는 하이퍼 스레드 프로세서도 포함됩니다.

하이퍼 스레드 프로세서를 하나의 코어가있는 하나와 구별 할 수있는 방법 (적어도 Windows 2003을 통해)은 없습니다.

이것은 실제로 대상 플랫폼에 따라 약간 다릅니다. Stephbu의 답변은 XP SP3 및 새로운 것에 대해 잘 작동합니다.

이전 플랫폼을 타겟팅하는 경우 체크 아웃 할 수 있습니다. 이 기사. 나는 약 반년 전에 그것을 썼다. 그리고 그것에 따라 나는 각 방법의 개별 장단점뿐만 아니라 이것을하는 몇 가지 다른 방법에 대해 논의한다.

당신은 또한 체크 아웃 할 수도 있습니다 이 코드 프로젝트 기사 섀도우 코어를 실제 것과 하이퍼 스레딩과 차별화하는 데 관심이 있다면.

System.environment.processorCount가 필요한 것입니다

환경 .processorCount

편집 : .NET 1.1이 아닌 .NET 2.0에서 사용할 수 있습니다.

Wiki에 대한 REP가 충분하지 않지만 XPSP2 외에도 Windows 2003 Server SP1 및 SP2 도이 기능을 활성화하려면 핫픽스가 필요합니다.

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

PowerShell을 사용하여 포괄적 인 프로세서 정보에 액세스 할 수 있습니다. 예를 들어 다음 명령을 실행하여 CPU 코어 수를 얻을 수 있습니다.

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

일종의 탐색기 도구를 사용할 때 WMI를 조사하는 것이 훨씬 쉽습니다. 따라서 WMI 브라우징 도구를 사용하는 것이 좋습니다 (예 : WMIEXPLORER 또는 WMI CIM 스튜디오) WMI 클래스, 속성 및 방법을 탐색합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top