【问题标题】:Determining precisely ram unused available in Win32精确确定 Win32 中未使用的 ram
【发布时间】:2013-01-06 03:13:49
【问题描述】:

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

【问题讨论】:

  • 从用户空间执行此操作的整个想法是错误的。您无法控制缓冲区映射到哪些 RAM 块。从病态上讲,它们都可以放入交换文件中,并在 RAM 的单个页面中循环,一次一个,并且没有其他页面被触及。
  • 要了解有关 Windows 内存管理的更多信息,请查看 VMMapRAMMap,与 Mark Russinovich 一起揭开内存管理的奥秘(部分 12

标签: windows visual-c++ ram


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 我想在系统休眠前重置所有未使用的内存。
  • 确定休眠不会节省未使用的内存?关闭文件后,我尝试用记事本打开文件。该文件现在不使用内存。我休眠系统。重新启动并编辑 hiberfil.sys 并在其中查看在记事本中读取的上一个文件中的文本内容。如果休眠不保存未使用的内存,为什么它会在之前关闭的文件中保留文本?
  • 嗯,它在记事本的内存中。或者磁盘缓存。或者在文件系统驱动程序的数据结构中。它可以在除释放内存之外的许多地方。
  • @user745759 查看 56:51 的 this 网络广播和 secret.txt 示例。我已经suggested你使用 Rammap emty 功能重置待机列表并学习more关于 windows 中的内存管理。
  • 我在 1Mb 微型 ramdisk 中使用磁盘缓存。在不可以重置磁盘缓存或文件系统驱动程序的数据结构中的数据未使用?我不能在我的 xp 上尝试 Rammap。我不明白为什么你找不到一种简单的方法来重置未使用的内存。例如按需运行“零页线程”。或通过命令行或在 xp 中以编程方式使用类似 RAMMap "Empty ..." 功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-29
  • 1970-01-01
  • 2018-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多