Сегментация
обеспечить машину множеством
полностью независимых адресных пространств, называемых сегментами. Каждый
сегмент содержит линейную последовательность адресов от О до некоторого
максимума. Длина каждого сегмента может быть любой от нуля до разрешенного
максимума. Различные сегменты могут быть различной длины. Более того, длины
сегментов могут изменяться во время выполнения. Длина сегмента стека может
увеличиваться всякий раз, когда что-либо помещается в стек, и уменьшаться при
выборке данных из стека.
Поскольку каждый сегмент составляет отдельное адресное пространство, разные
сегменты могут расти или сокращаться независимо друг от друга. Чтобы определить
адрес в такой сегментированной или двумерной памяти, программа должна указать
адрес, состоящий из двух частей: номер сегмента и адрес внутри сегмента.
сегмент — это логический объект. Сегмент может иметь в составе
процедуру, массив, стек или набор скалярных переменных, но обычно он не
содержит смеси различных типов.
Помимо простоты управления увеличивающимися или
сокращающимися структурами данных, сегментированная память обладает и другими
преимуществами. Если каждая процедура занимает отдельный сегмент и адрес 0 —
это ее начальный адрес, компоновка отдельно скомпилированных процедур
происходит намного проще.
Сегментация также облегчает совместное использование процедур и данных
несколькими процессами. Общим примером является библиотека совместного
доступа. В сегментированных системах графические библиотеки могут
располагаться в отдельном сегменте и совместно использоваться несколькими
процессами, что устраняет необходимость их присутствия в адресном пространстве
каждого процесса. В принципе в системах с чистой страничной организацией памяти
также можно иметь совместно используемые библиотеки, но это намного сложнее в
реализации. Поэтому такие системы предоставляют совместный доступ путем
моделирования сегментации.
Поскольку каждый сегмент формирует логический объект (такой как процедура,
массив или стек), у различных сегментов могут быть разные виды защиты. Сегмент
процедуры может быть определен как только исполняемый, что запрещает попытки
чтения из него или сохранения в него. Для массива чисел с плавающей точкой
можно разрешить режим доступа чтение/запись, но не исполнение, чтобы
отлавливать попытки передачи управления по адресам, на которых располагается
массив. Такая защита полезна при обнаружении ошибок программирования.
Реализация сегментации
Реализация
сегментации существенно отличается от страничной организации памяти: страницы
имеют фиксированный размер, а сегменты — нет. После того как система поработает
какое-то время, память разделится на некоторое количество участков, часть из
которых содержит сегменты, а остальные свободны. Этот феномен разделения памяти
на маленькие свободные участки, которые сложно использовать, называется поклеточной
разбивкой или внешней фрагментацией. С внешней фрагментацией можно
бороться с помощью уплотнения.
Сегментация с использованием страниц: Intel Pentium
Виртуальная память на компьютере Pentium включает наличие и сегментации, и
страничной организации. программы редко нуждаются более чем в 1000 сегментах,
но многим программам необходимы сегменты значительного размера. Основа
виртуальной памяти системы Pentium состоит их двух таблиц: локальной таблицы
дескрипторов LDT (Local Descriptor Table) и глобальной таблицы дескрипторов
GDT (Global Descriptor Table). У каждой программы есть своя собственная
таблица LDT, но глобальная таблица дескрипторов одна, ее совместно используют все
программы в компьютере. Таблица LDT описывает сегменты, локальные для каждой программы,
включая ее код, данные, стек и т. д., тогда как таблица GDT несет информацию о системных
сегментах, включая саму операционную систему.
|