Реклама:

В этом подразделе мы поговорим о виртуальной памяти в UNIX и Windows ХР. С точки зрения программиста они во многом сходны.

Виртуальная память UNIX

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

Примеры виртуальной памяти

Рис. 6.26. Адресное пространство одного процесса в UNIX

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

Данное ранее описание системы UNIX (виртуальная память с подкачкой страниц по требованию) в целом соответствует версии Berkeley UNIX, однако версии Sysytem V и Solaris имеют некоторые особенности, позволяющие пользователям управлять виртуальной памятью. Самой важной является способность процесса отображать файл или часть файла на часть адресного пространства процесса. Например, если файл размером 12 Кбайт отображается на виртуальный адрес 144К, то в ячейке с адресом 144К будет находиться первое слово этого файла. Таким образом, можно выполнять ввод-вывод файла без системных вызовов. Поскольку размер некоторых файлов превышает размер виртуального адресного пространства, можно отображать не весь файл, а только его часть. Для отображения сначала нужно открыть файл и получить дескриптор файла fd (file descriptor). Дескриптор используется для идентификации отображаемого файла. Затем процесс совершает вызов

paddr = mmap(virtual_address. length, protection, flags, fd, file_offset)

Этот вызов отображает length байт, начиная со смещения file_offset в файле, на виртуальное адресное пространство, начиная с адреса virtual_address. Параметр flags требует, чтобы система выбрала виртуальный адрес, который затем возвращается в параметре paddr. Отображаемая область должна быть выровнена в границах страницы и содержать целое число страниц. Параметр protection определяет уровень защиты, включая возможность чтения, записи и выполнения (в любой комбинации). Отображение можно в дальнейшем удалить с помощью команды unmap.

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

Виртуальная память Windows ХР

В Windows ХР каждый пользовательский процесс имеет собственное виртуальное адресное пространство. Длина виртуального адреса составляет 32 бита, поэтому у каждого процесса есть 4 Гбайт виртуального адресного пространства. Нижние 2 Гбайт предназначены для кода и данных процесса; верхние 2 Гбайт обеспечивают доступ (ограниченный) к памяти ядра. Исключение составляют серверные версии Windows ХР, в которых разделение памяти может быть другим (3 Гбайт пользователю и 1 Гбайт ядру). Виртуальное адресное пространство с подкачкой страниц по требованию содержит страницы фиксированного размера (4 Кбайт на машине Pentium 4).

Каждая виртуальная страница может находиться в одном из трех состояний: свободна (free), зарезервирована (reserved) или выделена (committed). Свободная страница в текущий момент не используется, и обращение к ней вызывает ошибку отсутствия страницы. Когда процесс начинается, все его страницы находятся в свободном состоянии до тех пор, пока программа и начальные данные не будут отображены на свое адресное пространство. Если код или данные отображены в страницу, то такая страница является выделенной. Обращение к выделенной странице будет успешным, если страница находится в основной памяти. Если страница отсутствует в основной памяти, произойдет ошибка, и операционной системе придется вызывать нужную страницу с диска. Виртуальная страница может находиться и в зарезервированном состоянии. Это значит, что страница остается недоступной для отображения до тех пор, пока резервирование не будет отменено. Помимо атрибутов состояния, страницы имеют и другие атрибуты (например, указывающие на возможность чтения, записи и выполнения). Верхние 64 Кбайт и нижние 64 Кбайт памяти всегда свободны, чтобы можно было отыскивать ошибки указателей (неинициализированные указатели часто равны 0 или -1).

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

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

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

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

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

Первые четыре функции очевидны. Следующие две функции позволяют процессу делать резидентной область памяти размером до 30 страниц и отменять это действие. Это качество может понадобиться программам, работающим в режиме реального времени. Операционная система устанавливает определенный предел, чтобы процессы не становились слишком "прожорливыми". В системе Windows ХР также имеются функции API (они не указаны в табл. 6.4), которые позволяют процессу получать доступ к виртуальной памяти другого процесса.

Последние 4 функции API предназначены для управления отображаемыми на память файлами. Чтобы отобразить файл, сначала нужно создать объект отображения файла с помощью функции CreateFi 1 eMappi ng. Эта функция возвращает описатель объекта отображения файла и иногда еще и вводит в файловую систему имя для этого объекта, чтобы другой процесс мог его использовать. Следующие 2 функции соответственно создают и удаляют отображение файлов.

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

Таблица 6.4. Основные функции АРІ для управления виртуальной памятью

в Windows ХР

Функция API

Описание

VirtualAlloc

Резервирование или выделение области

VirtualFree

Освобождение области или отмена выделения

Virtual Protect

Изменение варианта защиты (чтение/запись/выполнение)

VirtualQuery

Запрос о состоянии области памяти

VirtualLock

Запрещение разбиения памяти на страницы (область памяти

 

становится резидентной)

VirtualUnlock

Снятие запрета относительно разбиения на страницы

CreateFileMapping

Создание объекта отображения файла и назначение (не всегда) ему

 

имени

MapViewOfFile

Отображение файла или части файла на адресное пространство

UnmapViewOfFile

Удаление отображенного файла из адресного пространства

OpenFileMapping

Открытие ранее созданного объекта отображения файла

Эти функции API являются основными. На них строится вся остальная система управления памятью. Например, существуют функции API для размещения и освобождения структур данных в одной или нескольких кучах. Кучи используются для хранения структур данных, которые динамически создаются и разрушаются. Кучи не занимаются уборкой мусора, поэтому пользовательское программное обеспечение само должно освобождать блоки виртуальной памяти, которые уже не нужны (уборкой мусора называют автоматическое удаление неиспользуемых структур данных). Куча в Windows ХР напоминает результат вызова функции mall ос в UNIX, но в Windows ХР, в отличие от UNIX, может быть несколько независимых куч.

Знакомство с операционными системами UNIX и Windows ХР || Оглавление || Примеры виртуального ввода-вывода