这段有趣的代码在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 MBn", n);
pause();
}
当机器没有物理RAM来寻址时,它们可以使用硬盘空间"充当RAM"。这是明显缓慢的,但仍然可以做到。
一般来说,机器可以使用几个级别来访问信息:
- 缓存(最快)
- 闸板
- 硬盘(最慢)
它将在可用时使用最快的资源,但正如您所指出的,有时它需要使用其他资源。
默认情况下,在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 MBn", n / 256);
pause();
}
如果您有足够的交换,但没有足够的RAM,那么此代码将开始对交换文件进行猛烈的抨击。如果交换不足,它可能会在到达终点之前崩溃。
正如其他人所指出的,Linux是一个虚拟内存操作系统,当机器的RAM少于应用程序请求时,它会将磁盘用作后备存储。你可以使用的总空间受到三件事的限制:
- 分配给交换的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
因此,任务似乎没有默认的内存大小限制。