[Moscow.pm] Чуток поругал перл

Ruslan Zakirov ruslan.zakirov на gmail.com
Пт Май 5 09:06:42 PDT 2017


2017-05-03 10:23 GMT+03:00 Павел Борисов via Moscow-pm <moscow-pm на pm.org>:

> И снова дико извиняюсь, но разве 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.
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20170505/549eb493/attachment-0001.html>


Подробная информация о списке рассылки Moscow-pm