標籤:main return int 虛擬 detail 體會 blank glob 空閑
最近翻出以前做過的Windows系統效能統計程式,這個程式可以統計系統中的CPU使用方式,記憶體使用量情況以及網路流量。現在將其整理一下(共有三篇),希望對大家有所協助。
目錄如下:
1.《Windows系統CPU記憶體網路效能統計第一篇 記憶體》
2.《Windows系統CPU記憶體網路效能統計第二篇 CPU》
3.《Windows系統CPU記憶體網路效能統計第三篇網路流量》
本篇將介紹統計系統記憶體使用量情況,包括記憶體使用量率、總實體記憶體大小、可用實體記憶體大小、總虛擬記憶體大小,可用虛擬記憶體大小等等。統計系統記憶體使用量情況是非常簡單的,直接使用GlobalMemoryStatus函數進行查詢就可以了。其函數原型如下:
void WINAPIGlobalMemoryStatus(
__out LPMEMORYSTATUS lpBuffer
);
這個函數將傳出MEMORYSTATUS類型的結構體,該結構體就描述了系統中記憶體的使用方式。詳細可以見代碼:
[cpp] view plain copy
- // Windows系統CPU記憶體網路效能統計第一篇 記憶體 GlobalMemoryStatus
- //By MoreWindows-(http://blog.csdn.net/MoreWindows)
- #include <stdio.h>
- #include <windows.h>
- const int KB_DIV = 1024;
- const int MB_DIV = 1024 * 1024;
- int main()
- {
- printf(" Windows系統CPU記憶體網路效能統計第一篇 記憶體 GlobalMemoryStatus\n");
- printf(" -- By MoreWindows( http://blog.csdn.net/MoreWindows ) --\n\n");
-
- MEMORYSTATUS memStatus;
- GlobalMemoryStatus(&memStatus);
-
-
- printf ("當前記憶體使用量率: %d%%\n", memStatus.dwMemoryLoad);
-
- printf ("系統實體記憶體總量: %dKB (%dMB)\n", memStatus.dwTotalPhys / KB_DIV, memStatus.dwTotalPhys / MB_DIV);
- printf ("當前可用實體記憶體: %dKB (%dMB)\n", memStatus.dwAvailPhys / KB_DIV, memStatus.dwAvailPhys / MB_DIV);
-
- printf ("系統虛擬記憶體總量: %dKB (%dMB)\n", memStatus.dwTotalVirtual / KB_DIV, memStatus.dwTotalVirtual / MB_DIV);
- printf ("當前空閑虛擬記憶體: %dKB (%dMB)\n", memStatus.dwAvailVirtual / KB_DIV, memStatus.dwAvailVirtual / MB_DIV);
-
- printf ("系統分頁檔總量: %dKB (%dMB)\n", memStatus.dwTotalPageFile / KB_DIV, memStatus.dwTotalPageFile / MB_DIV);
- printf ("當前空閑分頁檔: %dKB (%dMB)\n", memStatus.dwAvailPageFile / KB_DIV, memStatus.dwAvailPageFile / MB_DIV);
- return 0;
- }
在本機上運行結果如下,呵呵,2G記憶體對XP系統來說還是很夠用的。換成Win7肯定不會有這麼可用記憶體。
由於MEMORYSTATUS結構體對於記憶體大小是用DWORD來儲存的,DWORD只有4個位元組,最大為4G。因此當系統的記憶體大於4GB時肯定會產生一些問題的。因此Windows系統提供了另一個函數——GlobalMemoryStatusEx,其函數原型如下:
BOOLWINAPIGlobalMemoryStatusEx(
__in_out LPMEMORYSTATUSEXlpBuffer
);
這個函數即前面的GlobalMemoryStatus函數的增強版。它將傳出MEMORYSTATUSEX類型的結構體,這個結構體會使用DWORDLONG類型的變數來描述記憶體的大小,DWORDLONG與__int64類似,佔8位元組。下面也給出使用GlobalMemoryStatusEx函數來統計記憶體資訊的原始碼:
[cpp] view plain copy
- // Windows系統CPU記憶體網路效能統計第一篇 記憶體 GlobalMemoryStatusEx
- //By MoreWindows-(http://blog.csdn.net/MoreWindows)
- #include <stdio.h>
- #include <windows.h>
-
- const int KB_DIV = 1024;
- const int MB_DIV = 1024 * 1024;
-
-
- int main()
- {
- printf(" Windows系統CPU記憶體網路效能統計第一篇 記憶體 GlobalMemoryStatusEx\n");
- printf(" -- By MoreWindows( http://blog.csdn.net/MoreWindows ) --\n\n");
-
- MEMORYSTATUSEX memStatusEx;
- memStatusEx.dwLength = sizeof(memStatusEx);
- if (GlobalMemoryStatusEx(&memStatusEx))
- {
- printf ("當前記憶體使用量率: %d%%\n", memStatusEx.dwMemoryLoad);
-
- printf ("系統實體記憶體總量: \t%I64dKB (%I64dMB)\n", memStatusEx.ullTotalPhys / KB_DIV, memStatusEx.ullTotalPhys / MB_DIV);
- printf ("當前可用實體記憶體: \t%I64dKB (%I64dMB)\n", memStatusEx.ullAvailPhys / KB_DIV, memStatusEx.ullAvailPhys / MB_DIV);
-
- printf ("系統虛擬記憶體總量: \t%I64dKB (%I64dMB)\n", memStatusEx.ullTotalVirtual / KB_DIV, memStatusEx.ullTotalVirtual / MB_DIV);
- printf ("當前空閑虛擬記憶體: \t%I64dKB (%I64dMB)\n", memStatusEx.ullAvailVirtual / KB_DIV, memStatusEx.ullAvailVirtual / MB_DIV);
-
- printf ("系統分頁檔總量: \t%I64dKB (%I64dMB)\n", memStatusEx.ullTotalPageFile / KB_DIV, memStatusEx.ullTotalPageFile / MB_DIV);
- printf ("當前空閑分頁檔: \t%I64dKB (%I64dMB)\n", memStatusEx.ullAvailPageFile / KB_DIV, memStatusEx.ullAvailPageFile / MB_DIV);
- }
- return 0;
- }
運行結果如下:
本篇文章介紹和示範了GlobalMemoryStatus和GlobalMemoryStatusEx函數來查詢記憶體使用量情況。下面二篇《Windows系統CPU記憶體網路效能統計第二篇 CPU》和《Windows系統CPU記憶體網路效能統計第三篇 網路流量》將分別介紹查詢CPU使用方式和網路流量統計,歡迎繼續瀏覽。
http://blog.csdn.net/morewindows/article/details/8459219
Windows系統CPU記憶體網路效能統計第一篇 記憶體