这个有趣的代码总是在Linux系统中分配3 GB内存,即使物理RAM小于3 GB。
如何? (我的系统中有一个2.7 GB的RAM,这段代码分配了3.054 MB内存!)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
void *ptr;
int n = 0;
while (1) {
// Allocate in 1 MB chunks
ptr = malloc(0x100000);
// Stop when we can't allocate any more
if (ptr == NULL)
break;
n++;
}
// How much did we get?
printf("malloced %d MB\n", n);
pause();
}
答案 0 :(得分:2)
当机器耗尽物理RAM来解决时,他们可以使用硬盘空间“充当RAM”。这显着降低,但仍可以完成。
通常,机器可以使用多个级别来访问信息:
它会在可用时使用最快,但正如您所指出的那样,它有时需要使用其他资源。
答案 1 :(得分:1)
默认情况下,在Linux中,在实际尝试修改RAM之前,实际上并没有获得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少于应用程序请求时,它将使用磁盘作为后备存储。您可以使用的总空间受到三件事的限制:
ulimit
在32位Linux中,操作系统为每个任务提供3GB的虚拟地址空间。在64位Linux中,我相信这个数字是100兆兆字节。不过,我不确定默认ulimit
是什么。因此,找到一个64位系统并尝试修改后的程序。我想你会待一个漫长的夜晚。 ; - )
编辑:这是我的64位Ubuntu 11.04系统上的默认ulimit
值:
$ 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
因此,似乎没有任务的默认内存大小限制。