В качестве упражнения я пишу менеджер памяти, то есть код, реализующий malloc, realloc и free (или new и delete). RTL для моего языка Delphi позволяет легко заменить диспетчер памяти RTL. Для тех из вас, кто использует C ++, это похоже на переопределение new и delete, но на более низком уровне (он подключается к самому RTL, а не является функцией языка). Я ищу ресурсы о высококачественных подходах, которые есть у других. взяли на себя ту же проблему.
Я знаю несколько алгоритмов и реализаций управления памятью, включая FastMM4 (довольно сложный), Распределитель Дуга Ли, Buddy, JeMalloc, TcMalloc и Клад. Я ищу информацию о следующем:
Известные рекомендуемые алгоритмы: какие еще были опубликованы высококачественные алгоритмы, помимо вышеперечисленных?
Существуют ли специальные алгоритмы, предназначенные для многопоточных приложений? То есть там, где может быть высокая конкуренция потоков в любых заблокированных точках для выделения или освобождения, и где память может быть выделена в одном потоке, но освобождена в другом нить? Большинство алгоритмов - за заметными исключениями Hoard, JeMalloc и TcMalloc - похоже, предназначены для однопоточной работы, а осведомленность о потоках - это только безопасность потоков, поскольку в соответствующих точках есть блокировки или другая синхронизация - без особого дизайна.
Что используют основные поставщики? Хотя Delphi и C ++ Builder задокументированы , Я не могу найти никакой информации о реализациях, используемых MS VC ++, .Net или Objective C. (Кажется, вся документация более высокого уровня, например
NSAutoReleasePool
. Linux, похоже, использует Buddy.) Эти поставщики, похоже, не позволяют подключать свои RTL, как это делает Delphi. Мне было бы очень интересно прочитать об их реализациях.