Сегментно-страничная организация виртуальной памяти

Сегментная организация виртуальной памяти

Страничная организация виртуальной памяти

Виртуальная память. Свопинг

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

 


Системы управления памятью подразделяются на два класса: системы перемещающие процессы между оперативной памятью и диском во время их выполнения и системы, которые не используют внешнюю память (рис. 5.11.). Для разных периодов развития операционных систем характерны общие подходы к распределению памяти. Некоторые из них актуальны и широко применяются в современных операционных системах, другие используются только в специализированных системах.

 

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

- в нижней части памяти (в ОЗУ) – модель применялась на мэйнфреймах и мини-компьютерах, в настоящее время не используется;

- в верхней части памяти (в ПЗУ) – схема реализуется на некоторых карманных компьютерах и встроенных системах;

- драйверы устройств могут находиться наверху (в ПЗУ), а остальная часть системы в ОЗУ, расположенной ниже – модель устанавливалась на ранних персональных компьютерах (например, работающих под управлением MS-DOS).

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

 
 

 

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

Метод 1.Распределение памяти фиксированными разделами. Это простейший способ управления памятью, который состоит в разбиении памяти на несколько областей (разделов) фиксированной величины. Разбиение памяти выполняется вручную оператором во время старта системы или во время ее установки, после чего границы разделов не изменяются. Задачи, выполняемые подсистемой управления памятью:

- сравнение объема памяти, требуемого для вновь поступившего процесса, с размерами свободных разделов и выбор подходящего по размеру раздела;

- загрузка процесса в выбранный раздел и настройка адресов[21].

Когда процесс поступает на выполнение, он становится в очередь к наименьшему разделу памяти, достаточно большому для того, чтобы его вместить (рис. 5.13.а). Так как размер разделов неизменен, все пространство в разделе, не используемое работающим процессом, пропадает. Сортировка процессов по отдельным очередям приводит к тому, что к одним разделам процессы выстраиваются в очередь, в то время как к другим – нет очереди. Альтернативная схема заключается в организации одной общей очереди для всех разделов (рис. 5.14.б). Процесс, который находится ближе всех к началу очереди и который подходит для выполнения в освободившемся разделе, загружается в память для обработки.


 

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

Такой способ управления памятью[22] применялся в ранних мультипрограммных операционных системах OS/360. Однако и сейчас метод находит применение в системах реального времени, благодаря небольшим затратам на реализацию. Детерминированность вычислительного процесса систем реального времени (заранее известен набор выполняемых задач, их требования к памяти, а иногда и моменты запуска) компенсирует недостаточную гибкость данного способа управления памятью.

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

 
 

 

 


Функции операционной системы, предназначенные для реализации данного метода управления памятью:

- ведение таблиц свободных и занятых областей с указанием начальных адресов и размеров участков памяти;

- анализ требований к памяти, просмотр таблицы свободных областей и выбор раздела, размер которого достаточен для размещения кодов и данных нового процесса[24] (при создании нового процесса);

- загрузка программы в выделенный ей раздел и корректировка таблиц свободных и занятых областей[25];

- корректировка таблиц свободных и занятых областей после завершения процесса.

Достоинство метода: гибкость, недостаток: фрагментация памяти – наличие большого числа несмежных участков (фрагментов) свободной памяти маленького размера. Размеры свободных фрагментов могут оказаться такими, что ни один процесс не сможет в них поместиться, но их суммарный объем может превышать требуемый объем памяти.

Распределение памяти динамическими разделами лежит в основе подсистем управления памятью многих мультипрограммных операционных системах 60-70-х годов, например, OS/360.

Метод 3. Распределение памяти перемещаемыми разделами. Один из методов борьбы с фрагментацией. Все занятые участки перемещаются в сторону старших или младших адресов, и свободная память образует единую область (рис. 5.16.).


 

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

Концепция сжатия использовалась и при применении других методов распределения памяти, например, когда отдельному процессу выделялась не одна сплошная область памяти, а несколько несмежных участков памяти произвольного размера (сегментов). Метод был использован в ранних версиях OS/2, в которых память распределялась сегментами, а возникавшая при этом фрагментация устранялась путем периодического перемещения сегментов.

 

 

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

В мультипрограммном режиме помимо активного процесса[27], имеются приостановленные процессы[28] и процессы в состоянии готовности[29]. Образы неактивных процессов временно, до цикла активности, выгружаются на диск. Если подходит очередь выполнения одного из выгруженных процессов, его образ с диска возвращается в оперативную память, при обнаружении недостатка свободного места в оперативной памяти, на диск выгружаются другие неактивные процессы. Такая виртуализация оперативной памяти[30] позволяет повысить уровень мультипрограммирования, так как объем оперативной памяти увеличивается за счет дополнительного объема дисковой памяти, занимаемой образами процессов.

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

- размещение данных в запоминающих устройствах разного типа (например, размещение части кодов программы в оперативной памяти, а части – на диске);

- выбор образов процессов или их частей для перемещения из оперативной памяти на диск и обратно;

- динамическое перемещение данных между памятью и диском;

- преобразование виртуальных адресов в физические адреса.

Виртуализация памяти реализуется на основе двух подходов:

Метод 1: свопинг (swapping, подкачка) – образы процессов полностью выгружаются на диск и возвращаются в оперативную память целиком. Это частный случай виртуальной памяти и более простой в реализации способ совместного использования оперативной памяти и диска. Свопингу свойственна избыточность, так как при активизации процесса для его выполнения, как правило, достаточно загрузить небольшую часть кодового сегмента с подлежащей выполнению инструкцией и частью сегментов данных, с которыми работает эта инструкция, а также отвести место под сегмент стека. При освобождении памяти для загрузки нового процесса также достаточно вытеснить на диск только часть образа процесса. Недостатки свопинга:

- перемещение избыточной информации замедляет работу системы, и приводит к неэффективному использованию памяти;

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

Из-за указанных недостатков свопинг, как основной механизм управления памятью, в современных операционных системах не используется[31].

Метод 2: виртуальная память (virtual memory) – образы процессов частями (сегменты, страницы) выгружаются на диск и частями возвращаются в оперативную память. Метод основан на идее, что объединенный размер программы, данных и стека может превышать количество доступной физической памяти, в связи с этим операционная система хранит части программ, используемые в настоящий момент, в оперативной памяти, остальные – на диске[32].

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

 

 

Страничная организация виртуальной памяти – перемещение данных между памятью и диском производится страницами (частями виртуального адресного пространства) небольшого размера (обычно порядка 4 Кбайт).

Метод используется в большинстве современных операционных систем. Виртуальное адресное пространство каждого процесса делится на части одинакового, фиксированного для данной системы размера – виртуальные страницы (virtual pages), которые являются минимальной единицей выделяемой памяти[33]. Так как размер виртуального адресного пространства процесса не кратен размеру страницы, то последняя страница каждого процесса дополняется фиктивной областью. Оперативная память также делится на части такого же размера – физические страницы (блоки, кадры). Размер страницы в байтах выбирается кратным 2k (512, 1024, 4096 и т.д.), что позволяет упростить механизм преобразования адресов.

 
 

Процесс обращается к памяти посредством виртуального адреса, который содержит в себе номер виртуальной страницы и смещение внутри страницы (рис. 5.17.). Номер виртуальной страницы используется как индекс в таблице страниц для поиска записи этой страницы. Операционная система преобразует виртуальный адрес в физический адрес, при необходимости перемещая страницу с жесткого диска в оперативную память. При запросе на выделение памяти операционная система может переместить на жесткий диск страницы, к которым давно не было обращений. Критические данные (код запущенных программ, код и память ядра системы) обычно находятся в оперативной памяти. Например, в семействе операционных систем Microsoft Windows место для хранения страниц на жестких дисках выделяется заранее. Пользователь может использовать автоматический механизм или самостоятельно указывать размер области виртуальной памяти на каждом из разделов диска. На указанных разделах операционной системой создается файл pagefile.sys требуемого размера, который и хранит перемещенные из оперативной памяти страницы на диск.

Программно формируемые виртуальные адреса передаются диспетчеру памяти (MMU, Memory Management Unit), который отображает виртуальные адреса на физические адреса памяти (рис. 5.18.). Например, программа пытается получить доступ к адресу 0, используя команду: MOV REG.0. Виртуальный адрес 0 передается диспетчеру памяти. Диспетчер определяет, что данный адрес попадает на страницу 0 (от 0 до 4095), которая отображается страничным блоком 2 (от 8192 до 12287), переводит его в физический адрес 8192 и выставляет на шину. Далее память получает запрос на чтение (запись) слова по адресу 8182 и выполняет его.

 
 

При создании процесса операционная система загружает в оперативную память несколько его виртуальных страниц (начальные страницы кодового сегмента и сегмента данных)[34] и для каждого процесса там же создает таблицу страниц[35] – информационную структуру, содержащую записи обо всех виртуальных страницах процесса. Запись таблицы – дескриптор страницы, содержит следующую информацию:

- номер физической страницы, в которую загружена данная виртуальная страница;

- признак присутствия, устанавливаемый в единицу, если виртуальная страница находится в оперативной памяти;

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

- признак обращения к странице (бит доступа), который устанавливается в единицу при каждом обращении по адресу, относящемуся к данной странице.

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

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

Параллельно программа обработки страничного прерывания находит на диске требуемую виртуальную страницу и пытается загрузить ее в оперативную память. Если в памяти имеется свободная физическая страница, то загрузка выполняется немедленно, если же свободных страниц нет, то на основании принятой в данной системе стратегии замещения страниц решается вопрос о том, какую страницу следует выгрузить из оперативной памяти. После выбора страницы, которая должна покинуть оперативную память, ее бит присутствия обнуляется, и ее признак модификации анализируется. Если выталкиваемая страница модифицирована, то ее новая версия записывается на диск, в ином случае запись на диск не производится, так как на диске уже имеется ее копия. Физическая страница объявляется свободной[36].

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

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

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

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

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

Одним из методов уменьшения затрат памяти на хранение таблиц страниц является метод хранения в памяти только активно используемой части таблицы, путем временного вытеснения неиспользуемой части таблицы из оперативной памяти. В этом случае используется более сложная структуризация виртуального адресного пространства, при которой все множество виртуальных адресов процесса делится на разделы, а разделы делятся на страницы. Все страницы имеют одинаковый размер, а разделы содержат одинаковое количество страниц. Размер и количество страниц в разделе выбирается равным степени 2k, в результате младшие двоичные разряды представляют смещение, средние разряды – номер виртуальной страницы, старшие разряды – номер раздела. Для каждого раздела строится собственная таблица страниц. Количество дескрипторов в таблице и их размер подбираются таким образом, чтобы объем таблицы оказался равным объему страницы. Например, в процессоре Pentium при размере страницы 4 Кбайт длина дескриптора страницы составляет 4 байта, максимальное количество записей в таблице страниц – 1024. Каждая таблица страниц описывается дескриптором, аналогичным структуре дескриптора обычной страницы. Дескрипторы сведены в таблицу разделов (каталог страниц). Физический адрес таблицы разделов активного процесса содержится в специальном регистре процессора, а страница, содержащая таблицу разделов, всегда находится в оперативной памяти.

Другим методом является использование многоуровневых таблиц страниц. Например, процессу нужно 12 Мбайт памяти: младшие 4 Мбайт – для текста программы, следующие 4 Мбайт – для данных, старшие 4 Мбайт – для стека (рис. 5.19). В таблице страниц верхнего уровня находится 1024 записи, соответствующие 10-разрядному полю Р1. Когда виртуальный адрес предстает перед диспетчером памяти, он сначала выделяет поле Р1 и использует его значение как индекс таблицы верхнего уровня.


Запись, место которой определяется по индексу в таблице страниц верхнего уровня, выдает адрес или номер страничного блока таблицы страниц второго уровня. Запись 0 в таблице страниц первого уровня указывает на таблицу страниц для текста программы, запись 1 указывает на таблицу страниц для данных, запись 1023 указывает на таблицу страниц для стека. Другие записи не используются. Поле Р2 теперь используется как индекс в выбранной таблице второго уровня для поиска номера страничного блока самой страницы. Если страница отсутствует в памяти, то бит присутствия в записи таблицы страниц будет равен нулю, что приведет к страничному прерыванию. Если страница находится в памяти, то номер страничного блока, взятый из таблицы страниц второго уровня, присоединяется к смещению, создавая физический адрес, который выставляется на шину и передается памяти.

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

Большинство программ большую часть своих обращений делает только к небольшому количеству страниц, а в таблице страниц читается интенсивно только определенное количество записей. Поэтому для уменьшения затрат памяти на поддержку таблиц страниц было разработано специальное устройство – буфер быстрого преобразования адреса (TLB, Translation Lookaside Buffer) или ассоциативная память. Буфер (аппаратная таблица) находится внутри диспетчера памяти и состоит из нескольких записей (рис. 5.20.). Каждая запись содержит информацию об одной странице: номер виртуальной страницы, бит, устанавливаемый при изменении страницы, код (флаг) защиты (какие устанавливаются разрешения на чтение, запись и выполнение) и номер физического страничного блока, в котором расположена эта страница. Эти поля однозначно соответствуют полям в таблице страниц, а дополнительный бит служит признаком использования записи в текущий момент.

 
 

 

Для того чтобы программа могла адресовать страницу, в TLB должна присутствовать соответствующая ей запись. Ассоциативный поиск в этой таблице выполняется при каждом обращении к памяти по виртуальному адресу. Когда виртуальный адрес представляется диспетчером памяти для отображения, аппаратура производит поиск присутствия виртуальной страницы в буфере TLB, путем параллельного сравнения адреса со всеми записями. Когда нужная запись найдена, проверяются разрешения доступа к странице, заданные в виде флагов (например, не пытается ли программа выполнить запись на страницу, доступную только для чтения). Если все в порядке, база физической страницы (базовый адрес – физический адрес начала модуля) считывается из записи и прибавляется к смещению из виртуального адреса, в результате чего получается полный физический адрес. Если номер виртуальной страницы присутствует в буфере TLB, но инструкция пытается записать что-то на страницу, доступную только для чтения, формируется ошибка защиты.

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

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

Традиционные таблицы страниц требуют по одной записи на каждую виртуальную страницу, так как они индексируются по номеру этой страницы. Если адресное пространство состоит из 232 байт с размером страницы 4096 байт, тогда в таблице страниц должно быть больше миллиона записей и размер таблицы составит 4 Мбайт. Одним из решений уменьшения размера таблиц является создание инвертированной таблицы страниц, когда таблица содержит по одной записи на страничный блок в реальной памяти. Например, при 64-разрядных виртуальных адресах, размере страниц 4 Кбайт и 256 Мбайт оперативной памяти инвертированная таблица страниц потребует только 65536 записей. Каждая запись отслеживает, что расположено в страничном блоке (процесс, виртуальная страница).

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

Инвертированные таблицы страниц используются на некоторых рабочих станциях компаний IBM, Hewlett-Packard и др.

 

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

Виртуальное адресное пространство процесса делится на сегменты, размер которых определяется с учетом смыслового значения содержащейся в них информации[38]. Отдельный сегмент может представлять собой подпрограмму, массив данных и пр. Сегменты не упорядочиваются друг относительно друга. Виртуальный адрес задается парой чисел: номером сегмента и линейным виртуальным адресом внутри сегмента. Метод предоставляет возможность совместно использовать фрагменты программ разными процессами. Например, два процесса используют одну подпрограмму, обладающую свойством реентерабельности[39]. Коды подпрограммы оформляются в виде отдельного сегмента и включаются в виртуальные адресные пространства обоих процессов. При отображении в физическую память сегменты, содержащие коды подпрограммы из виртуальных пространств процессов, проецируются на одну и ту же область физической памяти и оба процесса получают доступ к одной и той же копии подпрограммы.

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

При создании процесса и загрузки его образа в оперативную память система создает таблицу сегментов процесса. В таблице для каждого сегмента указывается: базовый физический адрес сегмента в оперативной памяти; размер сегмента; правила доступа к сегменту; признаки модификации, присутствия и обращения к данному сегменту; некоторая другая информация. Если виртуальные адресные пространства нескольких процессов включают один и тот же сегмент, то в таблицах сегментов процессов делаются ссылки на один участок оперативной памяти, в который данный сегмент загружается в единственном экземпляре. Виртуальный адрес при сегментной организации памяти представлен парой: номером сегмента и смещением в сегменте. Физический адрес получается путем сложения базового адреса сегмента, который определяется по номеру сегмента из таблицы сегментов и смещения (рис. 5.21.).


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

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

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

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

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

 

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

Данный метод представляет собой комбинацию страничного и сегментного механизмов управления памятью (рис. 5.22.) и направлен на реализацию достоинств обоих подходов. Разделение виртуального адресного пространства процесса на сегменты позволяет предоставлять разные права доступа к разным частям кодов и данных программы. Перемещение данных между памятью и диском осуществляется страницами. Для этого каждый виртуальный сегмент и физическая память делятся на страницы равного размера[40], что позволяет более эффективно использовать память, сократив до минимума фрагментацию. Все виртуальные сегменты образуют одно непрерывное линейное виртуальное адресное пространство (рис. 5.23.), их координаты задаются двумя способами:

- линейным виртуальным адресом, который равен сдвигу сегмента относительно границы общего линейного виртуального пространства;

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

Предпочтение отдается второму способу, так как он позволяет определить принадлежность адреса некоторому сегменту и проверить права доступа процесса к нему.

 
 

 

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

 
 

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

 

Операционная система ведет для каждого процесса таблицу страниц, в которой указывается соответствие виртуальных страниц физическим страницам. Базовые адреса таблицы сегментов и таблицы страниц процесса являются частью его контекста. При активизации процесса эти адреса загружаются в специальные регистры процессора и используются механизмом преобразования адресов. Преобразование виртуального адреса в физический происходит в два этапа (рис. 5.24):

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

2.При использовании страничного механизма полученный линейный виртуальный адрес преобразуется в физический адрес. В результате преобразования линейный виртуальный адрес представляется в виде пары (номер страницы, смещение в странице), путем отделения младших двоичных разрядов[41]. Старшие разряды линейного виртуального адреса, содержащие номер виртуальной страницы, заменяются номером физической страницы, взятым из таблицы страниц. Младшие разряды виртуального адреса, содержащие смещение, остаются без изменения.

 

 
 

Сегментно-страничная организация виртуальной памяти реализована в процессоре Intel Pentium. Его виртуальное адресное пространство процесса сегментировано. Преобразование виртуального адреса в физический адрес производится в два этапа. Сначала исходный адрес преобразуется в промежуточный линейный адрес в виртуальном 32-разрядном адресном пространстве. Затем выполняется страничное преобразование, отображающее виртуальное линейное адресное пространство на физическое (рис. 5.24.). В архитектуре процессора Intel Pentium непрерывное пространство сегмента существует только в линейном адресном пространстве процесса, а не в физическом адресном пространстве всей системы. Поэтому неиспользуемые части сегмента можно перемещать на диск, в то время как другие остаются в памяти. На практике только некоторые операционные системы используют эти аппаратные возможности процессора. Другие операционные системы используют более простую страничную конфигурация, в которой все сегменты имеют размер 4 Гбайт и смещение 0 относительно начала линейного адресного пространства.

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

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

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

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

 

 
 

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

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

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