Почему этот пожиратель памяти действительно не ест память?

Я хочу создать программу, которая будет имитировать ситуацию нехватки памяти (OOM) на сервере Unix. Я создал этот супер-простой едок памяти:

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

unsigned long long memory_to_eat = 1024 * 50000;
size_t eaten_memory = 0;
void *memory = NULL;

int eat_kilobyte()
{
    memory = realloc(memory, (eaten_memory * 1024) + 1024);
    if (memory == NULL)
    {
        // realloc failed here - we probably can't allocate more memory for whatever reason
        return 1;
    }
    else
    {
        eaten_memory++;
        return 0;
    }
}

int main(int argc, char **argv)
{
    printf("I will try to eat %i kb of ram\n", memory_to_eat);
    int megabyte = 0;
    while (memory_to_eat > 0)
    {
        memory_to_eat--;
        if (eat_kilobyte())
        {
            printf("Failed to allocate more memory! Stucked at %i kb :(\n", eaten_memory);
            return 200;
        }
        if (megabyte++ >= 1024)
        {
            printf("Eaten 1 MB of ram\n");
            megabyte = 0;
        }
    }
    printf("Successfully eaten requested memory!\n");
    free(memory);
    return 0;
}

Он ест столько памяти, сколько определено вmemory_to_eat который сейчас составляет ровно 50 ГБ оперативной памяти. Он распределяет память на 1 МБ и печатает точно точку, в которой он не может выделить больше, так что я знаю, какое максимальное значение ему удалось съесть.

Проблема в том, что это работает. Даже в системе с 1 ГБ физической памяти.

Когда я проверяю top, я вижу, что процесс потребляет 50 ГБ виртуальной памяти и только менее 1 МБ резидентной памяти. Есть ли способ создать пожиратель памяти, который действительно потребляет его?

Технические характеристики системы: ядро ​​Linux 3.16 (Debian) скорее всего с включенным overcommit (не знаю, как это проверить) без подкачки и виртуализации.

Ответы на вопрос(1)

Ваш ответ на вопрос