Подтвердить что ты не робот

Как реализуются malloc и free?

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

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

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

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

Спасибо

Edit:
С++ не обеспечивает сборщик мусора, а сборщик мусора работает медленно. Некоторые ассигнования легко освобождаются, но существуют ассигнования, требующие сборщика мусора.

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

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