Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

Глава 14. Управление памятью и b-деревья

В алгоритме сборки мусора зачистки отметки мы связываем бит «отметки» с каждым объектом, который определяет, жив ли тот объект или нет. Когда мы решаем, в некоторый момент, что сборка мусора необходима, мы приостанавливаем все другие бегущие нити и очищаем части отметки всех объектов, в настоящее время ассигнуемых в куче памяти. Мы тогда прослеживаем через стек требования в настоящее время бегущей программы, и мы отмечаем весь (корень) объекты в этом стеке как «живой». Мы должны тогда определить все другие живые объекты - те, которые достижимы от объектов корня. Чтобы сделать этот effi-ciently, мы можем использовать версию направленного графа глубины, сначала ищут пересечение (Раздел 13.3.1). В этом случае каждый объект в куче памяти рассматривается как вершина в направленном графе, и ссылка от одного объекта до другого рассматривается как край di - rected. Выполняя направленный DFS от каждого объекта корня, мы можем правильно определить и отметить каждый живой объект. Этот процесс известен как фаза «отметки». Как только этот процесс закончил, мы тогда просматриваем через кучу памяти, и пере - требуют любого пространства, которое используется для объекта, который не был отмечен. В это время мы можем также произвольно соединиться все выделенное место в куче памяти в единственный блок, таким образом устранив внешнюю фрагментацию в настоящее время. Этот процесс просмотра и восстановления известен как фаза «зачистки», и когда это заканчивает, мы продолжаем управлять приостановленными нитями. Таким образом алгоритм сборки мусора зачистки отметки исправит неиспользуемое место, вовремя пропорциональное числу живых объектов и их ссылок плюс размер кучи памяти.

Выполнение оперативный DFS

Алгоритм зачистки отметки правильно исправляет неиспользуемое место в куче памяти,

но есть важная проблема, с которой мы должны столкнуться во время фазы отметки. Так как мы исправляем место в памяти в то время, когда доступная память недостаточна, мы должны заботиться, чтобы не использовать дополнительное пространство во время самой сборки мусора. Проблема состоит в том, что алгоритм DFS, рекурсивным способом, которым мы описали его в Разделе 13.3.1, может использовать пространство, пропорциональное числу вершин в графе. В случае сборки мусора вершины в нашем графе - объекты в куче памяти; следовательно, у нас, вероятно, нет этой большой памяти использованию. Мы хотим способ выступить DFS оперативный, использующий только постоянную сумму дополнительного хранения.

Главная идея для выполнения оперативного DFS состоит в том, чтобы моделировать стек рекурсии, используя края графа (который, в случае сборки мусора, соответствует объектным ссылкам). Когда мы пересекаем край от посещаемой вершины v к новой вершине w, мы изменяем край (v, w) сохраненный в списке смежности v, чтобы указать назад родителю v в дереве DFS. Когда мы возвращаемся назад к v (моделирующий возвращение из «рекурсивного» требования в w), мы можем теперь переключить край, который мы изменили, чтобы указать назад на w. Конечно, у нас должен быть некоторый способ определить, какой край мы должны изменить назад. Одна возможность состоит в том, чтобы пронумеровать ссылки, выходящие v как 1, 2, и так далее, и магазин, в дополнение к отметке укусил (который мы используем для «посещаемого» признака в нашем DFS), идентификатор количества, который говорит нам, какие края мы изменили.