2017-05-03 10:23 GMT+03:00 Павел Борисов via Moscow-pm <[email protected]>:

> И снова дико извиняюсь, но разве free() возвращает память операционке ?
> Нет, если она вызывается непосредственно перед выходом из программы
> (процесса), то конечно, память возвращается ОС, но по ходу выполнения
> процесса free() просто ОСВОБОЖДАЕТ память для повторного использования в
> ЭТОМ же процессе. Поправьте меня, если я не прав...


И правы и неправы. malloc, realloc, free и друзья реализуются на уровне
libc. Вот документация
https://www.gnu.org/software/libc/manual/html_node/Memory-Allocation.html.
До определенного размера память процессу выделяется из "преаллоцированых" у
системы кусков (arenas). Если в такой арене занят хоть один байт, то она не
вернется в систему.

Если говорить про perl, то тут много вариантов. Откройте malloc.c в
исходниках и читайте комменты вначале. Кроме этих опций есть еще опции,
которые совсем отключают собственную реализацию malloc в perl. Не помню
точное название, но что-то вроде MYMALLOC или MALLOC_WRAP.

Есть еще третья сторона: оптимизация выделения памяти под локальные
переменные. Если у вас есть код:

for ( my $i = 0; $i<@_; $i++) {
...
}

то будет глупо выделять каждый раз память для SV IV структуры при каждом
входе в функцию. Для этих переменных есть специальный массив PADLIST и
после окончания блока память не освобождается, а остается зарезервированной
для дальнейшего использования. С IV все просто, но вот с SV PV это значит,
что все что было выделено под PV останется зарезервировано за этой SV и
следовательно функцией. По этому если вы делаете так:

sub foo {
    my $big_data_chunk = shift;
    ...
}

foo("x" x 1000_000);

Чтобы этого избежать вы делаете предварительно:

undef $big_data_chunk;


-- 
Best regards, Ruslan.
-- 
Moscow.pm mailing list
[email protected] | http://moscow.pm.org
              • Re... Павел Борисов via Moscow-pm
              • Re... Denis Evdokimov via Moscow-pm
              • Re... Evgeniy Vansevich via Moscow-pm
              • Re... Илья Винокуров via Moscow-pm
              • Re... Alessandro Gorohovski via Moscow-pm
              • Re... Павел Борисов via Moscow-pm
              • Re... Asyakin Andrey via Moscow-pm
              • Re... Daniel Podolsky via Moscow-pm
              • Re... Илья Винокуров via Moscow-pm
              • Re... Толян II via Moscow-pm
              • Re... Ruslan Zakirov via Moscow-pm
              • Re... Victor Efimov via Moscow-pm
              • Re... Akzhan Abdulin via Moscow-pm
  • Re: [Moscow.pm] Чуток поруг... Александр Фролов via Moscow-pm

Ответить