zoukankan      html  css  js  c++  java
  • 获取CPU使用率

    1、2k以后的操作系统可使用 ntdll.dll中的隐式函数
    Windows NT/2000中获取CPU使用率的方法与Windows 9x系统中所使用的方法不同,Windows NT/2000中获取CPU使用率不用"性能计数器"。而是使用一个NTDLL.DLL中未公开的API函数--NtQuerySystemInformation。它的使用方法参见另外一篇文章:《Windows NT/2000系统中如何获取系统的启动时间》。
    为了计算Windows NT/2000系统中CPU的使用率,我们使用下面的公式:
    CpuUsageInPercent = 100 - (CpuTimen - CpuTimen-1 - CpuTime0) / (SystemTimen - SystemTimen-1 - SystemTime0) / NumberOfProcessors * 100
    这里
    CpuTime为CPU的空闲时间(毫秒);
    SystemTime为系统时间(毫秒);
    NumberOfProcessors为系统中处理器的数量;
    0,1,n 表示取样数(0指最老的取样,1 指最近的取样,n 指最新的取样);
    下面我们来求出调用NtQuerySystemInformation函数所必需的参数值。首先求出处理器数量值,SYSTEM_BASIC_INFORMATION结构中有一个bKeNumberProcessors成员,它就是我们所需要的。
    #define SystemBasicInformation 0
    typedef struct
    {
    DWORD dwUnknown1;
    ULONG uKeMaximumIncrement;
    ULONG uPageSize;
    ULONG uMmNumberOfPhysicalPages;
    ULONG uMmLowestPhysicalPage;
    ULONG uMmHighestPhysicalPage;
    ULONG uAllocationGranularity;
    PVOID pLowestUserAddress;
    PVOID pMmHighestUserAddress;
    ULONG uKeActiveProcessors;
    BYTE bKeNumberProcessors;
    BYTE bUnknown2;
    WORD wUnknown3;
    } SYSTEM_BASIC_INFORMATION;
    LONG status;
    SYSTEM_BASIC_INFORMATION Sbi;
    status = NtQuerySystemInformation(SystemBasicInformation,&Sbi,sizeof(Sbi),0);
    为了实现多个取样,我们需要在循环中论询CpuTime 和 SystemTime的值并将它们的旧的值存储在临时变量中。有关如何获取系统时间的方法请参见:《Windows NT/2000系统中如何获取系统的启动时间》。CPU的空闲时间存储在SYSTEM_PERFORMANCE_INFORMATION结构的liIdleTime 成员中。
    #define SystemPerformanceInformation 2
    typedef struct
    {
    LARGE_INTEGER liIdleTime;
    DWORD dwSpare[76];
    } SYSTEM_PERFORMANCE_INFORMATION;
    LARGE_INTEGER liOldIdleTime = {0,0};
    LARGE_INTEGER liOldSystemTime = {0,0};
    SYSTEM_PERFORMANCE_INFORMATION Spi;
    while (1) {
    status = NtQuerySystemInformation(SystemTimeInformation,&Sti,sizeof(Sti),0);
    status = NtQuerySystemInformation(SystemPerformanceInformation,&Spi,sizeof(Spi),0);
    // calculate the CPU usage here
    liOldIdleTime = Spi.liIdleTime;
    liOldSystemTime = Sti.liKeSystemTime;
    Sleep(1000);
    }

  • 相关阅读:
    2018-2019-1 20165313 实验三 实时系统
    2018-2019-1 20165313 《信息安全系统设计基础》第七周学习总结”
    2018-2019-1 20165313 20165312 20165322 实验二 固件程序设计
    2018-2019-1 20165313 《信息安全系统设计基础》第五周学习总结
    2018-2019-1 20165228 《信息安全系统设计基础》第四周学习总结
    BUUCTF 相册 WriteUp
    BUUCTF Youngter-drive WriteUp
    word插入照片格式混乱的解决
    20181218 实验二《Python程序设计》实验报告
    20181218 实验一《Python程序设计》实验报告
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/1763873.html
Copyright © 2011-2022 走看看