Сегментация.
Архитектура ЭВМ и систем
Разбивка на страницы. При этом способе каждый сегмент разбивается на страницы фиксированного размера, которые вызываются по требованию. Эта процедура выполняется с помощью отдельной таблицы страниц для каждого сегмента. Поскольку сегмент представляет собой линейное адресное пространство, все рассмотренные выше средства разбиения на страницы применимы к любому сегменту. Единственное различие… Читать ещё >
Сегментация. Архитектура ЭВМ и систем (реферат, курсовая, диплом, контрольная)
Рассмотренная выше память со страничной организацией базируется на одномерной виртуальной памяти, в которой виртуальные адреса идут один за другим от 0 до какого-то максимального адреса. Такая память является прозрачной для программистов. Сегментация — это организация памяти, при которой используется много абсолютно независимых линейных адресных пространств, называемых сегментами. Каждый сегмент состоит из последовательности адресов от 0 до некоторого допустимого максимального значения. Разные сегменты могут иметь разную длину. Длина сегментов может изменяться во время выполнения программы независимо друг от друга и не влияя друг на друга. Предусмотрены средства, которые следят за тем, чтобы длина сегмента не превышала заданного предела (сегмент не переполнялся). Сегмент является структурным логическим элементом, о котором программист знает и который использует. Обычно сегмент содержит только один тип данных: процедуру, массив, стек или ряд скалярных переменных. При обращении к сегментированной памяти должен быть задан номер сегмента и адрес внутри сегмента.
Причины сегментации. Использование совокупности отдельных виртуальных адресных пространств обусловлено несколькими причинами.
Так, причина, которая привела к сегментации памяти в процессоре 80 286, связана с проблемой адресации. В реальном режиме процессор способен адресовать до 220 ячеек памяти. Однако длина адресных объектов процессора ограничена 16 битами. Поэтому для формирования адресов использовался дополнительный механизм, основанный на сегментации (см. § 3.2).
Принцип сегментации памяти в процессоре 80 286 (см. рис. 7.12) состоит в следующем. Адресное пространство основной памяти в 1 М (220) разбивается на сегменты. Размер каждого сегмента не превышает 64К. (216). Сегменты начинаются по адресам, кратным 16 (имеют четыре нулевых младших бита), и могут перекрываться (заштрихованная область на рис. 7.12). В любой момент времени программа может обращаться к четырем сегментам, которые называются текущим сегментом кода (CS), текущим сегментом данных (DS), текущим сегментом стека (SS) и текущим дополнительным сегментом (ES). Сегмент ES обычно отводится для данных. Для идентификации текущего сегмента используется один из четырех специальных сегментных регистров. Содержимое сегментного регистра с четырьмя нулями в младших разрядах (База) задает начальный (базовый) адрес сегмента. Доступ к байтам или словам внутри сегмента обеспечивается с помощью 16-битного внутрисегментного смещения, которое хранится в индексном регистре. Процессор образует 20-битный адрес путем суммирования: Адрес = База + Смещение.
Однако одной из основных причин сегментации памяти является разнородность используемых структурных элементов с данными. Покажем целесообразность сегментации на примере компиляции,.
Рис. 7.12. Сегментация памяти для процессора 80 286.
который подробно рассмотрен в научной литературе [16]. В процессе компиляции создаются:
- • таблица символов, которая содержит имена и атрибуты переменных;
- • исходный текст программы, сохраняемый для распечатки;
- • таблица, содержащая все используемые целочисленные константы и константы с плавающей точкой;
- • дерево, содержащее синтаксический анализ программы;
- • стек, используемый для вызова процедур в компиляторе.
Каждая из первых четырех таблиц постоянно растет в процессе компиляции. Стековая таблица растет и уменьшается непредсказуемо. Если эти пять таблиц разместить в одномерной памяти с виртуальным адресным пространством в виде смежных областей, то возможен «наезд» одной таблицы на другую, вызванный переполнением таблиц.
При этом данные одной таблицы уничтожают данные другой. На рис. 7.13 показана ситуация, при которой переполнение таблицы символов привело к уничтожению части (заштрихованная область) исходного текста программы. Указанный недостаток можно устранить при написании программ. Однако такой подход является нерациональным.
Другой подход, состоящий в использовании аппаратных средств для устранения недостатка, приводит к сегментации.
Сегментацию можно реализовать одним из двух способов: подкачкой (свопингом) и разбивкой на страницы.
Подкачка. Этот способ очень похож на рассмотренный выше вызов страниц по требованию: сегменты загружаются и удаляются только в случае необходимости. Однако при его реализации следует иметь в виду, что размер страниц фиксирован, а размер сегментов — нет.
Рассмотрим особенности подкачки сегментов на конкретном примере.
На рис. 7.14,а показана плотно упакованная физическая память, в которой изначально содержится три сегмента — С0, C1, С2. В процессе выполнения программы эти сегменты заменены на сегменты С3, С4, С5 меньшего размера. В результате такой замены между сегментами об;
Рис. 7.13. Возможный «наезд» таблиц при компиляции разовались неиспользуемые области — дырки Д0, Д1, Д2 (рис. 7.14,6). Наличие свободных областей между занятыми областями свидетельствует о фрагментации памяти. Такая фрагментация называется внешней фрагментацией, поскольку свободные области памяти (дырки) не относятся к сегментам.
Если теперь потребуется вызвать с диска сегмент С6 несколько большего размера, чем С4, из памяти придется удалять два сегмента, несмотря на то что суммарная свободная область памяти Д0 + Д1 +Д2 > С6.
Чтобы избежать такой ситуации, необходимо уплотнять память. Цель уплотнения памяти — собрать все маленькие дырки в одну большую дырку, в которую можно поместить один или несколько сегментов. На рис. 7.14,0 показано, как память будет выглядеть после уплотнения. Совершать уплотнение после появления каждой дырки нецелесообразно из-за потери времени. Поэтому для уплотнения памяти используют специально разработанные алгоритмы. Например, популярный алгоритм оптимальной подгонки выбирает из списка адресов и размеров всех дырок самую маленькую дырку, в которую помешается нужный сегмент. Цель этого алгоритма — соотнести дырки и сегменты, чтобы избежать использования большой дырки, которая может понадобиться позже для большого сегмента.
Разбивка на страницы. При этом способе каждый сегмент разбивается на страницы фиксированного размера, которые вызываются по требованию. Эта процедура выполняется с помощью отдельной таблицы страниц для каждого сегмента. Поскольку сегмент представляет собой линейное адресное пространство, все рассмотренные выше средства разбиения на страницы применимы к любому сегменту. Единственное различие состоит в том, что каждый сегмент получает отдельную таблицу страниц.
К основным достоинствам сегментированной памяти следует отнести:
• упрощение работы с разнородными структурами данных, размеры которых постоянно уменьшаются или увеличиваются. Например,.
Рис. 7.14. Реализация сегментации подкачкой:
а — плотно упакованная память с тремя сегментами — С0, C1, С2; б — память после замены исходных сегментов на сегменты С3, С4, С5 меньшего размера (появление дырок Д0, Д1, Д2); в — память после уплотнения если при компиляции разместить процедуры (подпрограммы) на отдельных сегментах, то в значительной мере упрощается их связывание, вызов требуемой процедуры, изменение и перекомпиляция любой процедуры;
- • простую возможность разделения общих процедур или данных между несколькими программами, если для каждой процедуры выделить отдельный сегмент. В этом случае экономится память, так как исключается необходимость создания физических копий каждой разделяемой процедуры;
- • возможность защиты, ибо каждый сегмент включает в себя определенный тип данных. Поэтому разные сегменты могут иметь различные виды защиты. Например, сегменту с процедурой можно разрешить выполнение, запретив тем самым считывание из него и запись в него; для массива данных — только чтение и запись, но не выполнение и т. д.
В табл. 7.4 дана сравнительная оценка памяти со страничной организацией и сегментацией по некоторым показателям.
Таблица 7.4
Показатель. | Организация памяти. | |
страничная. | сегментация. | |
Назначение, или причина (цель) появления. | Увеличение размера памяти. | Увеличение числа адресных пространств. |
Количество линейных адресных пространств. | Много. | |
Возможность увеличения размера памяти. | Да. | Да. |
Управление таблицами с изменяющимися размерами. | Труднореализуемое. | Легкореализуемое. |
Прозрачность для программиста. | Да. | Нет. |
Возможность защиты. | Нет. | Да. |