2

在应用程序中,我必须分配两个每个 480 MB 的缓冲区。内存分配是使用 HeapAlloc 方法完成的。该应用程序在运行不多的应用程序的系统中运行良好。但是在其他应用程序也在运行的系统中,由于连续内存不可用,因此不会分配内存。即使内存空间(非连续)可用但未分配。

即使非连续内存可用,也需要帮助分配两个 480 MB 的缓冲区。

4

3 回答 3

3

您描述的情况在功能齐全的操作系统中是不可能的,它为每个进程提供了自己的地址空间。不管有多少其他应用程序正在运行,它们都不会影响您进程中可用地址空间的连续性。并且虚拟内存可以将不连续的物理内存地址映射到虚拟地址空间中的一个连续范围。

只有在没有内存管理单元的嵌入式系统中,其他任务的存在才会导致您的程序遭受内存碎片。

HeapAlloc()建议 Windows,它确实为每个进程提供了单独的地址空间。最可能的解释是,您的私有地址空间被加载在分散位置的库 (DLL) 所分割。您可以对使用的库进行变基以避免这种情况并提供更大的连续地址空间块。

于 2013-05-17T05:15:04.743 回答
1

您可以使用指定为的VirtualAlloc。这将启用大页面支持,注意必须检查GetLargePageMinimum以确保系统支持大页面。fAllocationMEM_LARGE_PAGES

另请注意,这可能会因为此页面详细信息而变慢。

由于每个大页面的物理空间必须是连续的,所以在系统运行很长时间后,可能很难获得大页面内存区域,但内存可能已经碎片化。在这些情况下分配大页面会显着影响系统性能。因此,应用程序应避免重复分配大页面,而是在启动时一次性分配所有大页面。

于 2013-05-17T06:32:34.927 回答
0

使用虚拟分配。支持虚拟页面的底层内存不必是连续的,并且您将始终拥有完整的虚拟地址空间(在 32 位系统上为 2GB,我认为在 Windows x64 上为 8 或 16 TB,我不记得了。)HeapAlloc 可以变成碎片化(通过您的进程使用,而不是其他人。)您的地址空间也可能变得碎片化,因此请尝试在应用程序的早期分配它。我实际上不推荐 HeapAlloc 做任何事情,你可以只使用 new 和 delete(调用 malloc 和 free)对于像你这样的大块 malloc 将在 Windows 上调用 VirtualAlloc。

于 2013-05-17T05:19:37.630 回答