-1 windows ram visual-c++
我用这个例程用零填充未使用的ram.它在某些计算机上导致崩溃,并且粗糙大小=大小 - (大小/ 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;
}
Run Code Online (Sandbox Code Playgroud)
这个程序不符合您的想法.事实上,这会适得其反.幸运的是,这也是不必要的.
首先,该程序是不必要的Windows已经有一个线程完全唯一的工作,以零免费页面,无意义地称为零页面线程.这篇博客文章详细介绍了它的工作原理.因此,用零填充空闲内存的方法是什么也不做,因为已经有人用零填充空闲内存.
其次,程序没有按照您的想法执行操作,因为当应用程序分配内存时,内核会在将内存提供给应用程序之前确保内存充满零.(如果没有足够的预归零页面可用,内核会将页面清零.)因此,写出零的程序只是在零之上写入零.
第三,该计划适得其反,因为它不限于免费的记忆.它正在将可能一直很忙的大块内存归零.这可能会迫使其他应用程序放弃其活动内存,以便将其提供给您.
该程序也适得其反,因为即使它只能获取空闲内存,它也会在释放之前弄脏内存(通过写入零).将脏页面返回到内核将它们放在"脏空闲内存"列表中,这意味着零页面线程必须再次将它们归零.(冗余地,在这种情况下,但是内核不会在将其清零之前检查释放的页面是否充满零.检查页面是否充满零也是非常昂贵的,无论如何都要将其归零.)
目前还不清楚你的计划的目的是什么.为什么免费记忆充满了零呢?
归档时间: |
|
查看次数: |
354 次 |
最近记录: |