[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]

Программирование: Разработка и отладка программ


Отображение памяти - Основные сведения

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

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

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

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

shmctl Управляет операциями с общими областями памяти
shmget Получает или создает общий сегмент памяти
shmat Подключает общий сегмент памяти процесса
shmdt Отключает общий сегмент памяти процесса
disclaim Удаляет отображенные данные в указанном диапазоне адресов общего сегмента памяти

Функция ftok генерирует ключ, с помощью которого функция shmget создает общий сегмент

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

madvise Сообщает системе о предположительном объеме подкачки для процесса
mincore Определяет расположение страниц памяти
mmap Отображает объектный файл в виртуальную память
mprotect Изменяет ограничения доступа, связанные с отображением памяти
msync Синхронизирует отображенный файл с запоминающим устройством, на котором от расположен
munmap Освобождает область памяти, выделенную для отображения

Функции msem_init, msem_lock, msem_unlock, msem_remove, msleep и mwakeup предназначены для управления доступом к процессам, отображенным службами mmap.

Более подробно процедура отображения в память описана в следующих разделах:

Сравнительные характеристики mmap и shmat

Как и для служб shmat, размер области адресного пространства, доступной для отображения файлов с помощью служб mmap, зависит от того, является ли соответствующий процесс 32- или 64-разрядным. В 32-разрядных процессах для отображения доступен диапазон адресов 0x30000000-0xCFFFFFFF, общий объем этой области - 2,5 Гб. В AIX версии 4.2.1 и выше для отображения файлов доступен диапазон адресов 0x30000000-0xCFFFFFFF и 0xE0000000-0xEFFFFFFF, общий объем этой области - 2,75 Гб. Все диапазоны адресов, доступные для 32-разрядных приложений, подходят как для статического, так и для динамического отображения. Статическое отображение выполняется в случае, когда в приложении указано, что отображение должно находиться в фиксированной области адресного пространства. Динамическое отображение выполняется, если в приложении указано, что расположение отображения устанавливается системой.

Для 64-разрядных процессов, отображения mmap и shmat могут размещаться в двух областях адресного пространства. В первой области, с диапазоном адресов 0x07000000_00000000-0x07FFFFFF_FFFFFFFF, можно размещать как статические, так и динамическое отображения. Во второй области, с диапазоном адресов 0x30000000-0xCFFFFFFF, 0xE0000000-0xEFFFFFFF и 0x10_00000000-0x06FFFFFF_FFFFFFFF, можно размещать только статические отображения. Последний фрагмент этой области, с адресами в диапазоне 0x10_00000000-0x06FFFFFF_FFFFFFFF, используется также системным загрузчиком для размещения текста программы, статических данных и кучи, поэтому размещать статические отображения можно только в незанятых участках этого фрагмента.

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

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

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

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

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

Службы shmat следует применять в следующих случаях:

Службы mmap следует применять в следующих случаях:

В AIX версий 4.2.1 и выше для 32-разрядных приложений с ограниченным адресным пространством применяются "расширенные возможности shmat". Если установлено значение переменной среды EXTSHM=ON, то процессы, выполняемые в этой среде, могут создавать и подключать более одиннадцати общих сегментов памяти. Размер такого сегмента - от 1 байта до 256 Мб. Для сегментов, размер которых превышает 256 Мб, значение переменной среды EXTSHM=ON игнорируется. Процесс может размещать такие сегменты в областях адресного пространства, размер которых совпадает с размером сегмента. В той же области памяти размером 256 Мб можно разместить другой сегмент, который будет начинаться сразу после окончания первого сегмента. Адрес, по которому процесс может размещать сегменты, должен совпадать с границей страницы, т.е. должен быть кратным SHMLBA_EXTSHM байт. Адрес сегмента, размер которого превышает 256 Мб, должен совпадать с границей области памяти размером 256 Мб, т.е. нацело делиться на SHMLBA байт.

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

С помощью этой переменной среды можно либо отвести для приложения более 11 сегментов, если EXTSHM=ON, либо повысить производительность обращения к отведенным 11 (или менее) сегментам, если значение переменной равно OFF. Еще раз подчеркнем, что "расширенные возможности shmat" относятся только к 32-разрядным процессам.

Совместимость mmap со стандартами

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

Процедуры семафоров

Процедуры msem_init, msem_lock, msem_unlock, msem_remove, msleep и mwakeup соответствуют спецификациям среды разработки приложений OSF. Они представляют собой альтернативу таким интерфейсам IPC, как функции semget и semop. К преимуществам семафоров относятся эффективный метод сериализации и снижение нагрузки благодаря тому, что системный вызов при обращении к семафору не нужен.

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

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

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

Отображение файлов с помощью процедуры shmat

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

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

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

Отображенные файлы с записью по команде

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

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

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

Отображение общих сегментов памяти с помощью процедуры shmat

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

Термин Определение
Ключ Уникальный идентификатор общего сегмента памяти. Ключ связан с общим сегментом памяти с момента его создания до момента уничтожения. Ключ аналогичен имени файла.
ИД сегмента (shmid) Идентификатор общего сегмента памяти для конкретного процесса. Аналогичен дескриптору файла.
Подключить Указывает, что процесс для работы с сегментом должен подключить его. Подключение общего сегмента аналогично открытию файла.
Отключить Указывает что процесс должен отключить сегмент по окончании работы с ним. Отключение общего сегмента аналогично закрытию файла.

Дополнительная информация приведена в разделе Создание общего сегмента памяти с помощью функции shmat.

Связанная информация

Адресное пространство программы - Обзор.

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

Создание отображенного файла с записью по команде с помощью функции shmat.


[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]