double arrow

Занятие 17. Реализация динамического управления памятью в Linux и Windows

План занятия:

  • Распределение физической памяти ядром
  • Кэши объектов и их виды
  • Кусковые блоки
  • Системные пулы памяти ядра
  • Списки предыстории
  • Динамические участки памяти Windows

Распределение физической памяти ядром

Для динамического распределения крупных блоков физической памяти (по размеру кратных фрейма) в Linux используют систему двойников. Использование таких блоков позволяет снизить необходимость модификации таблиц страниц во время работы приложения, а это, в свою очередь, снижает вероятность очистки кэша трансляции. Алгоритм двойников не подходит для распределения блоков памяти произвольного размера, поскольку минимальный объем памяти, который он может выделить или освободить, составляет один фрейм (4 Кбайт), что вызывает значительную внутреннюю фрагментацию.

Для распределения памяти под отдельные объекты применяют кусковый распределитель (slab allocator). При его разработке пытаются организовать кэширование часто используемых объектов ядра в инициализированном состоянии (поскольку большая часть времени при размещении объекта тратится на его инициализацию, а не на само выделение памяти), а также выделение памяти блоками малого размера без внутренней фрагментации, свойственной алгоритмам системы двойников.

Кэши объектов и их виды

Структура данных кускового распределителя состоит из переменного количества кэшей объектов, объединенных в двусвязный циклический список, называемый цепочкой кэшей. Каждый такой кэш отвечает за распределение объектов конкретного типа или конкретного размера.

Различают два вида кэшей объектов:

  • Специализированные кэши, которые создают различные компоненты ядра системы для хранения объектов конкретного типа. Для таких кэшей обычно задают конструктор и деструктор, а также уникальное имя, которое зависит от типа объекта. Под конструктором понимают функцию, которую вызывают во время инициализации объектов этого типа, под деструктором - функцию, которую вызывают при высвобождении памяти из под объекта.
  • Кеши общего назначения, используемые для хранения блоков памяти произвольного назначения конкретного размера. Есть кэши для блоков размером от 25 = 32 бит до 217 - 13 1072 бит, их называют size-N (N - размер блока кэша в байтах, например, size-128).

Кусковые блоки

Память для кэша хранят в виде кусковых блоков (slabs). Кусковой блок состоит из одного или нескольких непрерывно расположенных фреймов памяти, разделенных на фрагменты памяти (chunks) одного размера, которые содержат объекты. Размер фрагмента памяти зависит от типа кэша, для которого выделяют кусковый блок (он равен размеру объекта, экземпляры которого нужно распределять с помощью этого кэша). Использование таких блоков для распределения памяти снижает как внешнюю, так и внутреннюю фрагментацию.

Системные пулы памяти ядра

Различают невыгружаемые (nonpaged) и выгружаемые (paged) системные пулы памяти. Оба вида пулов находятся в системной области памяти и отражаются в адресное пространство любого процесса.

  1. Невыгружаемый содержит диапазоны адресов, которые всегда соответствуют физической памяти, поэтому доступ к ним никогда не вызывает страничного прерывания.
  2. Выгружаемый соответствует памяти, страницы которой могут быть выгружены па диск.

Оба вида системных пулов можно использовать для выделения блоков памяти произвольного заранее неизвестного размера.

Списки предыстории

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

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

Динамические участки памяти Windows

В Windows, как и в Linux, каждый процесс имеет доступ к специальной области памяти. Ее также называют динамическим участком памяти или кучей (heap). Особенностью Windows является то, что таких динамических участков для процесса может быть создано несколько, и внутри каждой из них, распределитель памяти может отдельно выделять блоки меньшего размера.

Распределитель памяти в Windows называют, менеджером динамических участков памяти (heap manager). Этот менеджер позволяет процессам распределять память блоками произвольного размера, а не только кратными размеру страницы.

Каждый процесс запускают с динамическим участком по умолчанию, размер которого составляет 1 Мбайт (при компоновке программы этот размер может быть изменен).



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



Сейчас читают про: