Несмотря на то, что ОС обычно реализует таблицы страниц, более простое решение может выглядеть примерно так:
Имеет большую непрерывную память в виде массива.Когда вы выделяете некоторую память, сохраняйте эту информацию в связанном списке, сохраняя индекс массива и длину в части данных.
При создании связанного списка убедитесь, что он отсортирован по индексу.
Если вы хотите выделить память, отсканируйте связанный список, и это займет O (N).где N - уже выполненные распределения.
При удалении будет сканироваться массив для поиска определенного индекса и удаляться узел в связанном списке.
После удаления узла создайте отдельный связанный список, содержащийэти бесплатные выделения.
Вставка будет выглядеть следующим образом.1. Проверьте в свободном списке, есть ли элемент в списке запрашиваемого размера.2. Если нет, выделите память после последнего элемента связанного списка
Удаление будет работать следующим образом: 1. Переместите узел в свободный список.
Убедитесь, что свободный список и связанный списокотсортировано по индексу.
Этот подход не решает проблему фрагментации в распределителях памяти. Одним из простых способов является использование сжатия.Регулярно сканируйте связанный список свободных узлов и для каждого элемента перемещайте элементы в массиве и соответствующим образом обновляйте индекс узла в связанном списке.