2012-04-04 6 views
5

Да, я беру курс компьютерных систем. У меня было несколько вопросов о различных схемах распределения для реализации malloc. Для явных списков, если я реализую malloc с помощью LIFO-подобного стека, какова именно цель иметь указатели на предыдущую освобожденную память? Например, почему вам нужны дважды связанные списки? Не будут ли одинаковые списки ссылок работать так же хорошо?Схемы распределения Malloc

Malloc lecture. Я нашел эту ссылку в Интернете, вы можете посмотреть слайд 7, чтобы узнать, о чем я говорю.

При взгляде на схему распределения разделенных списков эти списки однонаправленны правильно? А также, что такое механизм коалесценции? Как, например, если 4 слова освобождены, вы бы сначала попытались присоединиться к нему, когда свободное пространство вокруг вас, прежде чем вставлять его обратно в соответствующий выделенный список? Или вы просто введете блок из 4 слов в разделе «4 слова» соответствующего отдельного связанного списка?

спасибо.

ответ

4

Так как у освобожденного блока всегда есть место для двух указателей, почему бы не удвоить ссылку? Он упрощает коаксиальный код, поэтому при перемещении списка ему не нужно поддерживать трейлинг-указатель. Он также позволяет перемещать список в любом направлении в случае, если есть подсказка, для которой конец списка может быть ближе для начала поиска. Одна неясная система, которую я когда-то смотрел, содержала указатель в «середине», где происходило последнее действие.

При освобождении блока. Есть только четыре возможных случая:

  • Свободный блок примыкает после свободный блок.
  • Свободный блок находится рядом до свободный блок.
  • Свободный блок находится между и свободными блоками до и после него.
  • Свободный блок не находится рядом с любым свободным блоком.

Цели коалесценции соседних свободных блоков являются:

  • уменьшить длину связанного списка
  • точно отражает размер свободного блока, не обременяя аллокатора смотреть вперед, чтобы увидеть если два блока смежны

Сортировка свободного блока в конкретный вариант freelist часто имеет преимущества, но в большинстве практических реализаций коалесцирование является приоритетом, так что alloc() запрос на блок разного размера не будет отклонён, если есть много разных блоков разного размера.

+0

Я думаю, что я вижу, что вы говорите, но можете ли вы подробнее рассказать о том, что вам не нужно поддерживать трейлинг-указатель? Кроме того, если я называю свободный блок B. Предположим ли мы, что B-> next-> prev = B? Потому что, если это не так, я не вижу, как помогут двунаправленные списки. Кроме того, что было бы лучшим способом инициализации кучи в разделительном распределителе списков? Разделите ли вы страницу в каком-то шаблоне? (Как дать 64 бесплатных блоков из 2-х слов, 64 свободных блоков из 4-х слов, 64 свободных блока из 8 слов ... пока вы не нажмете обозначенную категорию бесконечности? Или есть лучший способ инициализации? – de1337ed

+0

@ de1337ed: Возможно, у вас есть не написал какой-либо код обработки списка узлов? Дайте ему завихрение: напишите функцию, которая вставляет узел в связанный список.Сохраните список в адресе = отсортированный порядок. Попробуйте это с помощью одной ссылки. А затем измените его на двойную связь. (Чтобы ответить на ваш вопрос 'B-> next-> prev', всегда * B. Если это не так, появляется ошибка.) Инициализация кучи зависит от политических решений исполнителя: должна ли быть куча 512-байтовые блоки готовы к работе? Зависит от системы. – wallyk