Skip to content

Latest commit

 

History

History
40 lines (34 loc) · 3.31 KB

Memory_Pymalloc.md

File metadata and controls

40 lines (34 loc) · 3.31 KB

Внутреннее устройство памяти Python. Механизм pymalloc


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

Распределитель памяти Python, называемый pymalloc - суть его работы следующая, pymalloc выделяет память не по кусочку на текущие требования, а большим куском в 256 кб и этот кусок памяти называется Ареной, далее каждая такая Арена делится на кусочки по 4 кб, эти кусочки по 4 кб называются pool(пулами).

Далее каждый pool делится на блоки различной длинны, их длины могут быть различны, каждый такой блок выделяется под хранение конкретного обьекта.

Есть специальный связанный список usedpools который хранит в себе все пулы с блоками различных размеров, когда мы создаем обьект то происходит поиск в блоках этих пулов, и если есть блок нужного размера то обьект помещается в него.

Если нужного пула разбитого на нужные блоки не находится в списке usedpools то требуется найти свободный пул, то происходит поиск в свободных пулах, что хранятся в списке freepools если он есть, то берем его из списка свободных пулов, если его нет то берется Арена, и из нее выделяется кусочек для нового свободного пула, если в Арене нет места то выделяется новая Арена.

Когда на обьект удаляется последняя ссылка, то обьект удаляется при помощи сборщика мусора, когда обьект удален его блок освобождается и помещается в пулл.