Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 700363.doc
Скачиваний:
16
Добавлен:
01.05.2022
Размер:
3.69 Mб
Скачать

Алгоритм выделения блоков памяти одинакового размера

Если память всегда запрашивается блоками одинакового размера, то может быть построен очень алгоритм динамического распределения памяти. В качестве примера рассмотрим реализацию такого алгоритма средствами C++.

В практике программирования часто встречается задача, требующая динамического создания и удаления большого числа объектов одинакового размера. Это могут быть, например, записи в базе данных, элементы списков, очередей, бинарных деревьев.

Для реализации собственного алгоритма распределения памяти для таких объектов проще всего воспользоваться возможностью переопределения операторов new и delete для конкретного класса, которая предоставляется компиляторами C++.

Далее приводится исходный код простого С++ класса, самостоятельно управляющего распределением памяти для хранения своих экземпляров.

class memory_allocator { public: // оператор new получает размер блока, //запрошенного для выделения void* operator new(size_t size); // оператор delete получает // адрес освобождаемого блока памяти void operator delete(void* addr); private: // указатель на следующий свободный участок памяти memory_allocator *next; // голова списка свободных блоков static memory_allocator *fist_free; }; // первоначально список свободных блоков пуст memory_allocator* memory_allocator::fist_free = NULL; // реализация оператора new void* memory_allocator::operator new(size_t size) { // если есть элементы в списке свободных блоков, // то используем первый элемент из списка if (fist_free) { memory_allocator *p = fist_free; fist_free = fist_free->next; return p; } // если список свободных блоков пуст, //то выделяем новый блок из кучи return ::operator new(size); } // реализация оператора delete void memory_allocator::operator delete(void* addr) { // включаем освобожденный блок // в список свободных блоков ((memory_allocator*)addr)->next = fist_free; fist_free = (memory_allocator*)addr;

}

Измерения, выполненные с данным кодом на компиляторах Microsoft Visual C++ и Intel, показали, что скорость операций с памятью для данного возрастает более чем в два раза, по сравнению с использованием стандартных операторов new и delete.

Заключение

Управление ресурсами является важнейшей функцией многозадачной операционной системы и является основой для создания среды выполнения программ – виртуальной машины, создаваемой операционной системой для прикладных программ, которая изолирует программы друг от друга и от особенностей аппаратной реализации компьютера, делая программы переносимыми и совместимыми с большим парком компьютеров (однотипных, но не одинаковых!). Подсистемы управления процессорами и памятью являются частью системы управления ресурсами операционной системы. Эти подсистемы в значительной степени определяют производительность и стабильность работы компьютера. Подсистема управления процессорами также определяет предметную ориентацию операционной системы: система реального времени, вычислительный сервер, интерактивная система и т.п.