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

时间:2013-01-06 03:13:50

标签: windows visual-c++ ram

我使用此例程用零填充未使用的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;
}

1 个答案:

答案 0 :(得分:5)

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

首先,该程序是不必要的Windows已经有一个线程完全唯一的工作,以将免费页面归零,不加思索地称为零页面线程This blog entry详细介绍了它的工作原理。因此,用零填充空闲内存的方法是什么都不做,因为已经有人用零填充空闲内存。

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

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

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

目前还不清楚您的计划的目的是什么。为什么空闲内存充满了零呢?