Освобождение буфера
Если клиент желает освободить буфер, то он вызывает для этой цели процедуру free(), входным аргументом которой является указатель, возвращенный malloc(). При этом нет необходимости уточнять размер буфера. Очевидно, что результатом выполнения операции free() станет освобождение буфера целиком. Технология не поддерживает возможности частичного освобождения участка памяти. Процедура free() производит обращение к заголовку буфера, откуда извлекает указатель на список свободных буферов и затем переносит его в этот список.
Распределитель памяти может быть проинициализирован путем предварительного выделения ему определенного количества буферов в каждом списке. Другой вариант предполагает создание изначально свободного списка, для заполнения которого вызывается распределитель страничного уровня. Если список становится пустым, обработка последующего запроса malloc() для выделения участка памяти определенного размера может быть произведена одним из перечисленных способов:
♦ запрос блокируется до освобождения буфера подходящей длины;
♦ запрос удовлетворяется путем выделения буфера большего размера. Поиск свободного буфера начинается со следующего списка (по возрастанию размеров буферов) и продолжается до тех пор, пока не будет обнаружен непустой список;
♦ происходит запрос дополнительного объема памяти от распределителя страничного уровня. При этом создается нужное количество буферов заданного размера.
Каждый метод обладает определенными достоинствами и недостатками. Наиболее подходящий вариант действий зависит от ситуации. Например, реализация алгоритма на уровне ядра может использовать в запросах на выделение памяти дополнительный аргумент приоритетности. В таком случае распределитель вправе блокировать низкоприоритетные запросы, если в списке не имеется ни одного свободного буфера указанного размера, при этом используя два последних метода для немедленной обработки высокоприоритетных запросов.