mrjbom
@mrjbom

Как использовать двусвязный список в Buddy аллокаторе?

Предположим имеется такая схема памяти с точки зрения аллокатора:
|    1     |
| 2  || 3  |
|4||5||6||7|

В основном, для учёта блоков используется битовая карта.
Для быстрого нахождения свободного блока используется двусвязный список.
И я предполагаю, что у нас есть три двусвязных списка, содержащие индексы свободных блоков каждого размера.
В этом случае, при выделении блока 2, следует удалить блоки 4 и 5 из двусвязного списка, но проблема в том, что порядок элементов в списке может быть произвольным, 4 и 5 не обязательно будут идти в начале. (Да и даже если бы они шли в правильном порядке, то пришлось бы каждый раз перебирать элементы списка, прежде чем были бы найдены элементы ответственные за 4 и 5).
Так как же организовать работу с двусвязным списком что-бы избежать проблемы при удалении дочерних блоков из списка при выделении их отца?
  • Вопрос задан
  • 72 просмотра
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
И пофигу на порядок. Пусть он в списках будет произвольный. При выделении блока просто берете первый из списка, удаляете оттуда и выдаете. При освобождении блока пихаете его в список куда угодно.

Только надо поддерживать еще указатели на buddy. Т.е. тут что-то вроде трех-связного списка будет. При освобождении бока, если видите, что его buddy свободен, то удаляете его их обоих из списка и "освобождаете" удвоенный кусок.

Можно это в массиве делать и хранить указатели вперед-назад в двух элементах под двух buddy. У вас в списке же только один из парочки всегда может быть.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы