GlobalMemoryStatusEx函数实验(动态获得物理内存与虚拟内存闲置率)

#include <iostream>
#include <iomanip>
#include <windows.h>
using namespace std;

int main(){
	MEMORYSTATUSEX statex;
	statex.dwLength = sizeof (statex);//必须有这一句,否则函数错误! 
	bool res = GlobalMemoryStatusEx(&statex);
	cout << "GlobalMemoryStatusEx(&) = " << res << endl;
	cout << "GetLastError() = " << GetLastError() << endl << endl;
	
	HANDLE hEvent;
	hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); 
	//初始值为nonsignaled,并且每次触发后自动设置为nonsignaled
	
	const unsigned long long DIV = 1024;
	
	while(1){
		WaitForSingleObject(hEvent, 1000);//等待500毫秒
		res = GlobalMemoryStatusEx(&statex);
		cout << left << setw(17) << "内存占用率:" << setw(3) << statex.dwMemoryLoad << "%" << endl
			<< "============================================" << endl
			<< setw(17) << "总物理内存:" << setw(10) << statex.ullTotalPhys / DIV << "KB 折合 " 
			<< setw(6) << statex.ullTotalPhys / DIV / DIV << "MB" << endl
			<< setw(17) << "闲置物理内存:" << setw(10) << statex.ullAvailPhys / DIV << "KB 折合 " 
			<< setw(6) << statex.ullAvailPhys / DIV / DIV << "MB" << endl 
			<< setw(17) << "物理内存闲置率:" << setw(3)
			<< (statex.ullAvailPhys * 100) / statex.ullTotalPhys << "%" << endl
			<< "--------------------------------------------" << endl
			<< setw(17) << "总页面文件:" << setw(10) << statex.ullTotalPageFile / DIV << "KB 折合 "
			<< setw(6) << statex.ullTotalPageFile / DIV / DIV << "MB" << endl 
			<< setw(17) << "闲置页面文件:" << setw(10) << statex.ullAvailPageFile / DIV << "KB 折合 "
			<< setw(6) << statex.ullAvailPageFile / DIV / DIV << "MB" << endl
			<< setw(17) << "页面文件闲置率:" << setw(3)
			<< (statex.ullAvailPageFile * 100) / statex.ullTotalPageFile << "%" << endl			
			<< "--------------------------------------------" << endl
			<< setw(17) << "总虚拟内存:" << setw(10) << statex.ullTotalVirtual / DIV << "KB 折合 "
			<< setw(6) << statex.ullTotalVirtual / DIV / DIV << "MB" << endl
			<< setw(17) << "闲置虚拟内存:" << setw(10) << statex.ullAvailVirtual / DIV << "KB 折合 "
			<< setw(6) << statex.ullAvailVirtual / DIV / DIV << "MB" << endl
			<< setw(17) << "虚拟内存闲置率:" << setw(3)
			<< (statex.ullAvailVirtual * 100) / statex.ullTotalVirtual << "%" << endl
			<< "--------------------------------------------" << endl
			<< setw(17) << "可用已扩展内存:" << setw(10) << statex.ullAvailExtendedVirtual / DIV << "KB 折合 "
			<< setw(6) << statex.ullAvailExtendedVirtual / DIV / DIV << "MB" << endl << endl << endl;
	}
	 
	return 0;
}

关键是必须有 statex.dwLength = sizeof (statex); 这一句,否则 GetLastError() 函数将返回值87,意为参数错误。

根据多次测试观察,“页面文件”其实指的就是虚拟内存!而“虚拟内存”似乎并没有因为应用程序的开关而变动,所以它其实不是真正的虚拟内存!

第6章负载监视器设计的第二个底层接口:内存占用率的获得宣告搞定!

===================================分割线====================================

另外,百度上搜到的结果说GetPerformanceInfo函数也可以提供内存信息,但经我实际研究后发现:

GetPerformanceInfo是针对桌面系统的应用程序的API,不如GlobalMemoryStatusEx“地道”!而且前者只能获取以页面为单位的内存数量。后者是以字节为单位的。

凡是需要包含Psapi.h头文件的函数,都是统计应用程序情况的函数,不是系统底层的硬件信息。而且这类函数所指向的结构体第一个成员一般都是DWORD  cb,指的是结构体的长度。

至于GetProcessMemoryInfo更是一个统计进程信息的函数,更加不“地道”。(谁说只有英语汉语等自然语言有地道与不地道的分别?计算机语言同样有!)

往前第二篇博文中已经测试过的GetSystemInfo函数更是扯淡,既与CPU的信息无关,也与内存的信息无关。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值