GetLogicalProcessorInformation 함수(sysinfoapi.h)

논리 프로세서 및 관련 하드웨어에 대한 정보를 검색합니다.

논리 프로세서 및 프로세서 그룹을 포함한 관련 하드웨어에 대한 정보를 검색하려면 GetLogicalProcessorInformationEx 함수를 사용합니다.

구문

BOOL GetLogicalProcessorInformation(
  [out]     PSYSTEM_LOGICAL_PROCESSOR_INFORMATION Buffer,
  [in, out] PDWORD                                ReturnedLength
);

매개 변수

[out] Buffer

SYSTEM_LOGICAL_PROCESSOR_INFORMATION 구조체의 배열을 수신하는 버퍼에 대한 포인터입니다. 함수가 실패하면 이 버퍼의 내용이 정의되지 않습니다.

[in, out] ReturnedLength

입력에서 는 버퍼가 가리키는 버퍼의 길이(바이트)를 지정합니다. 버퍼가 모든 데이터를 포함할 만큼 충분히 크면 이 함수가 성공하고 ReturnLength 가 반환된 바이트 수로 설정됩니다. 버퍼가 모든 데이터를 포함할 만큼 크지 않으면 함수가 실패하고 GetLastError 는 ERROR_INSUFFICIENT_BUFFER 반환하며 ReturnLength 는 모든 데이터를 포함하는 데 필요한 버퍼 길이로 설정됩니다. ERROR_INSUFFICIENT_BUFFER 이외의 오류로 인해 함수가 실패하면 ReturnLength 값이 정의되지 않습니다.

반환 값

함수가 성공하면 반환 값은 TRUE이고 하나 이상의 SYSTEM_LOGICAL_PROCESSOR_INFORMATION 구조체가 출력 버퍼에 기록됩니다.

함수가 실패하면 반환 값은 FALSE입니다. 확장 오류 정보를 가져오려면 GetLastError를 호출합니다.

설명

GetLogicalProcessorInformation 을 사용하여 다음을 포함하여 시스템의 논리 프로세서 간의 관계에 대한 정보를 가져올 수 있습니다.

  • NUMA 노드의 일부인 논리 프로세서입니다.
  • 리소스를 공유하는 논리 프로세서입니다. 이러한 유형의 리소스 공유의 예로 하이퍼스레딩 시나리오가 있습니다.
애플리케이션은 스레드 및 프로세스를 선호할 때 이 정보를 사용하여 플랫폼의 하드웨어 속성을 최대한 활용하거나 라이선스 목적으로 논리 및 물리적 프로세서 수를 결정할 수 있습니다.

버퍼에 반환된 각 SYSTEM_LOGICAL_PROCESSOR_INFORMATION 구조체에는 다음이 포함됩니다.

  • 구조체의 정보가 적용되는 논리 프로세서를 나타내는 논리 프로세서 선호도 마스크입니다.
  • LOGICAL_PROCESSOR_RELATIONSHIP 형식의 논리 프로세서 마스크로, 마스크의 논리 프로세서 간 관계를 나타냅니다. 이 함수를 호출하는 애플리케이션은 나중에 추가 표시기 값을 처리할 수 있도록 준비해야 합니다.
버퍼에서 구조체가 반환되는 순서는 이 함수에 대한 호출 간에 변경 될 수 있습니다.

SYSTEM_LOGICAL_PROCESSOR_INFORMATION 구조의 크기는 프로세서 아키텍처와 Windows 버전에 따라 다릅니다. 이러한 이유로 애플리케이션은 먼저 이 함수를 호출하여 필요한 버퍼 크기를 가져온 다음 버퍼에 대한 메모리를 동적으로 할당해야 합니다.

64개 이상의 논리 프로세서가 있는 시스템에서 GetLogicalProcessorInformation 함수는 호출 스레드가 현재 할당된 프로세서 그룹의 프로세서 에 대한 논리 프로세서 정보를 검색합니다. GetLogicalProcessorInformationEx 함수를 사용하여 시스템의 모든 프로세서 그룹에서 프로세서에 대한 정보를 검색합니다.

참고

TBD 릴리스 철부터 이 함수 및 기타 NUMA 함수의 동작이 64개 이상의 프로세서를 포함하는 노드가 있는 시스템을 더 잘 지원하도록 수정되었습니다. 이 API의 이전 동작을 사용하도록 설정하는 방법에 대한 정보를 포함하여 이 변경에 대한 자세한 내용은 NUMA 지원을 참조하세요.

TBD 릴리스 철로 시작하는 동작

RelationNumaNode의 관계 구조에는 호출 스레드 그룹 내에서 노드의 선호도에 대한 선호도 마스크가 포함되어 있습니다.

예제

다음 C++ 예제에서는 GetLogicalProcessorInformation 함수를 사용하여 현재 시스템의 프로세서에 대한 정보를 표시합니다. GetLogicalProcessorInformation은 모든 시스템에 없기 때문에 이 예제에서는 GetLogicalProcessorInformation을 직접 호출하는 대신 GetProcAddress 함수를 사용합니다.

다음은 활성 프로세서 코어 수를 보고하는 예제입니다. 이 예제에서는 이 정보를 지원하는 시스템의 NUMA 노드, 물리적 패키지 및 캐시 수도 보고합니다. 자세한 내용은 SYSTEM_LOGICAL_PROCESSOR_INFORMATION 구조체의 Relationship 멤버에 대한 설명을 참조하세요. Windows Server 2003, Windows XP Professional x64 Edition 및 Windows XP SP3: 다음은 활성 프로세서 코어 수가 아닌 실제 프로세서 수를 보고하는 예제입니다.


#include <windows.h>
#include <malloc.h>    
#include <stdio.h>
#include <tchar.h>

typedef BOOL (WINAPI *LPFN_GLPI)(
    PSYSTEM_LOGICAL_PROCESSOR_INFORMATION, 
    PDWORD);


// Helper function to count set bits in the processor mask.
DWORD CountSetBits(ULONG_PTR bitMask)
{
    DWORD LSHIFT = sizeof(ULONG_PTR)*8 - 1;
    DWORD bitSetCount = 0;
    ULONG_PTR bitTest = (ULONG_PTR)1 << LSHIFT;    
    DWORD i;
    
    for (i = 0; i <= LSHIFT; ++i)
    {
        bitSetCount += ((bitMask & bitTest)?1:0);
        bitTest/=2;
    }

    return bitSetCount;
}

int _cdecl _tmain ()
{
    LPFN_GLPI glpi;
    BOOL done = FALSE;
    PSYSTEM_LOGICAL_PROCESSOR_INFORMATION buffer = NULL;
    PSYSTEM_LOGICAL_PROCESSOR_INFORMATION ptr = NULL;
    DWORD returnLength = 0;
    DWORD logicalProcessorCount = 0;
    DWORD numaNodeCount = 0;
    DWORD processorCoreCount = 0;
    DWORD processorL1CacheCount = 0;
    DWORD processorL2CacheCount = 0;
    DWORD processorL3CacheCount = 0;
    DWORD processorPackageCount = 0;
    DWORD byteOffset = 0;
    PCACHE_DESCRIPTOR Cache;

    glpi = (LPFN_GLPI) GetProcAddress(
                            GetModuleHandle(TEXT("kernel32")),
                            "GetLogicalProcessorInformation");
    if (NULL == glpi) 
    {
        _tprintf(TEXT("\nGetLogicalProcessorInformation is not supported.\n"));
        return (1);
    }

    while (!done)
    {
        DWORD rc = glpi(buffer, &returnLength);

        if (FALSE == rc) 
        {
            if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) 
            {
                if (buffer) 
                    free(buffer);

                buffer = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION)malloc(
                        returnLength);

                if (NULL == buffer) 
                {
                    _tprintf(TEXT("\nError: Allocation failure\n"));
                    return (2);
                }
            } 
            else 
            {
                _tprintf(TEXT("\nError %d\n"), GetLastError());
                return (3);
            }
        } 
        else
        {
            done = TRUE;
        }
    }

    ptr = buffer;

    while (byteOffset + sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION) <= returnLength) 
    {
        switch (ptr->Relationship) 
        {
        case RelationNumaNode:
            // Non-NUMA systems report a single record of this type.
            numaNodeCount++;
            break;

        case RelationProcessorCore:
            processorCoreCount++;

            // A hyperthreaded core supplies more than one logical processor.
            logicalProcessorCount += CountSetBits(ptr->ProcessorMask);
            break;

        case RelationCache:
            // Cache data is in ptr->Cache, one CACHE_DESCRIPTOR structure for each cache. 
            Cache = &ptr->Cache;
            if (Cache->Level == 1)
            {
                processorL1CacheCount++;
            }
            else if (Cache->Level == 2)
            {
                processorL2CacheCount++;
            }
            else if (Cache->Level == 3)
            {
                processorL3CacheCount++;
            }
            break;

        case RelationProcessorPackage:
            // Logical processors share a physical package.
            processorPackageCount++;
            break;

        default:
            _tprintf(TEXT("\nError: Unsupported LOGICAL_PROCESSOR_RELATIONSHIP value.\n"));
            break;
        }
        byteOffset += sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION);
        ptr++;
    }

    _tprintf(TEXT("\nGetLogicalProcessorInformation results:\n"));
    _tprintf(TEXT("Number of NUMA nodes: %d\n"), 
             numaNodeCount);
    _tprintf(TEXT("Number of physical processor packages: %d\n"), 
             processorPackageCount);
    _tprintf(TEXT("Number of processor cores: %d\n"), 
             processorCoreCount);
    _tprintf(TEXT("Number of logical processors: %d\n"), 
             logicalProcessorCount);
    _tprintf(TEXT("Number of processor L1/L2/L3 caches: %d/%d/%d\n"), 
             processorL1CacheCount,
             processorL2CacheCount,
             processorL3CacheCount);
    
    free(buffer);

    return 0;
}


요구 사항

요구 사항
지원되는 최소 클라이언트 Windows Vista, Windows XP Professional x64 Edition, Windows XP SP3 [데스크톱 앱 | UWP 앱]
지원되는 최소 서버 Windows Server 2003 [데스크톱 앱 | UWP 앱]
대상 플랫폼 Windows
헤더 sysinfoapi.h
라이브러리 Kernel32.lib
DLL Kernel32.dll

참고 항목

GetLogicalProcessorInformationEx

LOGICAL_PROCESSOR_RELATIONSHIP

프로세스 및 스레드 함수

SYSTEM_LOGICAL_PROCESSOR_INFORMATION