在一个应用程序中,我必须分配两个480 MB的缓冲区。内存分配使用HeapAlloc方法完成。该应用程序在运行的应用程序不多的系统中运行良好。但是在其他应用程序也运行的系统中,由于连续内存不可用,因此未分配内存。即使内存空间(非连续)可用但未分配。
即使有不连续的内存,也需要帮助来分配两个480 MB的缓冲区。
答案 0 :(得分:3)
您所描述的情况在全功能操作系统中是不可能的,它为每个进程提供了自己的地址空间。运行多少其他应用程序并不重要,它们不会影响进程中空闲地址空间的连续性。虚拟内存可以将不连续的物理内存地址映射到虚拟地址空间中的连续范围。
只有在没有内存管理单元的嵌入式系统中,其他任务的存在才会导致程序遭受内存碎片化。
HeapAlloc()
建议使用Windows,它为每个进程提供单独的地址空间。最可能的解释是,您的私有地址空间被分散的位置加载的库(DLL)碎片化。您可以重新使用您使用的库来避免这种情况,并提供更大的连续地址空间块。
答案 1 :(得分:1)
您可以将VirtualAlloc与fAllocation
一起指定为MEM_LARGE_PAGES
。这会启用large page support,请注意您必须检查GetLargePageMinimum以确保系统支持大量页面。
另请注意,此页面details可能会很慢。
在系统长时间运行后可能难以获得大页面内存区域,因为每个大页面的物理空间必须是连续的,但内存可能已经碎片化。在这些条件下分配大页面会显着影响系统性能。因此,应用程序应该避免重复大页面分配,而是在启动时分配所有大页面一次。
答案 2 :(得分:0)
使用VirtualAlloc。支持虚拟页面的底层内存不需要是连续的,你将始终拥有完整的虚拟地址空间(在32位系统上为2GB,我认为在Windows x64上为8或16 TB,我不记得。)HeapAlloc可以成为支离破碎(通过您的流程使用,而不是其他人。)您的地址空间也可能变得支离破碎,因此请尝试在应用程序的早期分配它。我实际上不推荐HeapAlloc用于任何事情,你可以使用new和delete(调用malloc和free)对于像你这样的大块,malloc将在Windows上调用VirtualAlloc。