MemoryStatus ve MemoryStatusEx arasındaki fark ve kullanımı

Merhabalar.

Bugünlerde aldığım bir dersten ötürü Windows.h kütüphanesini öğrenme ve uygulama imkanım oluyor. İnternette Microsoft dökümanları dışında kaynak olmadığından ötürü vakit buldukça öğrendiğim şeyleri buraya aktarmaya çalışacağım.

MemoryStatus ve MemoryStatusEx

MemoryStatus ve MemoryStatusEx aslında ayrı birer struct yapısı. Bu struct yapıları, bilgisayarda bulunan hafıza alanları ile ilgili bilgiler tutar. MemoryStatus, x86 sistemler için yazılmışken, MemoryStatusEx(tended), x64 sistemler için oluşturulmuştur. x64 sistemler için oluşturulan struct yapısı x86 sistemler için de geçerli sonuçlar verirken, tersi mümkün değildir. Nedeni ise x86 sistemlerin 32 bit çalışmasıdır ve bu yüzden üst segmentleri derleyemez, anlamlandıramaz hatta verileri depolayamaz.

Kısa tutayım ve yazdığım kodu sizlerle paylaşayım:

#include 
#include 
#include 
#define DIV 1024

int main() {
	printf("***** The program that shows informations about memory *****\n\n");

// *** All outputs are written in MB ***

#ifdef _WIN64

	// x64

	MEMORYSTATUSEX memoryInfo64;
	memoryInfo64.dwLength = sizeof(MEMORYSTATUSEX);
	GlobalMemoryStatusEx(&memoryInfo64);

	DWORDLONG ullTotalPageFile = memoryInfo64.ullTotalPageFile;
	printf("Total page file:\t %lu \n",(ullTotalPageFile / DIV));

	DWORDLONG ullPageFileInUse = memoryInfo64.ullTotalPageFile - memoryInfo64.ullAvailPageFile;
	printf("Total page file in use:\t %lu \n", (ullPageFileInUse / DIV));

	DWORDLONG ullTotalPhys = memoryInfo64.ullTotalPhys;
	printf("Total physical memory:\t %lu \n", (ullTotalPhys / DIV));
	
	DWORDLONG ullTotalPhysInUse = memoryInfo64.ullTotalPhys - memoryInfo64.ullAvailPhys;
	printf("Total physical memory in use:\t %lu \n", (ullTotalPhysInUse / DIV));

	DWORDLONG ullTotalVirtual = memoryInfo64.ullTotalVirtual;
	printf("Virtual memory:\t %lu \n", (ullTotalVirtual / DIV));

	DWORDLONG ullTotalVirtualInUse = memoryInfo64.ullTotalVirtual - memoryInfo64.ullAvailVirtual;
	printf("Virtual memory in use:\t %lu \n", (ullTotalVirtualInUse / DIV));

	DWORD dwMemoryLoad = memoryInfo64.dwMemoryLoad;
	printf("Percantage of physical memory in use:\t %u \n", dwMemoryLoad);

#else

	/// x86

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

	SIZE_T dwTotalPageFile = memoryInfo32.dwTotalPageFile;
	printf("Total page file:\t %zu\n", dwTotalPageFile / DIV);

	SIZE_T dwAvailPageFile = memoryInfo32.dwAvailPageFile;
	printf("Total page file in use:\t %zu\n", (dwTotalPageFile - dwAvailPageFile) / DIV);

	SIZE_T dwTotalPhysicalMemory = memoryInfo32.dwTotalPhys;
	printf("Total physical memory:\t %zu\n", dwTotalPhysicalMemory / DIV);

	SIZE_T dwAvailPhysicalMemory = memoryInfo32.dwAvailPhys;
	printf("Total physical memory in use:\t %zu\n", (dwTotalPhysicalMemory - dwAvailPhysicalMemory) / DIV);

	SIZE_T dwTotalVirtualMemory = memoryInfo32.dwTotalVirtual;
	printf("Total virtual memory used:\t %zu\n", dwTotalVirtualMemory);

	SIZE_T dwAvailVirtualMemory = memoryInfo32.dwAvailVirtual;
	printf("Total virtual memory in use:\t %zu \n", (dwTotalVirtualMemory - dwAvailVirtualMemory) / DIV);

	DWORD dwMemoryLoad = memoryInfo32.dwMemoryLoad;
	printf("Percantage of physical memory in use:\t %u \n", dwMemoryLoad);

#endif
		

	printf("\n \n ***** End of the Program *****\n");

	system("PAUSE");
}

64 bit derlediğimde ise çıktısı tam olarak şu şekilde olmaktadır: