Как реализованы malloc и free?

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

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

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

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

Спасибо

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

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


person Squall    schedule 28.07.2010    source источник
comment
Вам следует посмотреть на распределители пула boost: boost.org/ doc / libs / 1_43_0 / libs / pool / doc / index.html   -  person Brendan Long    schedule 29.07.2010
comment
Вы уверены, что HeapAlloc - это системный вызов (ядро)? Они вполне могут быть реализованы на стороне пользователя и запускать некоторые скрытые частные функции на стороне ядра, когда процессу требуется больше памяти.   -  person doron    schedule 29.07.2010
comment
Шквал - это странно звучит как домашний вопрос из формулировки. да? нет?   -  person Paul Nathan    schedule 29.07.2010
comment
Написание кода управления памятью очень нетривиально. Если это домашнее задание, хорошо. Но я не думаю, что стоит тратить свое время, пытаясь написать что-нибудь серьезное для любого приложения, которое вы пишете, если вы еще не очень хорошо разбираетесь в том, как и ОС, и система времени выполнения взаимодействуют с памятью. Но даже в этом случае обычно не стоит прилагать усилия, поскольку как new / malloc, так и хорошо оптимизированы для общего случая и хорошо работают в большинстве ситуаций. Если вы не профилировали использование памяти и не разработали четкий шаблон для оптимизации, вряд ли вы добьетесь большего успеха, чем предусмотрено.   -  person Martin York    schedule 29.07.2010
comment
возможный дубликат Как работают malloc () и free ()?   -  person fredoverflow    schedule 29.09.2012


Ответы (6)


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

person nos    schedule 28.07.2010
comment
На самом деле sbrk - это не системный вызов, а, скорее, библиотечная функция. - person Borealid; 29.07.2010

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

person ninjalj    schedule 28.07.2010

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

Чаще всего выделяют один блок памяти (или HeapAlloc () и т. небольшие блоки памяти регулярно.

person Martin Beckett    schedule 28.07.2010

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

У вас уже есть Windows.

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

person Borealid    schedule 28.07.2010

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

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

person fredoverflow    schedule 29.07.2010
comment
как насчет сборщика мусора обычно медленный - person Chani; 16.03.2012

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

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

person sasguy    schedule 19.03.2012