捐助郴维网
感谢您对郴维网的支持,你的支持将是郴维网持续发展的动力!
二维码
×
当前位置:郴维网 >API档案 > 正文
18 2018.02

GetLogicalProcessorInformation

点击次数:1315 更新时间:2018/2/18 16:35:19  【打印此页

原文链接 -> 传送门

函数功能:

GetLogicalProcessorInformation 函数用于获取逻辑处理器和相关硬件的有关信息。

若想获取包括处理器集群的逻辑处理器和相关硬件的有关信息,请使用 GetLogicalProcessorInformationEx 函数。


API 函数原型:

注释:_Out_ 说明该参数是输出的,_Inout_ 说明该参数既是输入又是输出的。

BOOL WINAPI GetLogicalProcessorInformation(
  _Out_   PSYSTEM_LOGICAL_PROCESSOR_INFORMATION Buffer,
  _Inout_ PDWORD                                ReturnLength
);


参数解析:
 

参数

含义

Buffer

1. 指向一个缓冲区的指针

2. 该缓冲区包含了获取到的 SYSTEM_LOGICAL_PROCESSOR_INFORMATION 结构体数组。如果函数调用失败,则该缓冲区的内容未定义

ReturnLength

1. 在输入方面,该参数指定了 Buffer 指定的缓冲区的字节长度

2. 如果缓冲区足以容纳所有数据,函数调用成功,那么 ReturnLength 将被设置为返回的字节数

3. 如果缓冲区不足以容纳所有的数据,那么函数调用失败,GetLastError 函数将返回 ERROR_INSUFFICIENT_BUFFER,并且 ReturnLength 会被设置为容纳所有数据所需要的缓冲区长度

4. 如果函数调用失败是除 ERROR_INSUFFICIENT_BUFFER 以外的其他错误,那么 ReturnLength 的值未定义



返回值:

1. 如果函数调用成功,则返回值为 TRUE,并且至少有一个 SYSTEM_LOGICAL_PROCESSOR_INFORMATION 结构被写入到输出缓冲区;

2. 如果函数调用失败,则返回值为 FALSE。

获取有关错误的更多信息,请调用 GetLastError 函数。


备注:

1. GetLogicalProcessorInformation 函数可以被用来获取有关系统中逻辑处理器之间的关系的信息,包括:
 

·         逻辑处理器是一个 NUMA 节点的一部分

·         逻辑处理器能共享资源。超线程技术方案便是这种类型的资源共享的例子


2. 你的应用程序可以使用这些信息来使线程和进程能够最大化利用平台硬件性能,或者因许可原因用来决定使用的逻辑和物理处理器的数目。

3. 每一个返回到缓冲区的 SYSTEM_LOGICAL_PROCESSOR_INFORMATION 结构都包括下列:
 

·         一个逻辑处理器亲和力掩码,该掩码表示结构体中信息适用的逻辑处理器

·         一个 LOGICAL_PROCESSOR_RELATIONSHIP 类型的逻辑处理器掩码,该掩码表示在掩码中逻辑处理器之间的关系


4. 注意缓冲区中返回的结构体的顺序可能在该函数的调用间改变。

5. SYSTEM_LOGICAL_PROCESSOR_INFORMATION 结构的大小因处理器架构和 Windows 系统版本而不同。因为这个原因,应用程序应该首先调用该函数来获取所需的缓冲区大小,然后动态地为缓冲区分配内存。

6. 在有超过 64 个逻辑处理器的系统上,GetLogicalProcessorInformation 函数获取调用线程当前分配的处理器集群中逻辑处理器的有关信息。使用 GetLogicalProcessorInformationEx 函数来获取系统中所有处理器集群中的处理器信息。


例子:

下面的 C++ 例子使用 GetLogicalProcessorInformation 函数来显示当前系统中处理器的有关信息。因为 GetLogicalProcessorInformation 函数并不是在所有系统中都存在,该例子使用了 GetProcAddress 函数而不是直接调用 GetLogicalProcessorInformation 函数。

该例子显示活动的处理器核心数。也显示了 NUMA 节点,物理包的数目以及支持该信息的系统上的缓存。更多信息,请参见 SYSTEM_LOGICAL_PROCESSOR_INFORMATION 结构 Relationship 成员的描述。

Windows Server 2003, Windows XP Professional x64 Edition and Windows XP with 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;
}


需求:
 

Minimum supported client

Windows Vista, Windows XP Professional x64 Edition, Windows XP with SP3 [仅桌面应用程序]

Minimum supported server

Windows 2003 服务器版 [仅桌面应用程序]

Header

在 Windows XP, Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008 和 Windows Server 2008 R2 (包含于 Windows.h) 中是 WinBase.h;
在 Windows 8 和 Windows Server 2012 中是 Sysinfoapi.h

Library

Kernel32.lib

DLL

Kernel32.dll

提示
郴维网为您提供各类专业服务:
软件开发,电脑配件销售,WIFI路由器销售,上门电脑维修,上门安装系统,系统安装,软、硬件安装,电脑除尘清灰,显示器维修,WIFI安装调试,服务器维护,数据恢复,密码破解,网络布线,网络检修,打印机维修,打印机加碳粉,苹果电脑安装系统,苹果电脑安装双系统,监控安装维护,电脑外包,笔记本电脑维修,餐饮、美容行业软件安装 等。。。。。。
点击次数:1315 更新时间:2018/2/18 16:35:19  【打印此页
关键词推荐:郴州电脑城 郴州电脑维修公司 维修电脑公司 郴州软件开发 上门电脑维修 上门安装系统 笔记本电脑维修 郴州打印机维修 打印机加碳粉 电脑安装双系统 苹果电脑双系统 液晶显示器维修 联想笔记本维修 联想笔记本维修电话 戴尔笔记本维修电话 郴州戴尔笔记本维修 戴尔笔记本郴州维修点 华硕笔记本维修点 郴州华硕笔记本维修 郴州笔记本上网维修