Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 没有页面文件的Windows XP内存管理-wrt的后果是什么。堆碎片?_C++_Winapi_Heap_Virtual Memory - Fatal编程技术网

C++ 没有页面文件的Windows XP内存管理-wrt的后果是什么。堆碎片?

C++ 没有页面文件的Windows XP内存管理-wrt的后果是什么。堆碎片?,c++,winapi,heap,virtual-memory,C++,Winapi,Heap,Virtual Memory,我一直在研究我们在WindowsXP嵌入式系统上的应用程序中看到的一个相当难以捉摸的bug 我们已经将错误缩小到一个指针,该指针应该指向内存块,而不是指向NULL。由于内存是通过调用malloc(..)分配的,而malloc(..)是未经检查的,我的直觉是malloc失败并返回NULL(尽管我们现在也在寻找其他可能性,例如可能无意中改变指针的竞争条件)。这是一个本地C++应用程序。追查这一原因时,崩溃稍微复杂一点,主要是因为我们只有死后崩溃转储,而失败表现在另一个线程上的第三方库中,我们没有源代

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

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

我的问题集中在记忆耗尽的可能性上。重要的是我们运行的XP嵌入式系统禁用了它的“页面文件”

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

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

  • 为什么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)

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

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


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

没有分页文件对堆损坏错误或碎片没有任何影响。LFH在中有很好的介绍。Linux可以在没有内存过度使用的情况下运行。通常不会这样做,因为在使用1GB RAM的进程中调用fork()会立即需要另一个完整的1GB RAM。这是否意味着上述堆统计中1621948的Reserv(k)量将占用该数量的物理RAM?或者这只适用于提交值?