LinuxではメモリはCOWになっている(今更)

んだなぁ,と試してて思った。

以下のようなプログラムだとすぐメモリがあふれて死にそう(というか OOM Killer にやられる) な気がするけど実際そうならない。

#include <stdlib.h>
#include <stdio.h>

#include <unistd.h>

int main(void) {
    size_t alloc = 0;
    for (;;) {
        char *mem = malloc(1024 * 1024 * 1024);
        ++alloc;
        printf("%zd GiB allocated\n", alloc);
        sleep(1);
    }
}

で,実行して top で見てみてもメモリ使用量はいっこうに増えない。

これを下のように編集すると状況が変わって,リアルにメモリを食い始める。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include <unistd.h>

int main(void) {
    size_t alloc = 0;
    for (;;) {
        char *mem = malloc(1024 * 1024 * 1024);
        memset(mem, 0, 1024 * 1024 * 1024);

        ++alloc;
        printf("%zd GiB allocated\n", alloc);
        sleep(1);
    }
}