我经常希望虚拟地址空间的连续区域可以按需增长。在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上重用相同的代码。