GlobalMemoryStatusEx函数实验(动态获得物理内存与虚拟内存闲置率)
2017-09-06 15:53
113 查看
#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的信息无关,也与内存的信息无关。
相关文章推荐
- GetSystemTimes函数实验(动态获得CPU占用率和CPU闲置率)
- js 动态添加行,删除行,并获得select中值赋予 input
- 物理内存和虚拟内存的区别 及 什么是虚拟地址空间
- 动态规划之最大K乘积(实验报告版)
- 物理内存和虚拟内存的联系
- Mybatis高级映射、动态SQL及获得自增主键
- 交换机端口安全配置实验(MAC动态绑定和静态绑定)
- 虚拟内存、物理内存
- 关于 bootloader 之物理内存 虚拟内存 映射表。OEMAddressTable
- jquery插件获得调用者id实验
- 有几数组表单,js怎么获得数组并动态相加输出到文本框
- 动态数据竞争检测方法实验分析(一)
- 演示如何在物理内存中如何获得所须的BIOS信息
- 点击按钮动态创建控件并获得值的原理及方法
- 程序设计C 实验五 题目四 二维动态数组转置(0294)
- FLEX Tree动态获得信息时遇到的问题总结
- Ext.Net中CheckboxSelectionModel的动态隐藏(显示),一定条件下的隐藏(不让选择),获得多选栏位的信息,及后台控件的动态创建
- 获得 Win32 窗口句柄的更好的方法----动态生成并显示 HTML 文档----再谈禁用HTML的上下文菜单...
- 降低Winform占用系统内存的方法-将物理内存的占用挪到虚拟内存里
- UI for iOS (二) -- 根据text动态获得label的宽高