При розробці додатків важливо контролювати використання пам'яті системи для оптимізації продуктивності. Дві ключові структури, надані 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