在Win32中确定ram中未使用的ram

-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)

Ray*_*hen 5

这个程序不符合您的想法.事实上,这会适得其反.幸运的是,这也是不必要的.

首先,该程序是不必要的Windows已经有一个线程完全唯一的工作,以零免费页面,无意义地称为零页面线程.这篇博客文章详细介绍了它的工作原理.因此,用零填充空闲内存的方法是什么也不做,因为已经有人用零填充空闲内存.

其次,程序没有按照您的想法执行操作,因为当应用程序分配内存时,内核会在将内存提供给应用程序之前确保内存充满零.(如果没有足够的预归零页面可用,内核会将页面清零.)因此,写出零的程序只是在零之上写入零.

第三,该计划适得其反,因为它不限于免费的记忆.它正在将可能一直很忙的大块内存归零.这可能会迫使其他应用程序放弃其活动内存,以便将其提供给您.

该程序也适得其反,因为即使它只能获取空闲内存,它也会在释放之前弄脏内存(通过写入零).将脏页面返回到内核将它们放在"脏空闲内存"列表中,这意味着零页面线程必须再次将它们归零.(冗余地,在这种情况下,但是内核不会在将其清零之前检查释放的页面是否充满零.检查页面是否充满零也是非常昂贵的,无论如何都要将其归零.)

目前还不清楚你的计划的目的是什么.为什么免费记忆充满了零呢?