9. メモリー( The Linux kernelの一部、Andries Brouwer によるLinux Kernel に関するコメント) は、優れたドキュメントです。
これには、Linux の物理メモリと実際のメモリの処理を示し、カーネルの内部構造を説明する次のプログラムが含まれています。
通常、最初のデモ プログラムは、malloc() が NULL を返す前に大量のメモリを取得します。2 番目のデモ プログラムは、以前に取得したメモリが実際に使用されるため、はるかに少ない量のメモリを取得します。3 番目のプログラムは、最初のプログラムと同じ量を取得し、メモリを使用する必要があるときに強制終了されます。
デモ プログラム 1: メモリを使用せずに割り当てます。
#include <stdio.h>
#include <stdlib.h>
int main (void) {
int n = 0;
while (1) {
if (malloc(1<<20) == NULL) {
printf("malloc failure after %d MiB\n", n);
return 0;
}
printf ("got %d MiB\n", ++n);
}
}
デモ プログラム 2: メモリを割り当てて、実際にすべてに触れます。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main (void) {
int n = 0;
char *p;
while (1) {
if ((p = malloc(1<<20)) == NULL) {
printf("malloc failure after %d MiB\n", n);
return 0;
}
memset (p, 0, (1<<20));
printf ("got %d MiB\n", ++n);
}
}
デモ プログラム 3: 最初に割り当て、後で使用します。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 10000
int main (void) {
int i, n = 0;
char *pp[N];
for (n = 0; n < N; n++) {
pp[n] = malloc(1<<20);
if (pp[n] == NULL)
break;
}
printf("malloc failure after %d MiB\n", n);
for (i = 0; i < n; i++) {
memset (pp[i], 0, (1<<20));
printf("%d\n", i+1);
}
return 0;
}
( Solarisのような正常に機能するシステムでは、3 つのデモ プログラムは同じ量のメモリを取得し、クラッシュしませんが、malloc() が NULL を返すことを確認してください。)