等同于保留内存而不收费提交限制的macOS

我经常希望虚拟地址空间的连续区域可以按需增长。在Windows上,我用VirtualAlloc和一个MEM_RESERVE参数调用dwSize,并认为该参数可能需要增长,然后在需要的时间。这不仅将映射页面推迟到物理内存,直到它们被访问为止(这将使整个区域开始)也将这样做,而且还推迟了对页面的系统提交限制。这样,程序就不会限制其他程序为尚未使用且可能永远不会使用的内存而分配的内存量。基本上,我想处理程序的内存管理,以便在原则上允许用户需要时消耗大量内存,同时允许其他程序首先拥有该内存,而不是其他程序。

某人拥有already asked是否macOS与VirtualAlloc等效于MEM_RESERVE。答案表明mmapMAP_ANON | MAP_PRIVATE大致相等。我想知道的是,macOS是否具有等同于Windows提交限制的功能,并且使用正确标志调用的mmap是否像我的VirtualAlloc用法那样没有超出该限制?>

编辑:其他人asked关于Linux的类似问题,也建议使用mmap。答案表明,在该平台上,有必要使用PROT_NONE映射区域并在需要页面时添加所需的特权,以防止未使用的页面计入提交限制。缺乏更好的文档说明为什么macOS中允许映射内存超出可用物理内存(完全没有提交限制?像Linux这样的某种过量使用功能?),我想我还是可以使用相同的PROT_NONE以防万一。至少,这意味着如果我也选择支持该平台,我将能够在Linux上重用相同的代码。

mfpaaa 回答:等同于保留内存而不收费提交限制的macOS

我不认为macOS具有系统提交限制。我在Mach API中找不到类似的东西,这是我期望的低层VM API。同样,我在sysctl -a的输出中看不到任何类似的内容,该输出报告了许多其他VM详细信息和统计信息。

我可以肯定地说,我已经在64位进程(具有46位用户地址空间)中保留了所有未使用的空间。也就是说,刚好在128TiB以下。

您可以通过重复大尺寸的mmap()呼叫直到失败,将大小减半然后重复直到大小减小到1页来复制该内容。然后,在该过程暂停的情况下,对其应用vmmap -w -interleaved <pid>来查看其分配。

本文链接:https://www.f2er.com/3127293.html

大家都在问