Я хочу реализовать свою собственную систему управления динамической памятью для добавления новых опций, которые помогают управлять памятью в C++.
Я использую Windows (XP) и Linux (Ubuntu). Что необходимо для реализации функций как 'malloc' и 'свободный'? Я думаю, что должен использовать самые низкие системные вызовы уровня.
Для Windows я нашел функции: GetProcessHeap, HeapAlloc, HeapCreate, HeapDestroy и HeapFree.
Для Linux я не нашел системных вызовов управления "кучей". На Linux, malloc и свободный системные вызовы, не так ли?
Спасибо
Править:
C++ не предоставляет сборщик "мусора", и сборщик "мусора" является медленным. Некоторые выделения легки к свободному, но существуют выделения, которому нужен сборщик "мусора".
Я хочу реализовать эти функции и добавить новые опции:
* Каждый раз, когда свободный () быть названными, проверьте, принадлежит ли указатель "куче".
* Справка со сборкой "мусора". Я должен хранить некоторую информацию о выделенном блоке.
* Использование несколько "кучи" (HeapCreate/HeapDestroy в Windows). Я могу удалить всю "кучу" с ее выделенными блоками быстро.
В linux malloc и free не являются системными вызовами. malloc/free получает память от ядра, расширяя и сжимая (если может) сегмент данных с помощью системных вызовов brk
, а также получая анонимную память с помощью mmap
- и malloc управляет памятью в этих регионах. Некоторую базовую информацию и множество отличных ссылок можно найти здесь
В * nix функция malloc () реализована на уровне библиотеки C. Он использует brk () / sbrk () для увеличения / сжатия сегмента данных и mmap / munmap для запроса / освобождения сопоставлений памяти. См. на этой странице описание реализации malloc, используемой в glibc и uClibc.
Сборщик мусора работает медленно
Это совершенно бессмысленное утверждение. Во многих практических ситуациях программы могут значительно повысить производительность с помощью сборщика мусора, особенно в многопоточных сценариях. Во многих других ситуациях сборщики мусора снижают производительность.
Если вы просто оборачиваете системные вызовы, то вы, вероятно, ничего не выигрываете по сравнению с использованием стандартного malloc - это все, что они делают.
Более распространенным является использование malloc (или HeapAlloc() и т.д.) одного блока памяти в начале программы и управление распределением в нем самостоятельно. Это может быть более эффективным, если вы знаете, что будете регулярно создавать/отнимать много маленьких блоков памяти.
brk
- это системный вызов, используемый в Linux для реализации malloc
и free
. Для получения информации обратитесь к странице руководства.
У вас уже есть Windows.
Увидев здесь другие ответы, я хотел бы отметить, что вы, вероятно, изобретаете велосипед заново; уже существует множество хороших реализаций malloc
. Но программирование malloc
- хорошее упражнение для размышлений - посмотрите здесь , чтобы найти хорошее домашнее задание (первоначально код CMU), реализующее то же самое. Однако их оболочка дает вам немного больше, чем на самом деле ОС Linux :-).