Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УчебПособ_Гончаровский.doc
Скачиваний:
17
Добавлен:
13.11.2019
Размер:
3.75 Mб
Скачать

1.2.5.2. Сегментация памяти

Страничная организация памяти представляет одномерную виртуальную память, в которой виртуальные адреса идут один за другим от 0 до максимального адреса. Удобнее использовать два или несколько виртуальных адресных пространств. Например, компилятор может иметь несколько таблиц, которые создаются в процессе компиляции:

1. Таблица символов, которая содержит имена и атрибуты переменных.

2. Исходный текст, сохраняемый для листинга.

3. Таблица, содержащая все использующиеся целочисленные константы и константы с плавающей запятой.

4. Дерево, содержащее синтаксический анализ программы.

5. Стек, используемый для вызова процедур в компиляторе.

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

Что произойдет, если программа содержит очень большое число переменных? Адресное пространство, предназначенное для таблицы символов, может переполниться, даже если в других таблицах много свободного места.

Компилятор может забирать свободное пространство у одних таблиц и передавать его другим таблицам, но это похоже на управление оверлеями вручную. Нужно освободить программиста от расширения и сокращения таблиц, подобно тому, как виртуальная память исключает необходимость следить за разбиением программы на оверлеи. Для этого нужно создать много абсолютно независимых адресных пространств, которые называют сегментами. Каждый сегмент состоит из линейной последовательности адресов от 0 до какого-либо максимума. Разные сегменты могут иметь разную длину. Длина сегмента может меняться во время выполнения программы.

Так как каждый сегмент основывает отдельное адресное пространство, разные сегменты могут изменяться независимо друг от друга.

Если процедура занимает отдельный сегмент n и впоследствии изменяется и перекомпилируется, то другие процедуры менять не нужно, т.к. начальный адрес процедуры не изменился.

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

Разные сегменты могут иметь разные виды защиты. Например, сегмент с процедурой можно определить “только для выполнения”, запретив тем самым считывание и запись в него. Для массива с плавающей запятой разрешается только чтение и запись, но не выполнение и т.д. Такая защита часто помогает обнаружить ошибки в программе.

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

Сегментация реализуется разделением сегмента на страницы и вызова их по требованию. В этом случае одни страницы сегмента могут находиться в ОП, а другие – во вторичной памяти. Чтобы разбить сегмент на страницы, для каждого сегмента создается своя таблица страниц.