【问题标题】:Windows XP memory management without pagefile - what are the consequences wrt. to heap fragmentation?没有页面文件的 Windows XP 内存管理 - 有什么后果 wrt。堆碎片?
【发布时间】:2014-02-06 11:24:43
【问题描述】:

我一直在研究我们在 Windows XP 嵌入式系统上的应用程序中看到的一个相当难以捉摸的错误。

我们已将错误范围缩小到应该指向内存块的指针,而不是指向 NULL。由于内存是通过未检查的 malloc(..) 调用分配的,我的直觉认为 malloc 失败并返回 NULL(尽管我们现在也在寻找其他可能性,例如可能无意中改变指针)。这是本机 C++ 应用程序。追查到这个原因的崩溃有点复杂,主要是因为我们只有事后崩溃转储,并且故障表现在我们没有源代码的第三方库中,在不同的线程上。欢乐时光:)

我的问题集中在内存耗尽的可能性上。重要的是我们运行的 XP Embedded 系统禁用了它的页面文件。

所以,我有三个问题;如果有人能为我澄清这些,那就太好了:

  • 首先,没有分页文件意味着什么?这是否意味着当堆增长时,即使没有立即使用这些空闲块,操作系统也需要立即找到并分配新内存?我看过一些关于它的轶事提及,但找不到任何关于禁用页面文件的确切影响的具体信息。

  • 为什么 Microsoft 决定在 Windows Vista 之前默认不启用低碎片化堆?在 Windows XP 上为您的进程启用 LFH 是否存在危险?

  • WinDbg 中的“外部碎片”和“虚拟地址碎片”有什么区别?

WinDbg 报告受影响堆上的堆统计信息如下:

Heap     Flags   Reserv  Commit  Virt   Free  List   UCR  Virt  Lock  Fast
                  (k)     (k)    (k)     (k) length      blocks cont. heap
04770000 00001002 1621948  94844 1608284  102    6  8068    6      2   L 

  Virtual address fragmentation  94 % (8068 uncommited ranges)

【问题讨论】:

  • 没有分页文件对堆损坏错误或碎片没有任何影响。 this KB article 很好地涵盖了 LFH。

标签: c++ winapi heap-memory virtual-memory


【解决方案1】:

与 Linux 不同,在 Windows 上,分配是一种承诺。您能够写入分配的内存。性能可能很糟糕,但 Windows 不需要 OOM 杀手。

如果没有分页文件,则承诺必须由 RAM 支持。然而未使用的内存(例如仅在程序初始化期间使用的内存)仍在使用 RAM,因为它无法被调出。因此,做出承诺的 RAM 更少,但需求却大得多。

LFH 会破坏有缺陷的程序,或者更确切地说:有缺陷的程序可能会在 LFH 存在的情况下显示它们的错误。 Microsoft 对损坏的程序非常友好,让 LFH 选择加入 XP 是他们适应行为的典型示例。

【讨论】:

  • Linux 可以在没有内存过量使用的情况下运行。通常不会这样做,因为在使用 1 GB RAM 的进程中调用 fork() 会立即需要另一个完整的 1 GB RAM。
  • 这是否意味着上述堆统计中的 Reserv (k) 数量 1621948 将占用该数量的物理 RAM?还是仅适用于 Commit 值?
猜你喜欢
  • 2010-12-13
  • 2015-12-21
  • 1970-01-01
  • 2010-09-11
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 2011-12-22
  • 1970-01-01
相关资源
最近更新 更多