русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Текст лекции


Дата добавления: 2013-12-23; просмотров: 859; Нарушение авторских прав


Ключевые вопросы

Лекция № 9. Сегментная и страничная виртуальная память. Часть 3

Продолжительность:2 часа (90 мин.)

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

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

· Разделяемые сегменты памяти.

 

20.2.1 Сегментное распределение — до 20 мин.

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

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

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



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

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

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

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

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

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

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

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

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

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

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

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

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

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

20.2.2 Сегментно-страничное распределение — до 25 мин.

 

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

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

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

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

Координаты байта в виртуальном адресном пространстве при сегментно-стра­ничной организации можно задать двумя способами. Во-первых, линейным вир­туальным адресом, который равен сдвигу данного байта относительно границы общего линейного виртуального пространства, во-вторых, парой чисел, одно из которых является номером сегмента, а другое — смещением. Для каждого процесса операционная система создает отдельную таблицу сегмен­тов, в которой содержатся описатели (дескрипторы) всех сегментов процесса. Описание сегмента включает назначенные ему права доступа и другие характе­ристики, подобные тем, которые содержатся в дескрипторах сегментов при сегментной организации памяти. Однако имеется и принципиальное отличие. В поле базового адреса указывается не начальный физический адрес сегмента, отведен­ный ему в результате загрузки в оперативную память, а начальный линейный виртуальный адрес сегмента в пространстве виртуальных адресов ( ба­зовые физические адреса обозначены 51, S2, S3, а базовые виртуальные адреса — fi, £2, Q).

Наличие базового виртуального адреса сегмента в дескрипторе позволяет одно­значно преобразовать адрес, заданный в виде пары (номер сегмента, смещение в сегменте), в линейный виртуальный адрес байта, который затем преобразуется в физический адрес страничным механизмом.

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

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

Преобразование виртуального адреса в физический происходит в два этапа :

1. На первом этапе работает механизм сегментации. Исходный виртуальный адрес, заданный в виде пары (помер сегмента, смещение), преобразуется в линейный виртуальный адрес. Для этого на основании базового адреса таблицы сегментов и номера сегмента вычисляется адрес дескриптора сегмента. Анализируются поля дескриптора и выполняется проверка возможности выполнения за­
данной операции. Если доступ к сегменту разрешен, то вычисляется линей­
ный виртуальный адрес путем сложения базового адреса сегмента, извлеченного
из дескриптора, и смещения, заданного в исходном виртуальном адресе.

2. На втором этапе работает страничный механизм. Полученный линейный вирту­альный адрес преобразуется в искомый физический адрес. В результате пре­образования линейный виртуальный адрес представляется в том виде, в кото­ром он используется при страничной организации памяти, а именно в видепары (номер страницы, смещение в странице). Благодаря тому что размер страницы выбран равным степени двойки, эта задача решается простым отде­лением некоторого количества .младших двоичных разрядов. При этом в стар­ших разрядах содержится номер виртуальной страницы, а в младших смещение искомого элемента относительно начала страницы. Так, если раз­мер страницы равен 2 , то смещением является содержимое младших к разрядов, а остальные, старшие разряды содержат номер виртуальной страницы, которой принадлежит искомый адрес. Далее преобразование адреса проис­ходит так же, как при страничной организации: старшие разряды линейного виртуального адреса, содержащие номер виртуальной страницы, заменяются номером физической страницы, взятым из таблицы страниц, а младшие раз­ряды виртуального адреса, содержащие смещение, остаются без изменения. Как видно, механизм сегментации и страничный механизм действуют достаточ­но независимо друг от друга. Поэтому нетрудно представить себе реализацию сегментно-страничного управления памятью, в которой механизм сегментации работает по вышеописанной схеме, а страничный механизм изменен. Он реали­зует двухуровневую схему, в которой виртуальное адресное пространство делит­ся сначала на разделы, а уж потом на страницы. В таком случае преобразование виртуального адреса в физический происходит в несколько этапов. Сначала ме­ханизм сегментации обычным образом, используя таблицу сегментов, вычисляет линейный виртуальный адрес. Затем из данного виртуального адреса вычленя­ются номер раздела, номер страницы и смещение. И далее по номеру раздела из таблицы разделов определяется адрес таблицы страниц, а затем по номеру виртуальной страницы из таблицы страниц определяется номер физической страницы, к которому пристыковывается смещение. Именно такой подход реа­лизован компанией Intel в процессорах i386, i486 и Pentium.

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

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

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

20.2.3 Разделяемые сегменты памяти — до 25 мин.

 

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

Хотя основной задачей операционной системы при управлении памятью являет­ся защита областей оперативной памяти, принадлежащей одному из процессов, от доступа к ней остальных процессов, в некоторых случаях оказывается полезным организовать контролируемый совместный доступ нескольких процессов к опре­деленной области памяти. Например, в том случае, когда несколько пользовате­лей одновременно работают с некоторым текстовым редактором, нецелесообраз­но многократно загружать его код в оперативную память. Гораздо экономичней загрузить всего одну копию кода, которая обслуживала бы всех пользователей, работающих в данное время с этим редактором (для этого код редактора должен быть реентерабельным). Очевидно, что сегмент данных редактора не может при­сутствовать в памяти в единственном разделяемом экземпляре — для каждого пользователя должна быть создана своя копия этого сегмента, в которой поме­щается редактируемый текст и значения других переменных редактора, напри­мер его конфигурация, индивидуальная для каждого пользователя, и т. п.

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

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

В приведенном выше описании подразумевалось, что разделяемый сегмент по­мещается в индивидуальную часть виртуального адресного пространства каждо­го процесса (рис. 5.23, а) и описывается в каждом процессе индивидуальным дескриптором сегмента (и индивидуальными дескрипторами страниц, если ис­пользуется сегментно-страничный механизм). «Попадание» же этих виртуаль­ных сегментов на общую часть оперативной памяти достигается за счет согласо­ванной настройки операционной системой многочисленных дескрипторов для множества процессов.

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

При работе с разделяемыми сегментами памяти ОС должна выполнять некото­рые функции, общие для любых разделяемых между процессами ресурсов — файлов, семафоров и т, п. Эти функции состоят в поддержке схемы именования ресурсов, проверке прав доступа определенного процесса к ресурсу, а также в от­слеживании количества процессов, пользующихся данным ресурсом (чтобы уда­лить его в случае ненадобности). Для того чтобы отличать разделяемые сегменты памяти от индивидуальных, дескриптор сегмента должен содержать поле, имею­щее два значения: shared (разделяемый) или private (индивидуальный).

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

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

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

 

 



<== предыдущая лекция | следующая лекция ==>
Текст лекции | Ключевые вопросы


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.004 сек.