문제
.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 도이 기능을 활성화하려면 핫픽스가 필요합니다.
PowerShell을 사용하여 포괄적 인 프로세서 정보에 액세스 할 수 있습니다. 예를 들어 다음 명령을 실행하여 CPU 코어 수를 얻을 수 있습니다.
Get-WmiObject -namespace root\CIMV2 -class Win32_Processor -Property NumberOfCores
일종의 탐색기 도구를 사용할 때 WMI를 조사하는 것이 훨씬 쉽습니다. 따라서 WMI 브라우징 도구를 사용하는 것이 좋습니다 (예 : WMIEXPLORER 또는 WMI CIM 스튜디오) WMI 클래스, 속성 및 방법을 탐색합니다.