【发布时间】:2025-12-08 12:25:02
【问题描述】:
Windows 有 VirtualAlloc,它允许您保留一个连续的地址空间区域,但实际上并不使用任何物理内存。稍后当您想要使用它(或其中的一部分)时,您再次调用 VirtualAlloc 以提交先前保留页面的区域。
这实际上非常有用,但我想最终将我的应用程序移植到 linux - 所以如果以后不能移植它,我不想使用它。 linux有没有办法做到这一点?
编辑 - 用例
我正在考虑分配 4 GB 或类似的虚拟地址空间,但一次只提交 64K。这将为我提供一种零拷贝方式来将数组增加到 4 GB。这一点很重要,因为典型的双倍数组大小和副本会为非常大的数组引入看似随机的不可接受的延迟。
【问题讨论】:
-
这对您有什么用例?为什么区分询问是否可以分配空间(保留它)和实际使用内存中的空间之间的区别很重要?
-
看起来常规的 alloc 应该可以正常工作。如果内存没有被使用,它会被换出,当你开始使用它时,它会被带回内存
-
@xyld:一个从虚拟地址空间中扣除块,另一个从虚拟内存(页面文件)中扣除。
-
顺便说一句,无需复制即可解决此问题的一种快速方法是 mremap(尽管它只是开始在大缓冲区大小 (>65K) 下胜过 TLB 无效和其他成本)
-
保留但不提交内存对于减少“随机不可接受的延迟”可能没有您想象的那么大。它可能会创建它。您将在未来的某个时候引入页面错误,并且为这些错误提供服务会产生更多的延迟,这就是 RTOS 通常避开这种情况的原因。
标签: linux memory-management virtualalloc