-1

我使用此例程将未使用的 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;
}
4

1 回答 1

5

这个程序不会做你认为它做的事情。事实上,它适得其反。幸运的是,这也是不必要的。

首先,该程序是不必要的 Windows 已经有一个线程完整的工作来清零空闲页面,无创意地称为零页面线程这篇博文详细介绍了它的工作原理。因此,用零填充空闲内存的方法是什么都不做,因为已经有人用零填充空闲内存。

其次,程序并没有像你想象的那样做,因为当应用程序分配内存时,内核会在将内存分配给应用程序之前确保内存已满零。(如果没有足够的预置零页面可用,内核将在此处将页面置零。)因此,写出零的程序只是在零上写零。

第三,该程序适得其反,因为它没有将自己限制在空闲的内存中。它正在清零可能很忙的一大块内存。这可能会迫使其他应用程序放弃其活动内存,以便将其提供给您。

该程序也适得其反,因为即使它只设法获取空闲内存,它也会在释放内存之前弄脏内存(通过写入零)。将脏页返回给内核会将它们放在“可用脏内存”列表中,这意味着零页线程必须再次将它们归零。(冗余,在这种情况下,但内核不会在清零之前检查释放的页面是否充满零。检查页面是否充满零与将其清零一样昂贵。)

目前尚不清楚您的程序的目的是什么。为什么空闲内存是否充满零很重要?

于 2013-01-06T13:05:05.387 回答