Как этой программе удается выделить столько памяти? - PullRequest
3 голосов
/ 17 июня 2020

Мне было любопытно понять, сколько памяти я могу выделить на моем ноутбуке, поэтому я запустил минималистичную программу:

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

int main() {
    int Gb = 0;
    while ( malloc(1<<30) ){
            ++Gb;
            printf("Now allocated %d Gb in total\n", Gb);
    }
}

Она должна выделять 1 ГБ памяти на каждом шаге, пока не появится mallo c терпит неудачу (NULL), заканчивая l oop. С другой стороны, вывод, который я получаю, заканчивается на:

Теперь выделено 131063 ГБ всего

, и это не может быть правдой (у меня 8 ГБ ОЗУ и нет раздела подкачки). Могу я спросить, что я не понимаю?

EDIT: Я забыл упомянуть, я работаю с Linux.

1 Ответ

5 голосов
/ 17 июня 2020

Чудеса виртуальной памяти. Пока вы каким-то образом не инициализируете его, память не должна занимать ОЗУ. Вы получите совсем другой результат, чем

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

int main(void) {
    unsigned num_blocks = 0;
    for (char *p; ( p = malloc(1<<30) ); ) {
       memset(p, 0, 1<<30);  // <-----
       ++num_blocks;
       printf("Now allocated %u GiB in total\n", num_blocks);
    }
}

Выделение большего количества виртуальной памяти, чем у машины физической памяти, известно как чрезмерное выделение памяти .

Есть несколько интересных информация найдена в статье Настройки виртуальной памяти в Linux - Проблема с Overcommit .

...