Физическая память разделяется на регионы. Регион - это непрерывная область памяти, имеющая начало, длину, атрибуты, имя (не обязательно) и счетчик ссылок. Атрибутов два - "зарезервирован" и "разделяемый". Если установлен "зарезервирован", менеджер не выдаст этот регион при обычном запросе на память. Ядро поддерживает два списка регионов: свободные (со счетчиком ссылок = 0) и занятые (со счетчиком ссылок > 0).
Процесс может запросить регион указанной длины по любому адресу (обычный способ), или регион указанной длины по указанному адресу (для зарезервированных регионов). Такой способ может использоваться, например, для видеопамяти. При выделении региона счетчик ссылок увеличивается. Если при этом он был в списке свободных регионов - он переносится в список занятых регионов (возможно с отрезанием необходимой части). При освобождении региона счетчик ссылок уменьшается, когда он достигает 0 - регион переносится в список свободных, если позволяют флаги - объединяется с соседними, чтобы не фрагментировать память. Освободить регион можно только целиком.
Регионы могут быть разделяемыми. Есть два типа разделения регионов: [*]С помощью флага "разделяемый", при установленном имени. Любой процесс может запросить такой регион, но получит доступ только для чтения. Такое разделение будет использоваться при разделении библиотек в памяти. [*]Передача от владельца. При таком разделении, процесс-владелец региона разрешает процессу-получателю региона подключить регион к себе (для записи или только для чтения), и передает ему идентификатор региона через другие средства IPC. Так же применим к регионам 1 типа, если необходимо получить доступ для записи. Такое разделение может использоваться, например, в графическом сервере.
|