分配大量虚拟内存失败
Fail to allocate a large amount of virtual memory
我读到,当您尝试使用 malloc()
分配比 RAM 中可用字节更多的字节时,它会分配虚拟内存。至少 Linux.
我想分配大量的虚拟内存,比如 100 GB。所以,我写了这样的东西:
void* virtual_memory = malloc(100 gb int);
但是返回的指针是NULL
我在 64 位 Ubuntu 虚拟机上执行此代码。
我做错了什么?
编辑
我想要实现的是使 htop
工具在我的进程的 VIRT 列中显示 100GB。
更新
我可以调用 malloc 一次分配 2 GB 50 次
我读到,当您尝试使用 malloc() 分配比 RAM 中可用字节更多的字节时,它会分配虚拟内存
首先,这是不正确的。您总是 分配虚拟内存。此虚拟内存映射到物理内存 (RAM) 或交换 space 上的某个区域。如果 swap space + 物理内存小于 100 GB,您的分配将失败。此外,libc
实现可能无法分配如此大的数量,如果它有一些(可编程的)限制集。
但是我有一个奇怪的任务是在 htop 工具中为进程显示 100gb 的虚拟内存。它声称可以通过单行代码实现。
是的,如果您只需要这么多虚拟内存,您可以保留内存但不提交。您可以阅读如何使用 mmap
(*NIX) or VirtualAlloc
(Windows)。
当你保留一个特定的虚拟地址范围时,你告诉操作系统你打算使用这个范围,所以其他代码不能使用它。但这并不意味着您可以实际使用它。这也意味着它不需要 RAM/Swap 支持。所以你将能够保留任意大的数量(当然在你的 64 位系统上少于 2^48 字节)。
虽然我不确定 htop
是否会将其包含在它显示的值中,但您必须尝试一下。
如果这确实没有增加您的虚拟内存计数,您可以将其映射到文件,而不是匿名映射。这可能会在您的系统上创建一个 100 GB 的文件(假设您有那么多 space),但您甚至应该能够 read/write 它。
以下代码可用于 linux -
int fd = open("temp.txt", O_RDWR | O_CREAT);
void* addr = mmap(NULL, 100 * GBS, PROT_WRITE | PROT_READ, MAP_PRIVATE, fd, 0);
以下代码为我完成了这件事:
for (int i = 0; i < 50; ++i) {
malloc(int_pow(2, 31));
}
其中 int_pow
只是一个自定义 pow
实现,它操作整数。在 运行 之后,此应用程序 htop
工具显示它恰好使用了 100GB 的虚拟内存。
我读到,当您尝试使用 malloc()
分配比 RAM 中可用字节更多的字节时,它会分配虚拟内存。至少 Linux.
我想分配大量的虚拟内存,比如 100 GB。所以,我写了这样的东西:
void* virtual_memory = malloc(100 gb int);
但是返回的指针是NULL
我在 64 位 Ubuntu 虚拟机上执行此代码。
我做错了什么?
编辑
我想要实现的是使 htop
工具在我的进程的 VIRT 列中显示 100GB。
更新 我可以调用 malloc 一次分配 2 GB 50 次
我读到,当您尝试使用 malloc() 分配比 RAM 中可用字节更多的字节时,它会分配虚拟内存
首先,这是不正确的。您总是 分配虚拟内存。此虚拟内存映射到物理内存 (RAM) 或交换 space 上的某个区域。如果 swap space + 物理内存小于 100 GB,您的分配将失败。此外,libc
实现可能无法分配如此大的数量,如果它有一些(可编程的)限制集。
但是我有一个奇怪的任务是在 htop 工具中为进程显示 100gb 的虚拟内存。它声称可以通过单行代码实现。
是的,如果您只需要这么多虚拟内存,您可以保留内存但不提交。您可以阅读如何使用 mmap
(*NIX) or VirtualAlloc
(Windows)。
当你保留一个特定的虚拟地址范围时,你告诉操作系统你打算使用这个范围,所以其他代码不能使用它。但这并不意味着您可以实际使用它。这也意味着它不需要 RAM/Swap 支持。所以你将能够保留任意大的数量(当然在你的 64 位系统上少于 2^48 字节)。
虽然我不确定 htop
是否会将其包含在它显示的值中,但您必须尝试一下。
如果这确实没有增加您的虚拟内存计数,您可以将其映射到文件,而不是匿名映射。这可能会在您的系统上创建一个 100 GB 的文件(假设您有那么多 space),但您甚至应该能够 read/write 它。
以下代码可用于 linux -
int fd = open("temp.txt", O_RDWR | O_CREAT);
void* addr = mmap(NULL, 100 * GBS, PROT_WRITE | PROT_READ, MAP_PRIVATE, fd, 0);
以下代码为我完成了这件事:
for (int i = 0; i < 50; ++i) {
malloc(int_pow(2, 31));
}
其中 int_pow
只是一个自定义 pow
实现,它操作整数。在 运行 之后,此应用程序 htop
工具显示它恰好使用了 100GB 的虚拟内存。