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 が少ない場合、ディスクをバッキング ストアとして使用します。使用できる合計スペースは、次の 3 つの条件によって制限されます。
- スワップに割り当てられた RAM とディスクの合計量
- 仮想アドレス空間のサイズ
- によって課されるリソース制限
ulimit
32 ビット Linux では、OS が各タスクに 3GB の仮想アドレス空間を割り当てます。64 ビット Linux では、その数は数百テラバイトだと思います。ただし、デフォルト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
そのため、タスクのデフォルトのメモリ サイズ制限はないようです。