Какие алгоритмы управления памятью используются основными поставщиками компиляторов?

Это подмножество a предыдущий вопрос.

В качестве упражнения я пишу диспетчер памяти, то есть код, реализующий malloc, realloc и free (или new и delete). RTL для моего языка, Delphi, позволяет легко заменить диспетчер памяти RTL. Для тех из вас, кто использует C++, это похоже на переопределение new и delete, но на более низком уровне (это связано с самим RTL, а не с языковой функцией).

Я ищу ресурсы о высококачественных подходах, которые другие использовали для решения той же проблемы, и пытаюсь выяснить, какие алгоритмы используют другие крупные поставщики компиляторов. В то время как Delphi хорошо документирован, я не могу найти никакой информации о реализациях, используемых MS VC++, .Net или Objective C. Эти поставщики, кажется (?), не позволяют подключать их RTL, как это делает Delphi. Вся документация кажется высокоуровневой, например NSAutoReleasePool для выбора случайного примера - слишком высокоуровневой для этого вопроса.

Какие алгоритмы управления памятью используют основные поставщики (Microsoft VC++ и .Net и Apple Objective C) в своих библиотеках времени выполнения?

Примером отличного ответа может быть документ, описывающий реализацию диспетчера памяти, например эту или ссылку на опубликованную статью. Примером полезного ответа может быть алгоритм «Среда выполнения VC++ использует распределитель Hoard'.


person David    schedule 30.04.2013    source источник
comment
Вау... но управление памятью такое сложное чудовище - оно распространено на многих-многих-многих уровнях. Например, с Delphi: FastMM4 реализует три алгоритма в зависимости от размера блока. Но поверх него есть RTL, реализующий управление памятью copy-on-write + refcounting для dyn-массивов и строк. Затем есть классы-контейнеры TComponent и TObjectList, реализующие алгоритм Owner-Items, затем есть TInterfaceObject, снова приходящий к подсчету ссылок... И все эти алгоритмы управления памятью ARE. И все эти алгоритмы вместе реализуют СТРАТЕГИЮ данного HMMgr+Language+RTL   -  person Arioch 'The    schedule 30.04.2013
comment
+1, это довольно интересный вопрос, хотя бы в академических целях :-)   -  person Guillem Vicens    schedule 30.04.2013
comment
С языками на основе GC, такими как .Net, JVM и снова ObjC, в диспетчере памяти будут разные ожидания и разные алгоритмы, в зависимости от того, какую информацию может (или не может) диспетчер памяти надежно получить из языка. Просто прочитайте содержимое en.wikipedia.org/wiki/Garbage_collection_(computer_science).   -  person Arioch 'The    schedule 30.04.2013
comment
Хотя это хорошо заданный вопрос, он слишком широк, чтобы на него можно было ответить здесь, и было бы практически невозможно опубликовать один ответ, который касается всего, что вы спрашиваете. Извините, но по этой причине я должен проголосовать, чтобы закрыть этот вопрос как ненастоящий.   -  person Ken White    schedule 30.04.2013
comment
Почему бы вам просто не прочитать исходный код для каждой из этих сред выполнения?   -  person David Heffernan    schedule 30.04.2013
comment
@DavidHeffernan, среды выполнения VC++, .Net и (я думаю) Objective-C имеют закрытый исходный код.   -  person David    schedule 30.04.2013
comment
У меня есть исходный код для MSVCRT, который находится прямо здесь. Я полагаю, что исходный код среды выполнения ObjC также доступен (opensource.apple.com/source/objc4). И вот эталонная реализация среды выполнения .net.   -  person David Heffernan    schedule 30.04.2013
comment
@KenWhite: почему? Почему никто не может ответить «VC++: использует Foo» (ссылка). .Net: использует Bar (ссылка). ...'? По крайней мере, кто-то может знать один из трех, и, поскольку это совместный сайт, к ответу могут быть добавлены другие ответы.   -  person David    schedule 30.04.2013
comment
@DavidM Вы захотите задать более целенаправленный вопрос. Так как вопрос чисто про VC++. Затем спросите одного о другом окружении. Эти узконаправленные вопросы по теме.   -  person David Heffernan    schedule 30.04.2013
comment
@DavidHeffernan: да? Не могли бы вы дать ссылки на них, пожалуйста? Я не знал, что доступна среда выполнения VC или что существует эталонная реализация .Net с открытым исходным кодом. (Однако это то же самое, что и обычная реализация? Диспетчер памяти — это то, что может иметь «правильную» и «оптимизированную» версии.)   -  person David    schedule 30.04.2013
comment
Исходный код MSVCRT поставляется с VS. Я добавил ссылку на ObjC. Что касается .net, вы правы, эталонная реализация, скорее всего, отличается от реального продукта. Но для .net это сильно усложняется сборщиком мусора. Теперь GC стоит на вершине кучи. Это огромная тема. Единого алгоритма нет. Я верю, что вы просите слишком много. Сконцентрируйтесь на одной среде. Выбирайте самое простое!   -  person David Heffernan    schedule 30.04.2013
comment
Интересный вопрос, мне жаль, когда я вижу, что теоретические вопросы закрываются по надуманным причинам.   -  person OnTheFly    schedule 30.04.2013
comment
@DavidHeffernan Спасибо за ссылку, похоже, что для Obj-C, по крайней мере, я могу изучить источник и ответить на эту часть через некоторое время. Что касается MSVC, у меня нет копии, поэтому, вероятно, я не могу изучить источник. RE .Net - да, GC усложнит, хотя под капотом все равно будет алгоритм разбиения памяти, выделения с мест, обработки свободных мест и т.д... Не хочу "выбирать самое простое", т.к. Мне интересно учиться не на простоте, а на том, что есть на самом деле. Меня очень интересуют фактические реализации, которые использует каждый поставщик.   -  person David    schedule 02.05.2013
comment
Вы выбираете самый простой, чтобы задать один вопрос. Задавать вопрос о чрезвычайно сложных деталях реализации 4 различных платформ здесь неуместно. Вот почему его закрыли. Просто подождите и посмотрите, сколько действительно хороших ответов вы получите, охватывающих все 4 платформы.   -  person David Heffernan    schedule 02.05.2013


Ответы (1)


Objective-C использует автоматический подсчет ссылок (ARC). Он включен с iOS5. Apple имеет патент США 20030196063 «Прозрачная локальная и распределенная система управления памятью».

Java использует сложную схему сборки мусора, которая развивалась на протяжении многих лет. См. «Настройка сборки мусора с помощью виртуальной машины Java[tm] 5.0» http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html

person Richard Wеrеzaк    schedule 14.05.2013
comment
Вы описываете здесь управление временем жизни объекта, а не выделение памяти. Выделение памяти является низкоуровневым — это код, который запускается для выделения памяти, например, при создании объекта. - person David; 14.10.2015