我经常希望虚拟地址空间的连续大区域可以按需增长。在Windows上,我用VirtualAlloc
和MEM_RESERVE
自变量(我认为大于该区域的自变量)调用dwSize
很有可能需要增长,然后根据需要一次提交一个页面。这不仅会将映射页面推迟到物理内存中,直到它们被访问为止(这将使整个区域开始执行)也将这样做,而且还推迟了根据系统提交限制向页面收费。这样,程序就不会限制其他程序为尚未使用且可能永远不会使用的内存而分配的内存量。基本上,我想处理程序的内存管理,以便在原则上允许用户需要时消耗大量内存,同时允许其他程序首先拥有该内存,而无需其他程序。
有人拥有already asked,macOS是否具有与VirtualAlloc
相等的MEM_RESERVE
。答案表明mmap
与MAP_ANON | MAP_PRIVATE
大致相等。我想知道的是,macOS是否具有等同于Windows提交限制的功能,并且以正确的标志调用的mmap
是否像我的VirtualAlloc
用法那样不超出该限制?
编辑:其他人asked一个关于Linux的类似问题,也建议使用mmap
。答案表明,在该平台上,首先需要使用PROT_NONE
映射区域并在需要页面时添加所需的特权,以防止未使用的页面计入提交限制。缺乏更好的文档说明为何macOS允许映射内存超出可用物理内存(完全没有提交限制?像Linux这样的某种过度使用功能?),我想我还是可以应用相同的PROT_NONE
技巧如果。至少,这意味着如果我也选择支持该平台,我将能够在Linux上重用相同的代码。
我不认为macOS具有系统提交限制。我在Mach API中找不到类似的东西,这是我期望的低层VM API。同样,在sysctl -a
的输出中看不到任何类似的内容,该输出报告了许多其他VM详细信息和统计信息。
我可以肯定地说,我已经在64位进程(具有46位用户地址空间)中保留了所有未使用的空间。也就是说,就在128TiB之下。
您可以通过重复大尺寸的mmap()
呼叫直到失败,将大小减半然后重复直到大小减小到1页来复制该内容。然后,在该过程暂停的情况下,对其应用vmmap -w -interleaved <pid>
以查看其分配。