Физические адреса соответствуют номерам ячеек оперативной памяти, где в действительности расположены или будут расположены переменные и команды программы.
Существуют два принципиально разных подхода к преобразованию виртуальных адресов в физические: статический и динамический.
При статическом подходе замена виртуальных адресов на физические выполняется один раз для каждого процесса во время начальной загрузки программы при помощи специального модуля – перемещающего загрузчика. При этом внутри программы меняются все адресно-зависимые указатели.
При динамическом подходе программа загружается в память в неизменном виде в виртуальных адресах, а при выполнении программы при каждом обращении к оперативной памяти выполняется преобразование виртуального адреса в физический на основании смещения адресов для данного процесса, хранящегося в специальном регистре операционной системы.
Второй способ является более гибким, т. к. программа жестко не привязана к первоначально выделенному ей участку памяти. Но первый вариант более экономичен, т. к. преобразование адресов выполняется только один раз при загрузке программы.
Совокупность виртуальных адресов процесса называется виртуальным адресным пространством, который одинаков у всех процессов системы.
Например, при использовании 32-разрядных виртуальных адресов этот диапазон 00000000 16 … FFFFFFFF 16 (232=4 Гбайт при адресации к ячейкам памяти размером 1 байт). Совпадение виртуальных адресов переменных и команд различных процессов не приводит к конфликтам, т. к. операционная система отображает их на разные физические адреса. При этом ОС отображает либо все виртуальное адресное пространство, либо только определенную его часть.
Необходимо различать максимально возможное адресное пространство процесса (потенциальное, определяемое разрядностью схем адресации) и назначенное (выделенное) процессу виртуальное адресное пространство – действительно нужное процессу для работы. В ходе выполнения процессу при необходимости может быть увеличено выделенное виртуальное адресное пространство.
Сегодня типична ситуация, когда объем виртуального адресного пространства превышает доступный объем оперативной памяти. В этом случае для хранения данных виртуального адресного пространства процесса, не помещающихся в оперативную память, используется внешняя память на жестком диске. Именно на этом принципе основана виртуальная память – современный механизм, используемый в ОС для управления памятью.
Следует отметить, что виртуально адресное пространство и виртуальная память – различные механизмы и они не обязательно реализуются в операционной системе одновременно.
Содержимое назначенного процессу виртуального адресного пространства, т. е. коды команд, исходные и промежуточные данные, а также результаты вычислений, представляют собой образ процесса.
Обычно виртуальное адресное пространство процесса делится на две непрерывные части: системную, необходимую операционной системе, и пользовательскую. Системная часть виртуального адресного пространства является идентичной для всех процессов. Поэтому при смене активного процесса заменяется только пользовательская часть. Причем системная часть виртуальной памяти в ОС любого типа включает область, подвергаемую вытеснению на диск, и область, на которое вытеснение не распространяется.
2.2.2. Классификация алгоритмов распределения памяти
На рис. 2.2 приведена классификация алгоритмов распределения памяти, в которой все они разделены на два класса – в одних используется перемещение сегментов процесса между оперативной памятью и диском, в других – не используется.

Рис. 2.2. Классификация алгоритмов распределения памяти
Распределение памяти фиксированными разделами
При применении этого алгоритма память разбивается на несколько фиксированных (не одинаковых) областей, называемых разделами. Очередной процесс, поступивший на выполнение, помещается либо в общую очередь, либо в очередь к некоторому разделу, подходящему по размерам.
При очевидном преимуществе – простоте реализации, данный метод имеет существенный недостаток – жесткость: число одновременно выполняемых процессов фиксировано и не учитываются их реальные потребности в памяти. Такой алгоритм управления памяти применялся в ранних мультипрограммных ОС, а сейчас – в системах реального времени.
Распределение памяти динамическими разделами
В этом алгоритме память заранее не делится на разделы. Каждому вновь поступающему приложению на этапе создания процесса выделяется вся необходимая ему память непрерывным разделом. После завершения процесса выделенный ему раздел памяти освобождается, и на это место может быть загружен новый процесс. Однако маловероятно, что необходимая новому процессу память точно соответствует какому-то освободившемуся разделу.
В результате этот метод имеет серьезный недостаток – фрагментацию памяти: наличие большого числа несмежных участков свободной памяти маленького размера, недостаточного ни для одного создаваемого процесса.
Перемещаемые разделы
Одним из методов борьбы с фрагментацией является перемещение всех занятых участков памяти в сторону старших или младших адресов так, чтобы вся свободная память образовала единую область. Эта процедура называется сжатием и на нее требуется достаточно много времени.
Так как программы перемещаются по оперативной памяти в ходе своего выполнения, то при применении этого алгоритма распределения памяти невозможно использовать настройку адресов с помощью перемещающего загрузчика. Здесь можно использовать только динамическое преобразование адресов.
Свопинг и виртуальная память
В мультипрограммном режиме помимо активного процесса, который исполняется процессором, имеются приостановленные процессы, находящиеся либо в состоянии ожидания, либо в состоянии готовности и стоящие в очереди к процессору. Образы таких неактивных процессов могут быть временно выгружены на диск. Когда подходит очередь выполнения выгруженного процесса, его образ возвращается с диска в оперативную память. Если в памяти нет свободного места, то на диск сбрасывается один или несколько неактивных процессов.
Подмена оперативной памяти дисковой памятью позволяет повысить уровень мультипрограммирования – объем оперативной памяти теперь не столь жестко ограничивает количество одновременно выполняемых процессов. Суммарный объем памяти, занимаемой образами этих процессов, может существенно превосходить размер физической оперативной памяти компьютера.
Виртуальным называется ресурс, который пользователю или пользовательской программе представляется обладающим свойствами, которыми он в действительности не обладает.
Виртуализация памяти может быть осуществлена на основе двух различных подходов:
· свопинг – образы процессов выгружаются на диск и возвращаются в оперативную память целиком, т. е. образы процессов в каждый момент времени существуют в одном экземпляре – в оперативной памяти или на диске;
· виртуальная память – между оперативной памятью и диском перемещаются части (сегменты, страницы и т. п.) образов процессов, т. е. на диске постоянно хранятся полные образы всех процессов, а в оперативной памяти – их части.
Свопинг является частным случаем виртуальной памяти и более простым в реализации способом совместного использования оперативной памяти и диска. Однако ему присуща избыточность, т. к. при подкачке с диска не весь программный код образа процесса требуется для исполнения в текущем кванте его времени. Перемещение избыточных данных замедляет работу системы и приводит к неэффективному использованию памяти. Кроме того, невозможно загрузить на выполнение процесс, адресное пространство которого превышает имеющуюся свободную память. Поэтому свопинг в современных операционных системах почти не используется, а применяется механизм виртуальной памяти.
2.2.3. Страничное распределение памяти
При применении этого алгоритма виртуальное адресное пространство каждого процесса делится на части одинакового, фиксированного для данной системы размера, называемые виртуальными страницами. В общем случае размер виртуального адресного пространства процесса не кратен размеру страницы, поэтому последняя страница каждого процесса дополняется фиктивной областью.
Вся оперативная память компьютера также делится на части такого же размера, называемые физическими страницами (блоками, кадрами), равными степени двойки: 512, 1024, 4096 байт и т. д.
При создании процесса операционная система загружает в оперативную память несколько его виртуальных страниц (начальные страницы кодового сегмента и сегмента данных).
Копия всего виртуального адресного пространства каждого процесса постоянно находится на диске.
Для каждого процесса операционная система создает таблицу страниц, содержащую записи обо всех виртуальных страницах процесса. Пример страничного распределения памяти для двух процессов приведен на рис. 2.3.

Рис. 2.3. Пример страничного распределения памяти
для двух процессов
Каждая запись страницы (дескриптор страницы) включает следующую информацию о соответствующей виртуальной странице процесса:
· признак присутствия (1/0) виртуальной страницы в оперативной памяти;
· номер физической страницы, в которую загружена данная виртуальная страница;
· признак модификации страницы (1/0) – изменялась страница, находящаяся в памяти, или нет;
· признак обращения к странице (1/0), который устанавливается 1 при каждом обращении по адресу, относящемуся к данной странице.
Информация из таблиц страниц используется для решения вопроса о необходимости перемещения той или иной страницы между памятью и диском, а также для преобразования виртуального адреса в физический.
Сами таблицы размещаются в оперативной памяти, а адрес их размещения включается в контекст соответствующего процесса. При активации очередного процесса операционная система загружает адрес его таблицы страниц в специальный регистр процессора.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 |



