Как распределяется память в куче без системного вызова? - PullRequest
0 голосов
/ 04 февраля 2012

Мне было интересно, что, если пространство, требуемое в куче, недостаточно велико, чтобы не требовалась вся система brk / sbrk (для сдвига указателя разрыва (brk) сегмента данных), как работает библиотеканапример, malloc) выделяет место в куче.Я не спрашиваю о структурах данных и алгоритмах управления кучей.Я просто спрашиваю, как malloc получает адрес первого расположения кучи, если он не вызывает системный вызов.Я спрашиваю об этом, потому что слышал, что не всегда необходимо вызывать системный вызов (brk / sbrk), поскольку они необходимы только для расширения пространства. Пожалуйста, исправьте меня, если я ошибаюсь.

Ответы [ 3 ]

3 голосов
/ 04 февраля 2012

Основная идея заключается в том, что при запуске вашей программы куча очень мала, но не обязательно равна нулю.Если вы выделяете (malloc) только небольшой объем памяти, библиотека может обработать ее в пределах небольшого пространства, которое она имеет при загрузке.Однако, когда malloc не хватает этого пространства, он должен сделать системный вызов, чтобы получить больше памяти.

Этот системный вызов часто является sbrk (), который перемещает верхнюю часть области памяти кучи на определенную величину.количество.Обычно процедура библиотеки malloc увеличивает кучу на больше , чем требуется для текущего выделения, в надежде на то, что будущие выделения могут быть выполнены без выполнения системного вызова.

Otherреализации malloc используют взамен mmap () - это позволяет программе создавать разреженное отображение виртуальной памяти.Однако реализации malloc на основе mmap () делают то же самое, что и реализации на основе sbrk (): каждый системный вызов резервирует больше памяти, чем необходимо для текущего вызова.

Один из способов посмотреть на эточтобы отследить программу, которая использует malloc: вы увидите, что для N вызовов malloc вы увидите M системных вызовов (где M намного меньше N).

2 голосов
/ 04 февраля 2012

Короткий ответ - использование sbrk () для выделения большого фрагмента, который на данный момент принадлежит процессу вашего приложения. Затем он может дополнительно разделить части этого как отдельные вызовы malloc без необходимости запрашивать у системы что-либо, пока он не исчерпает это пространство и не будет вынужден снова использовать sbrk ().

Вы сказали, что вам не нужны подробности о структурах данных, но достаточно сказать, что реализация malloc (т.е. ваш собственный процесс, а не ядро ​​ОС) отслеживает, из какого пространства в регионе он получил о системе говорят, и которая все еще доступна для раздачи в виде отдельных malloc. Это все равно, что купить большой участок земли, а затем разделить его на участки для индивидуальных домов.

0 голосов
/ 04 февраля 2012

Используйте sbrk () или mmap () - http://linux.die.net/man/2/sbrk, http://linux.die.net/man/2/mmap

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