默认情况下,在 Linux 中,除非您实际尝试修改它,否则您实际上不会获得 RAM。您可以尝试如下修改您的程序,看看它是否会更快死亡:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
char *ptr;
int n = 0;
while (1) {
// Allocate in 4kb chunks
ptr = malloc(0x1000);
// Stop when we can't allocate any more
if (ptr == NULL)
break;
*ptr = 1; // modify one byte on the page
n++;
}
// How much did we get?
printf("malloced %d MB\n", n / 256);
pause();
}
如果您有足够的交换空间但 RAM 不足,那么此代码将开始严重破坏交换文件。如果您没有足够的交换,它实际上可能会在到达结束之前崩溃。
正如其他人所指出的,Linux 是一个虚拟内存操作系统,当机器的 RAM 少于应用程序请求时,它将使用磁盘作为后备存储。您可以使用的总空间受限于三件事:
- 分配给交换的 RAM 和磁盘的总和
- 虚拟地址空间的大小
- 资源限制由
ulimit
在 32 位 Linux 中,操作系统为每个任务提供 3GB 的虚拟地址空间以供使用。在 64 位 Linux 中,我相信这个数字是 100 TB。不过,我不确定默认值ulimit
是什么。因此,找到一个 64 位系统并在其上尝试修改后的程序。我想你会在这里度过一个漫长的夜晚。;-)
ulimit
编辑:这是我的 64 位 Ubuntu 11.04 系统上的默认值:
$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 20
file size (blocks, -f) unlimited
pending signals (-i) 16382
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) unlimited
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
因此,任务似乎没有默认的内存大小限制。