Как реализованы malloc и free? - PullRequest
12 голосов
/ 29 июля 2010

Я хочу реализовать свою собственную систему управления динамической памятью, чтобы добавить новые функции, которые помогают управлять памятью в C ++.

Я использую Windows (XP) и Linux (Ubuntu). Что необходимо для реализации таких функций, как «malloc» и «free»? Я думаю, что я должен использовать системные вызовы самого низкого уровня.

Для Windows я нашел функции: GetProcessHeap, HeapAlloc, HeapCreate, HeapDestroy и HeapFree.

Для Linux я не нашел никаких системных вызовов для управления кучей. В Linux malloc и free являются системными вызовами, не так ли?

Спасибо

Edit:
C ++ не предоставляет сборщик мусора и сборщик мусора работает медленно. Некоторые выделения легко освободить, но есть выделения, для которых требуется сборщик мусора.

Я хочу реализовать эти функции и добавить новые функции:
* Всякий раз, когда вызывается free (), проверьте, принадлежит ли указатель к куче.
* Помощь с сборкой мусора. Я должен хранить некоторую информацию о выделенном блоке.
* Используйте несколько куч (HeapCreate / HeapDestroy в Windows). Я могу быстро удалить всю кучу с выделенными блоками.

Ответы [ 6 ]

14 голосов
/ 29 июля 2010

В linux malloc и free не являются системными вызовами.malloc / free получает память от ядра путем расширения и сжатия (если возможно) сегмента данных с помощью системных вызовов brk, а также получения анонимной памяти с помощью mmap - и malloc управляет памятью в этих регионах.Некоторая базовая информация и множество замечательных ссылок можно найти здесь

4 голосов
/ 29 июля 2010

В * nix malloc () реализована на уровне библиотеки C. Он использует brk () / sbrk () для увеличения / уменьшения сегмента данных и mmap / munmap для запроса / освобождения отображений памяти. См. эту страницу для описания реализации malloc, используемой в glibc и uClibc.

4 голосов
/ 29 июля 2010

Если вы просто упаковываете системные вызовы, вы, вероятно, ничего не получите от использования стандартного malloc - вот и все, что они делают.

Это более распространено для malloc (или HeapAlloc () и т. Д.)Блок памяти в начале программы и управляйте выделением в это самостоятельно, это может быть более эффективно, если вы знаете, что собираетесь регулярно создавать / отбрасывать много маленьких блоков памяти.

3 голосов
/ 29 июля 2010

brk - системный вызов, используемый в Linux для реализации malloc и free.Для получения справки обратитесь к справочной странице.

У вас уже есть материал для Windows.

Видя другие ответы здесь, я хотел бы отметить, что вы, вероятно, изобретаете колесо;уже есть много хороших malloc реализаций.Но программирование malloc является хорошим упражнением для размышления - посмотрите здесь для хорошего домашнего задания (первоначально код CMU), реализующего то же самое.Их оболочка дает вам немного больше, чем на самом деле делает ОС Linux: -).

0 голосов
/ 19 марта 2012

Попробуйте http://www.dent.med.uni -muenchen.de / ~ wmglo / malloc-slides.html для указателей.

Это краткое сравнение производительности с указателями на восемь различных реализаций malloc / free. Хорошая отправная точка, потому что несколько хороших справочных статистических данных помогут вам определить, улучшили ли вы доступные реализации или нет.

0 голосов
/ 29 июля 2010

сборщик мусора работает медленно

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

...