LINUX.ORG.RU

Выделение памяти в Linux


0

0

Читаем http://mr.himki.net/index-alloc.html Цитата: "Существенно улучшить положение может аллокатор, основанный на mmap (mmap--вызов, выделяющий память отдельной областью, пропорционально размеру страницы, 4096 байт) и на соответствующих алгоритмах размещения переменных в памяти" А теперь, как завещал jackill, смотрим маны. И что мы видим?

MMAP(2) Linux Programmer’s Manual NAME mmap, munmap - map or unmap files or devices into memory

Можете обьяснить, причем сдесь MMAP?

anonymous

> память отдельной областью, пропорционально размеру страницы, 4096 байт)

не обязательно 4K, размер страницы варьируется от архитектуры к архитектуре. на x86 - это действительно 4K.

> Можете обьяснить, причем сдесь MMAP?

читайте внимательнее мануал, mmap также может приатачить кусок памяти к адресному пространству процесса

asgard
()

> Можете обьяснить, причем сдесь MMAP?

Обрати внимание на MAP_ANONYMOUS - он фактически мэпит swap-файл.

tailgunner ★★★★★
()

> Можете обьяснить, причем сдесь MMAP?

MAP_ANONYMOUS

dilmah ★★★★★
()
Ответ на: комментарий от anonymous

это почему не аналог? в результате этого вызова виртуальная память процесса увеличивается на запрошенный размер. это как раз то, что требуется от malloc(грубо говоря)

anonymous
()
Ответ на: комментарий от anonymous

> Спасибо, но ведь мэппинг swap-файла это не аналог malloc...

в ядре есть radix-tree, которым представлена так называемая куча. малок хавает память из этой куче ммапом. захаваный кусок памяти бьётся на куски различного размера в зависимости от алгоритма - это может быть дерево для больших кусков и список для мелких, как это сделано в dougs lea dmalloc'e. суть в общем в том, что память сосётся через всегда через mmap, а малок суть более удобный интерфейс-обёртка для выделения мелких кусков памяти.

asgard
()
Ответ на: комментарий от asgard

Какой mmap? По крайней мере в gnu malloc, используется brk(). Знаю, что в openbsd malloc используется mmap(). Вообще, в UNIX, для выделения памяти всегда использовался brk(), который просто увеличивает "разрешённое" адресное пространство процесса, не более того.

krum
()
Ответ на: комментарий от krum

В ГНУтой libc malloc использует mmap для больших кусков, а для небольших вяжет свой пул, по необходимости используя brk. Увы, на ЦеППшных прогах такое иногда здорово фрагментирует память...

Несколько мес-цев назад тут были разборки про фрагментацию памяти Огнелисом -- пытались БСДшный malloc на линукс портануть.

Die-Hard ★★★★★
()
Ответ на: комментарий от krum

> Какой mmap? По крайней мере в gnu malloc, используется brk().

а если код попробовать посмотреть? используется и то, и другое. так же, как в принципе, и в dmalloc'e

asgard
()
Ответ на: комментарий от krum

> Брррр, при чём тут swap?

При том, что содержимое памяти, выделенной MAP_ANONYMOUS, при вытеснение отправляется в своп.

tailgunner ★★★★★
()
Ответ на: комментарий от Die-Hard

> Несколько мес-цев назад тут были разборки про фрагментацию памяти Огнелисом -- пытались БСДшный malloc на линукс портануть.

Кстати успешно. LD_PRELOAD=/.../libmalloc.so startx , и жизнь сразу становится менее фрагментированной.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.