Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Создай свою операционную систему! #13


Информационный Канал Subscribe.Ru

Проект UzhOS uzhos.tk



Сетевые операционные системы

Глава 5. Управление памятью

Продолжение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Продолжение следует...

В следующем выпуске:

  • Сегментно-страничное распределение


Copyright (C) 2004-2005 UzhOS-Team
Ведущий рассылки DFirst (winexp[@]yandex.ru)
Дизайн Vladimir Tsarkov (bvbn[@]lipetsk.ru)

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.othos.osmaker
Отписаться
Вспомнить пароль

В избранное