Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АОПИ. Старое / АОПИ. Глава 3. Конспекты (06_06_19).rtf
Скачиваний:
62
Добавлен:
10.09.2019
Размер:
201.15 Кб
Скачать

§3. Дискретное распределение виртуальной памяти.

Дискретное распределение памяти — распределение памяти, при котором задаче может предоставляться не одна сплошная область памяти, а ряд дискретных областей.

Такое выделение памяти требует поддержки относительной адресации. При такой адресации указываются:

1. Адрес начала текущего фрагмента программы;

2. Смещение относительно этого начального адреса.

Эти два значения и составляют виртуальный адрес при относительной адресации.

По аналогии можно рассмотреть функцию

int fseek(FILE *stream, long offset, int origin);

которая устанавливает указатель положения в файле, связанном со stream, в соответ­ствии со значениями offset и origin. Аргумент offset — это выраженный в байтах сдвиг от позиции, определяемой origin, до новой позиции. Аргумент origin может принимать значения 0, 1 или 2, причем 0 означает начало файла, 1 — текущую позицию, а 2 — конец файла. В случае успеха fseek() возвращает 0. Ненулевое значение означает неудачу. С помощью fseek() можно переместить указатель положения в любую точку внутри файла и даже за его пределы после конца файла. Однако попытка установить указатель перед началом файла будет восприня­та как ошибка.

Распределение по сегментам

Задача разбивается на отдельные сегменты адресного пространства.

Логическое обращение к сегментам выполняется по имени сегмента и смещению относительно начала сегмента.

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

При загрузке задачи часть сегментов размещается в основной памяти (при этом для каждого из этих сегментов ОС находит подходящую свободную область памяти, а часть сегментов размещается во вторичной памяти (на диске)).

Смежные сегменты одной задачи могут находится вне смежных областей (не соседних) оперативной памяти.

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

Если виртуальные адресные пространства нескольких задач (процессов) включают один и тот же сегмент, то в таблицах сегментов этих задач делаются ссылки (ref's) на одну и ту же область оперативной памяти, в которую данный сегмент загружается в единственном экземпляре.

Время от времени возникают прерывания, связанные с отсутствием нужных сегментов в памяти. При необходимости освобождения памяти (в зависимости от характера прерывания) некоторые сегменты выгружаются и при каждом обращении к оперативной памяти выполняется преобразование ВА в ФА. При обращении к памяти проверяется разрешен ли доступ требуемого типа к данному сегменту.

При сегментной организации виртуальной памяти:

1. При загрузке образа задачи можно размещать её не целиком, а по мере необходимости.

2. Удобно размещать в памяти разделяемый (совместно используемый) программный модуль. (Оформить такой модуль в сегментном формате, разместить его в памяти в единственном экземпляре, а в нескольких таблицах сегментов исполняемых задач разместить указатели на этот сегмент.)

Недостатком такого распределения памяти является фрагментация на уровне сегментов и более медленное преобразование адреса по сравнению со страничной организацией работы с памятью.