Різниця між MemoryStatus і MemoryStatusEx та їхнє використання

При розробці додатків важливо контролювати використання пам'яті системи для оптимізації продуктивності. Дві ключові структури, надані Windows API для цієї мети, — це MEMORYSTATUS та MEMORYSTATUSEX. Хоча вони мають схожі цілі, між ними є суттєві відмінності в функціональності та використанні.

Структура MEMORYSTATUS

Структура MEMORYSTATUS є старішою і простішою структурою, яка використовується для отримання базової інформації про пам'ять системи. Вона визначена в заголовному файлі windows.h наступним чином:

typedef struct _MEMORYSTATUS {  
 DWORD dwLength;  
 DWORD dwMemoryLoad;  
 SIZE_T dwTotalPhys;  
 SIZE_T dwAvailPhys;  
 SIZE_T dwTotalPageFile;  
 SIZE_T dwAvailPageFile;  
 SIZE_T dwTotalVirtual;  
 SIZE_T dwAvailVirtual;  
} MEMORYSTATUS, *LPMEMORYSTATUS;

Щоб використати цю структуру, викликається функція GlobalMemoryStatus, яка заповнює структуру поточним статусом пам'яті системи. Приклад використання:

MEMORYSTATUS memStatus;  
memStatus.dwLength = sizeof(MEMORYSTATUS);  
GlobalMemoryStatus(&memStatus);

Основні характеристики MEMORYSTATUS:

  • Надання інформації про загальну та доступну фізичну пам'ять, віртуальну пам'ять і файл підкачки.
  • Обмежена значеннями до 32 біт, що може бути недостатньо для сучасних систем з великою кількістю пам'яті.
  • Підходить для старих додатків, які не вимагають високої точності.

Структура MEMORYSTATUSEX

Структура MEMORYSTATUSEX є більш сучасною і вдосконаленою версією, яка надає більш детальну і точну інформацію про пам'ять.
Структура 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 використовується для заповнення цієї структури:

MEMORYSTATUSEX memStatusEx;  
memStatusEx.dwLength = sizeof(MEMORYSTATUSEX);  
if (GlobalMemoryStatusEx(&memStatusEx)) {  
 // Успішно отримано інформацію про пам'ять  
}

Основні характеристики MEMORYSTATUSEX:

  • Використовує 64-бітні значення (DWORDLONG), що робить її придатною для сучасних систем з великими обсягами пам'яті.
  • Надає додаткове поле (ullAvailExtendedVirtual) для розширеної віртуальної пам'яті.
  • Рекомендовано для нових додатків, які потребують детального моніторингу пам'яті.

Приклад реалізації

Нижче наведено приклад програми, що демонструє використання обох структур MEMORYSTATUS та MEMORYSTATUSEX:

#include   
#include   
#define DIV 1024  

int main() {  
 printf("***** Програма, що показує інформацію про пам'ять *****\n\n");  
#ifdef _WIN64  
 MEMORYSTATUSEX memoryInfo64;  
 memoryInfo64.dwLength = sizeof(MEMORYSTATUSEX);  
 GlobalMemoryStatusEx(&memoryInfo64);  
 printf("Загальний файл підкачки:\t %lu MB\n", (memoryInfo64.ullTotalPageFile / DIV));  
 printf("Загальний файл підкачки, що використовується:\t %lu MB\n", ((memoryInfo64.ullTotalPageFile - memoryInfo64.ullAvailPageFile) / DIV));  
 printf("Загальна фізичнаt %lu MB\n", (memoryInfo64.ullTotalPhys / DIV));  
 printf("Фізична пам'ять, що використовується:\t %lu MB\n", ((memoryInfo64.ullTotalPhys - memoryInfo64.ullAvailPhys) / DIV));  
 printf("Віртуальна пам'ять:\t %lu MB\n", (memoryInfo64.ullTotalVirtual / DIV));  
 printf("Віртуальна пам'ять, що використовується:\t %lu MB\n", ((memoryInfo64.ullTotalVirtual - memoryInfo64.ullAvailVirtual) / DIV));  
 printf("Відсоток фізичної пам'яті в використанні:\t %u%%\n", memoryInfo64.dwMemoryLoad);  
#else  
 MEMORYSTATUS memoryInfo32;  
 memoryInfo32.dwLength = sizeof(MEMORYSTATUS);  
 GlobalMemoryStatus(&memoryInfo32);  
 printf("Загальний файл підкачки:\t %zu MB\n", memoryInfo32.dwTotalPageFile / DIV);  
 printf("Загальний файл підкачки, що використовується:\t %zu MB\n", (memoryInfo32.dwTotalPageFile - memoryInfo32.dwAvailPageFile) / DIV);  
 printf("Загальна фізична пам'ять:\t %zu MB\n", memoryInfo32.dwTotalPhys / DIV);  
 printf("Фізична пам'ять, що використовується:\t %zu MB\n", (memoryInfo32.dwTotalPhys - memoryInfo32.dwAvailPhys) / DIV);  
 printf("Загальна віртуальна пам'ять:\t %zu MB\n", memoryInfo32.dwTotalVirtual / DIV);  
 printf("Віртуальна пам'ять, що використовується:\t %zu MB\n", (memoryInfo32.dwTotalVirtual - memoryInfo32.dwAvailVirtual) / DIV);  
 printf("Відсоток фізичної пам'яті в використанні:\t %u%%\n", memoryInfo32.dwMemoryLoad);  
#endif  
 printf("\n ***** Кінець програми *****\n");  
 system("PAUSE");  
}

Порівняння MEMORYSTATUS та MEMORYSTATUSEX

+------------------------+-----------------+-----------------+  
| Особливість | MEMORYSTATUS | MEMORYSTATUSEX |  
+------------------------+-----------------+-----------------+  
| Розмір типу даних | 32 біти | 64 біти |  
| Використовувана функція | GlobalMemoryStatus | GlobalMemoryStatusEx |  
| Точність | Обмежена | Висока |  
| Розширена віртуальна пам'ять | Не доступна | Доступна |  
| Підходить для сучасних систем | Ні | Так |  
+------------------------+-----------------+-----------------+

Висновок

Якщо ви розробляєте додатки для сучасних систем, рекомендується використовувати MEMORYSTATUSEX через її високу точність і підтримку великих розмірів пам'яті. Однак, якщо потрібна зворотна сумісність зі старими системами,MEMORYSTATUS` може залишатися життєздатним варіантом.

Вибір правильної структури залежно від вимог вашого додатку допоможе забезпечити оптимальну продуктивність і сумісність.

Перекладено з: Difference Between MemoryStatus and MemoryStatusEx and Their Usage

Leave a Reply

Your email address will not be published. Required fields are marked *