无法分配大量虚拟内存

时间:2017-12-12 07:39:06

标签: c ubuntu memory-management ubuntu-17.04

我读到当你尝试使用malloc()分配比RAM中可用字节更多的字节时,它会分配虚拟内存。至少在Linux上。

我想分配大量的虚拟内存,比方说100 GB。所以,我写了这样的话:

void* virtual_memory = malloc(100 gb int);

但是返回的指针是NULL。

我在64位Ubuntu虚拟机上执行此代码。

我做错了什么?

修改 我想要实现的是让htop工具在我的流程的VIRT列中显示100GB。

更新 我可以调用malloc一次分配2 GB 50次

2 个答案:

答案 0 :(得分:2)

我读到当你尝试使用malloc()分配比RAM中更多的字节时,它会分配虚拟内存

首先,这是不正确的。您始终分配虚拟内存。此虚拟内存映射到物理内存(RAM)或交换空间上的某个区域。如果交换空间+物理内存小于100 GB,则分配将失败。此外,libc实现可能无法分配如此大的数量,如果它具有某些(可编程)限制集。

但是我有一个奇怪的任务是在htop工具中为进程显示100gb的虚拟内存。它声称可以通过单行代码实现。

是的,如果您只需要这么多虚拟内存,您可以保留内存但不提交内存。您可以阅读mmap(* NIX)或VirtualAlloc(Windows)如何用于此目的。

当您保留特定的虚拟地址范围时,您告诉操作系统您打算使用此范围,因此其他代码无法使用该范围。但这并不意味着你可以实际使用它。这也意味着它不需要RAM / Swap支持。因此,您可以保留任意大量(当然,在64位系统上少于2 ^ 48个字节)。

虽然我不确定htop是否会在其显示的值中包含该值,但您必须尝试这样做。

如果这确实没有添加到您的虚拟内存计数中,您可以将其映射到文件,而不是匿名映射。这可能会在您的系统上创建一个100 GB的文件(假设您有足够的空间),但您甚至可以读取/写入它。

以下代码可以在linux上使用 -

int fd = open("temp.txt", O_RDWR | O_CREAT);
void* addr = mmap(NULL, 100 * GBS, PROT_WRITE | PROT_READ, MAP_PRIVATE, fd, 0);

答案 1 :(得分:0)

以下代码为我完成了这件事:

for (int i = 0; i < 50; ++i) {
    malloc(int_pow(2, 31));
}

int_pow只是一个自定义pow实现,它运行整数。运行此应用程序后,htop工具显示它正好使用100GB的虚拟内存。