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

 

При страничной организации виртуальное адресное пространство процесса де­лится на равные части механически, без учета смыслового значения данных. В од­ной странице могут оказаться и коды команд, и инициализируемые переменные, и массив исходных данных программы. Такой подход не позволяет обеспечить дифференцированный доступ к разным частям программы, а это свойство могло бы быть очень полезным во многих случаях. Например, можно было бы запре­тить обращаться с операциями записи в сегмент программы, содержащий коды команд, разрешив эту операцию для сегментов данных.

Кроме того, разбиение виртуального адресного пространства на “осмысленные” части делает принципиально возможным совместное использование фрагментов программ разными процессами. Пусть, например, двум процессам требуется одна и та же подпрограмма. Тогда коды этой подпрограммы могут быть оформлены в виде отдельного сегмента и включены в виртуальные адресные пространства обоих процессов. При отображении в физическую память сегменты, содержащие коды подпро­граммы из обоих виртуальных пространств, проецируются на одну и ту же об­ласть физической памяти. Таким образом оба процесса получат доступ к одной и той же копии подпрограммы (рис. 14).

 

Рис. 14. Распределение памяти сегментами

 

Итак, виртуальное адресное пространство процесса делится на части – сегмен­ты, размер которых определяется с учетом смыслового значения содержащейся в них информации. Отдельный сегмент может представлять собой подпрограм­му, массив данных и т.п. Деление виртуального адресного пространства на сег­менты осуществляется компилятором на основе указаний программиста или по умолчанию, в соответствии с принятыми в системе соглашениями. Максималь­ный размер сегмента определяется разрядностью виртуального адреса, напри­мер при 32-разрядной организации процессора он равен 4 Гбайт. При этом мак­симально возможное виртуальное адресное пространство процесса представляет собой набор из N виртуальных сегментов, каждый размером по 4 Гбайт. В каж­дом сегменте виртуальные адреса находятся в диапазоне от 0000000016до FFFFFFFF16. Сегменты не упорядочиваются друг относительно друга, так что общего для сегментов линейного виртуального адреса не существует, виртуаль­ный адрес задается парой чисел: номером сегмента и линейным виртуальным ад­ресом внутри сегмента.

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

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

 базовый физический адрес сегмента в оперативной памяти;

 размер сегмента;

 правила доступа к сегменту;

 признаки модификации, присутствия и обращения к данному сегменту, а также некоторая другая информация.

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

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

Механизмы преобразования адресов этих двух способов управления памятью тоже весьма схожи, однако в них имеются и существенные отличия, которые яв­ляются следствием того, что сегменты в отличие от страниц имеют произволь­ный размер. Виртуальный адрес при сегментной организации памяти может быть представлен парой (g, s), где g – номер сегмента, а s – смещение в сегменте. Фи­зический адрес получается путем сложения базового адреса сегмента, который определяется по номеру сегмента g из таблицы сегментов, и смещения s (рис. 15).

 

Рис. 15. Преобразование виртуального адреса при сегментной организации памяти

 

В данном случае нельзя обойтись операцией конкатенации, как это делается при страничной организации памяти. Действительно, поскольку размер страницы равен степени двойки, следовательно, в двоичном виде он выражается числом с несколькими нулями в младших разрядах. Страницы имеют одинаковый размер, а значит, их начальные адреса кратны размеру страниц и выражаются также чис­лами с нулями в младших разрядах. Именно поэтому ОС заносит в таблицы страниц не полные адреса, а номера физических страниц, которые совпадают со старшими разрядами базовых адресов. Сегмент же может в общем случае распо­лагаться в физической памяти начиная с любого адреса, следовательно, для опре­деления местоположения в памяти необходимо задавать его полный начальный физический адрес. Использование операции сложения вместо конкатенации за­медляет процедуру преобразования виртуального адреса в физический по срав­нению со страничной организацией.

Другим недостатком сегментного распределения является избыточность. При сегментной организации единицей перемещения между памятью и диском является сегмент, имеющий в общем случае объем больший, чем страница. Однако во мно­гих случаях для работы программы вовсе не требуется загружать весь сегмент целиком, достаточно было бы одной или двух страниц. Аналогично при отсутст­вии свободного места в памяти не стоит выгружать целый сегмент, когда можно обойтись выгрузкой нескольких страниц.

Но главный недостаток сегментного распределения – это фрагментация, кото­рая возникает из-за непредсказуемости размеров сегментов. В процессе работы системы в памяти образуются небольшие участки свободной памяти, в которые не может быть загружен ни один сегмент. Суммарный объем, занимаемый фраг­ментами, может составить существенную часть общей памяти системы, приводя к ее неэффективному использованию.

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

Одним из существенных отличий сегментной организации памяти от странич­ной является возможность задания дифференцированных прав доступа процесса к его сегментам. Например, один сегмент данных, содержащий исходную инфор­мацию для приложения, может иметь права доступа “только чтение”, а сегмент данных, представляющий результаты, – “чтение и запись”. Это свойство дает принципиальное преимущество сегментной модели памяти над страничной.