На заметку Что будет если бесконечно и очень быстро выделять память функцией malloc ?


X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
6 082
Репутация
8 199
Интересный вопрос, что будет происходит внутри системы, при таком выделении ?

Сколько реально можно выделить, что произойдет с системой ?

Ответ:

Пример, есть у нас такой код:
C:
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char const *argv[]) {
    printf("=============== Infinite memory allocator - v1.0.1 ===============\n");
    long long int k = 0;
    while (1) {
        // Creates the zone in memory
        char * mem = malloc(1000000);
        k += 1;
        // Use the zone to prevent bypass by optimization
        mem[0]     = '\0';
        printf("\r[LOG] Allocated %lld", k);
    }
    return 0;
}

После его исполнения, у вас начнется жесткое шуршание диска, все начнет дико тормозить, в общем компьютеру будет очень плохо.Dmeh-Smeh-Smeh!!!

Ну а все-таки, что-же будет дальше...

А дальше вот-что (Пример запускал на линуксе):

1595505512981.png


Параметр VIRT (Виртуальная память) показывает 621 Гигабайт, а-а-а, от куда столько ? Ведь реально памяти всего 4 Гигабайта ?ohmy88wacko88:bagfixbag:

Все очень просто, реально выделяется виртуальная память:


Операционные системы используют виртуальную память, чтобы создать иллюзию для пользователей очень большой памяти. Поэтому при нехватке оперативной памяти, ОС помещает новую выделенную память на жесткий диск.

Но все-таки, от куда 621 Гигабайт, если свап у нас всего 711 мегабайт ?ogo-go

Как это работает, в рамках данного примера:


Сначала создаются наши новые выделенные страницы памяти, непосредственно в оперативной памяти, пока есть достаточно места. В какой-то момент у нас будет мало места в оперативной памяти, поэтому последние недавно использованные страницы (алгоритм LRU) будут перемещены в swap, расположенный на жестком диске, чтобы иметь возможность записать новые выделенные страницы в оперативную память.

Наша выделенная виртуальная память теперь больше оперативной памяти.

Из-за этого получается две проблемы:

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

Новые страницы для записи на диск помещаются в асинхронную в очередь и ожидают когда-же диск их запишет.)

Вот схема работы:

1595506430784.png


Через несколько секунд так много страниц для перемещения на диск, что операционная система будет зависать в ожидании их записи.
В итоге и получается мы создали кучу страниц памяти (В адресном пространстве виртуальной памяти), но записать их не успели.:Mem1:

Это создает отказ в обслуживании !
 
Верх Низ