我经常想要能够按需增长的大的、连续的虚拟地址空间区域。在Windows上,我使用MEM_RESERVE和一个dwSize参数调用VirtualAlloc,我认为这个参数大于区域可能需要增长的合理范围,然后根据需要一次提交一个页面。这不仅推迟了页面到物理内存的映射,直到它们被访问,首先提交整个区域也会这样做,而且还推迟了对页面的系统提交限制的收费。这样,程序就不会限制其他程序为了它还没有使用也可能永远不会使用的内存而提交的内存大小。基本上,我希望处理我的程序的内存管理,以便原则上允许它在用户的需求需要时消耗大量内存,同时如果其他程序首先需要内存,则允许它们使用该内存。
有人有already asked macOS是否有一个等同于VirtualAlloc和MEM_RESERVE的东西。答案表明,mmap和MAP_ANON | MAP_PRIVATE大致相当。我想知道的是,macOS是否有一个等同于Windows的限制,以及使用正确的标志调用的mmap,在不对该限制收费时,是否像我的VirtualAlloc使用一样?
编辑:其他人对Linux也提出了类似的问题,mmap也被建议使用。答案表明,在该平台上,最初使用PROT_NONE映射区域并在需要页面时添加所需的权限是必要的,以防止未使用的页面超出提交限制。缺乏更好的文档来说明为什么在macOS中允许映射内存超过可用物理内存(完全缺乏提交限制?一些类似Linux的过度提交特性?),我想我也可以应用同样的PROT_NONE技巧,以防万一。至少,这意味着如果我选择支持Linux平台,我将能够在Linux上重用相同的代码。
发布于 2019-11-11 08:57:29
我不相信macOS有系统提交限制。我在Mach API中找不到任何类似的东西,这是我期望的低级VM API。同样,我在sysctl -a的输出中也看不到类似的东西,它报告了许多其他VM详细信息和统计信息。
我可以肯定地告诉您,我已经在一个64位进程中保留了全部未使用的空间(它有一个46位的用户地址空间)。也就是说,略低于128TiB。
您可以重复使用较大大小的mmap()调用,直到它们失败,将大小减半,然后重复,直到大小降到1个页面。然后,在进程暂停的情况下,对其应用vmmap -w -interleaved <pid>以查看其分配情况。
https://stackoverflow.com/questions/58793601
复制相似问题