linux下可以分配大容量的虚拟内存吗?
可能吧。但您可能需要将其配置为允许:
Linux内核支持以下几种过载处理模式
0 - 启发式过量使用处理。明显的地址过量使用
空间被拒绝。用于典型系统。它确保了认真
疯狂分配失败,同时允许过度使用以减少交换
用法。 root 可以在此分配稍微多一点的内存
模式。这是默认设置。
1 - 总是过度投入。适用于某些科学应用。
经典示例是使用稀疏数组并仅依赖于
虚拟内存几乎完全由零页组成。
2 - 不要过度投入。系统的总地址空间提交
不允许超过交换+可配置的金额(默认为
50%) 的物理 RAM。取决于您使用的量,在大多数情况下
这意味着进程在访问时不会被终止
页,但会在适当的情况下收到内存分配错误。
对于想要保证内存的应用程序很有用
未来将可以进行分配,而无需
初始化每个页面。
过量使用策略是通过 sysctl ‘vm.overcommit_memory’ 设置的。
因此,如果您想分配比物理内存更多的虚拟内存,那么您需要:
# in shell
sysctl -w vm.overcommit_memory=1
RLIMIT_AS 进程虚拟内存(地址空间)的最大大小(以字节为单位)。此限制会影响对 brk(2)、mmap(2) 和 mremap(2) 的调用,超过此限制后,这些调用会失败并出现错误 ENOMEM。此外,自动堆栈扩展也会失败(如果没有通过 sigaltstack(2) 提供可用的备用堆栈,则会生成 SIGSEGV 来终止进程)。由于该值是 long,因此在具有 32 位 long 的计算机上,此限制最多为 2 GiB,或者此资源是无限的。
所以,你想要:
setrlimit(RLIMIT_AS, {
.rlim_cur = RLIM_INFINITY,
.rlim_max = RLIM_INFINITY,
});
或者,如果您无法授予进程执行此操作的权限,那么您可以在 /etc/security/limits.conf 中永久配置它,这将影响(用户/组的)所有进程。
好的,所以 mmap 似乎支持...但它需要一个文件描述符。 ...可能是一个胜利,但如果它们必须有文件支持则不然...我不喜欢附加到文件的想法
您不需要使用文件支持的 mmap。有 MAP_ANONYMOUS 来解决这个问题。
我不知道要输入什么号码来请求
然后使用空值。例子:
mmap(nullptr, 256*GB, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
也就是说,如果您已经按照描述配置了系统,那么new
应该同样有效mmap
。大概会用到malloc
这可能会使用mmap
对于像这样的大分配。
额外提示:您可能会受益于使用巨大的TLB页面 https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/mm/hugetlbpage.rst.