是否可以在linux中分配大量虚拟内存?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否可以在linux中分配大量虚拟内存?相关的知识,希望对你有一定的参考价值。

出于某些目的,分配大量的虚拟空间会很有效,并且仅在被访问的页面中分配页面。分配大量内存是瞬时的,实际上并没有获取页面:

char* p = new char[1024*1024*1024*256];

确定,上面指出的是错误的,因为它是32位数字。访问第一个元素没有问题:

p[0] = 1;

但是,当稍后访问大约4Gb时,会出现段错误:

p[1000000000] = 1;

我希望new调用malloc并调用sbrk,并且当我访问起始位置之外的4Gb位置时,它将尝试将任务内存扩展那么多?

这里是完整程序:

#include <cstdint>
int main() {
  constexpr uint64_t GB = 1024*1024*1024;
  char* p = new char[256*GB]; // allocate large block of virtual space
  p[0] = 1;
  p[1000000000] = 1;
  p[2000000000] = 1;
}

现在,当我尝试分配大量内存时,我得到bad_alloc,因此显然malloc无法正常工作。

我的印象是mmap可以映射到文件,但是由于建议这样做,所以我正在研究它。

是否有任何方法可以分配大量的虚拟内存并稀疏访问页面,或者这不可行?

答案

256*GB的值不适合32位整数类型的范围。尝试将uint64_t作为GB的一种类型:

constexpr uint64_t GB = 1024*1024*1024;

,或者,强制执行64位乘法:

char* p = new char[256UL * GB];

OT:我希望使用GB的定义:

constexpr uint64_t GB = 1UL << 30;

以上是关于是否可以在linux中分配大量虚拟内存?的主要内容,如果未能解决你的问题,请参考以下文章

在 Ruby 中分配内存失败(No MemoryError)?

在 Java 中分配大量数组时避免内存碎片

如何在 Linux 中分配满足分页和缓存要求的内存?

在linux中分配物理内存缓冲区

在函数 C++ 中分配内存二维数组

如何在 Linux 中分配大的连续内存区域