我使用此例程用零填充未使用的ram。 它在某些计算机上导致崩溃并且很粗糙 size = size - (size / 10); 有一种更准确的方法可以确定用零填充的未使用的RAM量吗?
DWORDLONG getTotalSystemMemory(){
PROCESS_MEMORY_COUNTERS lMemInfo;
BOOL success = GetProcessMemoryInfo(
GetCurrentProcess(),
&lMemInfo,
sizeof(lMemInfo)
);
MEMORYSTATUSEX statex;
statex.dwLength = sizeof(statex);
GlobalMemoryStatusEx(&statex);
wprintf(L"Mem: %d\n", lMemInfo.WorkingSetSize);
return statex.ullAvailPhys - lMemInfo.WorkingSetSize;
}
void Zero(){
int size = getTotalSystemMemory();//-(1024*140000)
size = size - (size /10);
//if(size>1073741824) size=1073741824; //2^32-1
wprintf(L"Mem: %d\n", size);
BYTE* ar = new BYTE[size];
RtlSecureZeroMemory(ar,size);
delete[] ar;
}
答案 0 :(得分:5)
这个程序不符合你的想法。事实上,这会适得其反。幸运的是,这也是不必要的。
首先,该程序是不必要的Windows已经有一个线程完全唯一的工作,以将免费页面归零,不加思索地称为零页面线程。 This blog entry详细介绍了它的工作原理。因此,用零填充空闲内存的方法是什么都不做,因为已经有人用零填充空闲内存。
其次,程序没有按照您的想法执行操作,因为当应用程序分配内存时,内核会在将内存提供给应用程序之前确保内存充满零。 (如果没有足够的预归零页面可用,内核会将页面清零。)因此,写出零的程序只是在零之上写入零。
第三,该程序适得其反,因为它不限于自由的内存。它正在将可能一直很忙的大块内存归零。这可能会迫使其他应用程序放弃其活动内存,以便将其提供给您。
该程序也适得其反,因为即使它只是为了获取空闲内存,它也会在释放之前弄脏内存(通过写入零)。将脏页面返回内核会将它们放在"脏空闲内存中#34; list,这意味着零页面线程必须再次将其归零。 (在这种情况下,冗余地,但是内核在将其归零之前不会检查释放的页面是否充满零。检查页面是否充满零是非常昂贵的,无论如何都要将其归零。)
目前还不清楚您的计划的目的是什么。为什么空闲内存充满了零呢?