Windows系统使用状况统计

原创 2013年12月01日 21:40:11

参考:http://blog.csdn.net/morewindows/article/details/8459219

            http://blog.csdn.net/morewindows/article/details/8678359

本篇大致统计了在win7下可用的内存整体使用,CPU整体统计,与网络流量统计。

1. 内存使用状况


主要用到了数据结构MEMORYSTATUSEX m_memoryStatusEx;来接收内存相关信息;结构如下:

typedef struct _MEMORYSTATUSEX {
    DWORD dwLength; // 结构体自用大小
    DWORD dwMemoryLoad; // 获取当前内存使用率
    DWORDLONG ullTotalPhys; // 获取总的物理内存数量
    DWORDLONG ullAvailPhys; // 获取当前可用的物理内存数量
    DWORDLONG ullTotalPageFile; // 获取系统页面总量
    DWORDLONG ullAvailPageFile; // 获取系统闲置页面数量
    DWORDLONG ullTotalVirtual; // 获取系统虚拟内存总量
    DWORDLONG ullAvailVirtual; // 获取系统可用虚拟内存数量
    DWORDLONG ullAvailExtendedVirtual;  // 可用的扩展虚拟内存(保留值,暂时不使用)
} MEMORYSTATUSEX, *LPMEMORYSTATUSEX;

这个结构体大包含了内存使用状况的大致信息。

要获取这些信息,可以调用GlobalMemoryStatusEx函数,至于GlobalMemoryStatus函数,作为前者的前身,会逐渐的被前者替代,而前者又是向下兼容的,所以推荐大家使用前者。

WINBASEAPI
BOOL
WINAPI
GlobalMemoryStatusEx(
    __out LPMEMORYSTATUSEX lpBuffer /* _MEMORYSTATUSEX 结构体指针 */
    );

大致情况就是这样,核心代码:

BOOL CMemory::GetMemoryStatus()
{
m_memoryStatusEx.dwLength = sizeof(m_memoryStatusEx);
return ::GlobalMemoryStatusEx(&m_memoryStatusEx); // 核心函数
}

2.CPU整体统计


主要使用了GetSystemTimes函数和FILETIME结构体

1) FILETIME结构体

结构持有的64位无符号的文件的日期和时间值;此值表示自1601年1月1日开始的100纳秒为单位的时间(摘自百科)

typedef struct _FILETIME {
    DWORD dwLowDateTime; // 文件时间的低32位值
    DWORD dwHighDateTime; // 文件时间的高32位值
} FILETIME, *PFILETIME, *LPFILETIME;

2)GetSystemTimes函数

BOOL
WINAPI
GetSystemTimes(
    __out_opt LPFILETIME lpIdleTime, // CPU空闲时间
    __out_opt LPFILETIME lpKernelTime, // CPU内核占用时间 
    __out_opt LPFILETIME lpUserTime //  CPU用户占用时间
    );

3.核心算法:

int CCPU::GetCPUUsageRate()
{
int cpuUsageRate = -1;
FILETIME ftKernel, ftUser, ftIdle;
if (!(GetSystemTimes(&ftIdle, &ftKernel, &ftUser)))
{
return cpuUsageRate;
}
uint64 fCPUKernelTime = FileTimeToUInt64(&ftKernel);
uint64 fCPUUserTime = FileTimeToUInt64(&ftUser);
uint64 fCPUIdleTime = FileTimeToUInt64(&ftIdle);
/*


deltaUser = fCPUUserTime - m_fPreCPUUserTime;
deltaKernel = fCPUKernelTime - m_fPreCPUKernelTime;
deltaIdle = fCPUIdleTime - m_fPreCPUIdleTime;
cpu利用率 cpuUsageRate = (100 * (deltaUser + deltaKernel - deltaIdle) / (deltaUser + deltaKernel); 

*/
    uint64 varAll = (fCPUUserTime - m_fPreCPUUserTime) + (fCPUKernelTime - m_fPreCPUKernelTime);
cpuUsageRate = (100 * (varAll - fCPUIdleTime + m_fPreCPUIdleTime) / varAll); 
m_fPreCPUKernelTime = fCPUKernelTime;
m_fPreCPUUserTime = fCPUUserTime;
m_fPreCPUIdleTime = fCPUIdleTime;


return cpuUsageRate;
}


3.网络流量统计:

主要用到了结构体MIB_IFTABLE,MIB_IFROW; 函数GetIfTable.

1)结构体MIB_IFTABLE

typedef struct _MIB_IFTABLE {
    DWORD dwNumEntries; // 数组中接口条目的数量
    MIB_IFROW table[ANY_SIZE]; // 包含MIB_IFROW接口条目的数组
} MIB_IFTABLE, *PMIB_IFTABLE;

从上面结构体可以看出,这个table数组的实际大小是第一个参数元素dwNumEntries,而#define ANY_SIZE 1 只是将数组初始化,所以使用时会再进行一次数组大小的分配,而这个工作应该是由函数GetIfTable完成的,数组中实际有内容的大小应该是dwNumEntries。

2)结构体MIB_IFROW

typedef struct _MIB_IFROW {
    WCHAR wszName[MAX_INTERFACE_NAME_LEN];
    IF_INDEX dwIndex;
    IFTYPE dwType;
    DWORD dwMtu;
    DWORD dwSpeed
    DWORD dwPhysAddrLen;
    UCHAR bPhysAddr[MAXLEN_PHYSADDR];
    DWORD dwAdminStatus;
    INTERNAL_IF_OPER_STATUS dwOperStatus;
    DWORD dwLastChange;
    DWORD dwInOctets; // <--接收的字节数
    DWORD dwInUcastPkts;
    DWORD dwInNUcastPkts;
    DWORD dwInDiscards;
    DWORD dwInErrors;
    DWORD dwInUnknownProtos;
    DWORD dwOutOctets; // <--发送的字节数
    DWORD dwOutUcastPkts;
    DWORD dwOutNUcastPkts;
    DWORD dwOutDiscards;
    DWORD dwOutErrors;
    DWORD dwOutQLen;
    DWORD dwDescrLen;
    UCHAR bDescr[MAXLEN_IFDESCR];
} MIB_IFROW, *PMIB_IFROW;

这个结构体比较复杂,这里只用到了<--的字段

3.核心算法

bool CNetflow::NetflowStat()
{
if (!CheckNetStat())
{
m_netStat = NET_NOT_CONNECT;
return false;
}
m_received = 0;
m_sended = 0;
m_netStat = NET_CONNECT;
PMIB_IFTABLE pMIBTable = NULL;
DWORD dwAdapters = 0;
// 接口表按升序排序
ULONG uRetCode = GetIfTable(pMIBTable, &dwAdapters, TRUE);
if (uRetCode == ERROR_NOT_SUPPORTED)
{
return false;
}
if (uRetCode == ERROR_INSUFFICIENT_BUFFER)// 可用内存缓冲不足
{
pMIBTable = (PMIB_IFTABLE)new BYTE[dwAdapters]; // 重新分配pMIBTable大小,数组table大小应该是(dwAdapters字节减去一个DWORD的大小)/ sizeof(MIB_IFROW)
}

GetIfTable(pMIBTable, &dwAdapters, TRUE);

        // 计算出接收与发送的字节的总数
for (UINT i = 0; i < pMIBTable->dwNumEntries; i++)
{
MIB_IFROW row = pMIBTable->table[i];
m_received += row.dwInOctets;
m_sended += row.dwOutOctets;
}
m_bandIn = m_received - m_preReceived;
m_bandOut = m_sended - m_preSended;
if (m_received <= 0)
{
m_bandIn = 0;

if (m_sended <= 0)
{
m_bandOut = 0;
}
m_preReceived = m_received;
m_preSended = m_sended;


delete []pMIBTable;
pMIBTable = NULL;


return true;
}


目前只有这三个简单的统计,后续会再添加。

另外工程是用VS2010编译,如果您的工作环境低于2010,那么中以将源文件拷贝出来,新建工程。

最后附上下载链接:

http://download.csdn.net/detail/yuanmushen/6640637

共同学习!!

windows获取系统资源使用状况 和 放弃cpu

如果你的win客户端让用户的cpu居高不下是很讨厌的... 鸟人最近遇到这个问题,发现如下两种简单的解决方案(项目中用的是第一种,第二种尚未实践,貌似IBM的World Community Grid...

Windows系统CPU内存网络性能统计第四篇 CPU 多核CPU各核使用率C++

转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/8678396欢迎关注微博:http://weibo.com/MoreWin...

Windows系统CPU内存网络性能统计第一篇 内存

系统性能统计内存使用率GlobalMemoryStatusGlobalMemoryStatusEx 最近翻出以前做过的Windows系统性能统计程序,这个程序可以统计系统中的CPU使用情况,内存...

Windows系统CPU内存网络性能统计第一篇 内存

转自http://blog.csdn.net/morewindows/article/details/8459219 最近翻出以前做过的Windows系统性能统计程序,这个程序可以统计系统中的C...

C/C++获取Windows系统CPU和内存及硬盘使用情况

//1.获取Windows系统内存使用率//windows 内存 使用率 DWORD getWin_MemUsage(){ MEMORYSTATUS ms; ::Globa...

详细介绍在windows系统中配置 cocos2d-x 开发环境及简单使用(VS2012+Cocos2d-x 3.0rc1)

下面这篇文章纯粹是为了入门

用DOS命令查看完整的Windows系统信息方法 锁定计算机命令 快捷键使用 及结束进程

1. 查看Windows系统信息 有的时候由于种种原因,我们需要查看Windows操作系统的系统信息,网上有很多第三方工具都可以查看系统信息,实际上有一种更简单的方法:那就是利用Windows中的D...
  • lchyz89
  • lchyz89
  • 2011年12月02日 12:36
  • 5516

Windows系统下使用维基百科中文语料训练Word2Vec词向量

Windows系统下使用维基百科中文语料训练word2vec词向量

C/C++获取Windows系统CPU和内存及硬盘使用情况

//1.获取Windows系统内存使用率 #include "windows.h" #include "stdio.h" //windows 内存 使用率 DWORD getMemUsage(){ ...

使用TortoiseSVN在Windows系统下搭建单机版SVN服务器版本控制

使用TortoiseSVN在Windows下搭建单机版版本控制服务器,图文教程
  • daiafei
  • daiafei
  • 2017年11月09日 11:26
  • 240
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Windows系统使用状况统计
举报原因:
原因补充:

(最多只允许输入30个字)