Разделяемая память

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

Рубрика Программирование, компьютеры и кибернетика
Вид контрольная работа
Язык русский
Дата добавления 10.10.2010
Размер файла 21,9 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

РАЗДЕЛЯЕМАЯ ПАМЯТЬ

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

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

Создание отображения файла

Рассмотрим процедуру создания отображения файла на память.

1. Открытие файла. Прежде всего, приложение должно открыть файл при помощи функции CreateFile(), известной из рассмотрения третьего вопроса.

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

Параметры:

hFile - хэндл отображаемого файла.

lpSecurityAttributes - указатель на атрибуты защиты

dwflProtect - защита для отображаемого файла.

dwMaximumSizeHigh- размер файла (старшее слово).

dwMaximumSizeLow - размер файла (младшее слово).

lpName - имя отображенного файла.

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

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

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

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

Потенциальная опасность, связанная с использованием в паре функций CreateFile() и CreateFileMapping().

Если функция CreateFile() завершится с ошибкой и эта ошибка не будет обработана приложением, функция CreateFileMapping() получит через параметр hFile значение INVALID_HANDLE_VALUE, численно равное 0xFFFFFFFF.

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

Параметр lpSecurityAttributes задает адрес дескриптора защиты. В большинстве случаев для этого параметра указывается значение NULL.

Теперь займемся параметром flProtect, задающем защиту для создаваемого отображения файла.

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

Значение

Описание

PAGE_READONLY

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

PAGE_READWRITE

К выделенной области памяти предоставляется доступ для чтения и записи. При создании или открывании файла необходимо указать флаги GENERIC_READ и GENERIC_WRITE

PAGE_WRITECOPY

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

Эти значения можно комбинировать при помощи логической операции ИЛИ со следующими атрибутами:

Атрибут

Описание

SEC_COMMIT

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

SEC_IMAGE

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

SEC_NOCACHE

Отмена кэширования для всех страниц отображаемой области памяти. Должен использоваться вместе с атрибутами SEC_RESERVE или SEC_COMMIT

SEC_RESERVE

Если указан этот атрибут, вместо выделения выполняется резервирование страниц виртуальной памяти. Зарезервированные таким образом страницы можно будет получить в пользование при помощи функции VirtualAlloc(). Атрибут SEC_RESERVE можно указывать только в том случае, если в качестве параметра hFile функции CreateFileMapping() передается значение 0xFFFFFFFF

С помощью параметров dwMaximumSizeHigh и dwMaximumSizeLow необходимо указать функции CreateFileMapping() 64-разрядный размер файла.

Параметр dwMaximumSizeHigh должен содержать старшее 32-разрядное слово размера, а параметр dwMaximumSizeLow - младшее 32-разрядное слово размера.

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

Заметим, что если указать нулевые значения и для параметра dwMaximumSizeHigh, и для параметра dwMaximumSizeLow. В этом случае предполагается, что размер файла изменяться не будет.

Через параметр lpName можно указать имя отображения, которое будет доступно всем работающим одновременно приложениям. Имя должно представлять собой текстовую строку, закрытую двоичным нулем и не содержащую символов “\”.

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

В случае успешного завершения функция CreateFileMapping возвращает идентификатор созданного отображения. При ошибке возвращается значение NULL.

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

В этом случае функция CreateFileMapping() возвращает идентификатор существующего отображения.

Такую ситуацию можно определить с помощью функции GetLastError(), вызвав ее сразу после функции CreateFileMapping.

Функция GetLastError при этом вернет значение ERROR_ALREADY_EXISTS.

3. Выполнение отображения файла в память. Осуществляется за счет использования функций MapViewOfFile() или MapViewOfFileEx().

В результате заданный фрагмент отображенного файла будет доступен в адресном пространстве процесса.

Синтаксис функции следующий:

LPVOID MapViewOfFile ( HANDLE hFileMappingObject, DWORD dwDesiredAccess, DWORD dwFileOffsetHigh, DWORD dwFileOffsetLow, DWORD dwNumberOfBytesToMap)

Параметры:

hFileMappingObject - хэндл файла отображения

dwDesiredAccess - режим доступа

dwFileOffsetHigh - смещение в файле (старшее слово)

dwFileOffsetLow - смещение в файле (младшее слово)

dwNumberOfBytesToMap - количество отображаемых байт

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

Функция MapViewOfFile() создает окно размером dwNumberOfBytesToMap байт, которое смещено относительно начала файла на количество байт, заданное параметрами dwFileOffsetHigh и dwFileOffsetLow.

Если задать значение параметра dwNumberOfBytesToMap равное нулю, будет выполнено отображение всего файла.

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

Значение 64 Кбайта подходит в большинстве случаев.

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

Значение

Описание

FILE_MAP_WRITE

Доступ на запись и чтение. При создании отображения функции CreateFileMapping необходимо указать тип защиты PAGE_READWRITE

FILE_MAP_READ

Доступ только на чтение. При создании отображения необходимо указать тип защиты PAGE_READWRITE или PAGE_READ

FILE_MAP_ALL_ACCESS

Аналогично FILE_MAP_WRITE

FILE_MAP_COPY

Доступ для копирования при записи. При создании отображения необходимо указать атрибут PAGE_WRITECOPY

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

LPVOID MapViewOfFileEx ( HANDLE hFileMappingObject, DWORD dwDesiredAccess, DWORD dwFileOffsetHigh, DWORD dwFileOffsetLow, DWORD dwNumberOfBytesToMap, LPVOID lpBaseAddress)

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

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

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

Заметим, что функция MapViewOfFileEx() сама выполняет резервирование адресов, поэтому нет необходимости передавать ей адрес области памяти, полученный от функции VirtualAlloc().

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

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

Открытие отображения

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

HANDLE OpenFileMapping ( DWORD dwDesiredAccess, BOOL bInheritHandle, LPCTSTR lpName)

Параметры:

dwDesiredAccess - режим доступа.

bInheritHandle - флаг наследования.

lpName - адрес имени отображения файла.

Через параметр lpName этой функции следует передать имя открываемого отображения.

Имя должно быть задано точно также, как при создании отображения функцией CreateFileMapping().

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

Параметр dwDesiredAccess определяет требуемый режим доступа к отображению и указывается точно также, как и для описанной выше функции MapViewOfFile().

Параметр bInheritHandle определяет возможность наследования идентификатора отображения. Если он равен TRUE, порожденные процессы могут наследовать идентификатор, если FALSE - то нет.

Отмена отображения файла

Если созданное отображение больше не нужно, его следует отменить с помощью функции UnmapViewOfFile:

BOOL UnmapViewOfFile(LPVOID lpBaseAddress)

Параметры:

lpBaseAddress - адрес области отображения, полученный от функций MapViewOfFile() или MapViewOfFileEx().

Возвращаемое значение. При успешном выполнении - значение TRUE, иначе - при ошибке функция возвращает значение FALSE.

Если приложение создало несколько отображений для файла, то перед завершением работы с файлом все они должны быть отменены с помощью функции UnmapViewOfFile().

Далее с помощью функции CloseHandle() следует закрыть идентификаторы отображения, полученный от функции CreateFileMapping() и CreateFile().

Пример 1. Ниже приведем фрагмент кода, в котором создается отображение с именем $MyShareName$, причем это отображение создается в виртуальной памяти:

CHAR lpFileShareName[] = "$MyShareName$";

hFileMapping = CreateFileMapping((HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, 100, lpFileShareName);

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

В случае успеха эта функция вернет указатель на отображенную область памяти.

Итак, первый процесс создал отображение. Второй процесс, который будет выполнять обмен данными с первым процессом, должен открыть это отображение по имени при помощи функции OpenFileMapping(), например, так:

hFileMapping = OpenFileMapping(FILE_MAP_READ | FILE_MAP_WRITE, FALSE, lpFileShareName);

Далее второе приложение выполняет отображение, вызывая функцию MapViewOfFile():

lpFileMap = MapViewOfFile(hFileMapping,FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);

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

Таким образом, два процесса получили указатели на общие страницы памяти.

Перед завершением своей работы процессы должны отменить отображение файла и освободить идентификатор созданного объекта-отображения:

UnmapViewOfFile(lpFileMap);

CloseHandle(hFileMapping).


Подобные документы

  • Хранение различной информации как основное назначение памяти. Характеристика видов памяти. Память типа SRAM и DRAM. Кэш-память или сверхоперативная память, ее специфика и области применения. Последние новинки разработок в области в оперативной памяти.

    презентация [2,1 M], добавлен 01.12.2014

  • Внутренний кэш. Смешанная и разделенная кэш-память. Статическая и динамическая память. TLB как разновидность кэш-памяти. Организация кэш-памяти. Отображение секторов ОП в кэш-памяти. Иерархическая модель кэш-памяти. Ассоциативность кэш-памяти.

    курсовая работа [229,1 K], добавлен 04.11.2006

  • Объем двухпортовой памяти, расположенной на кристалле, для хранения программ и данных в процессорах ADSP-2106x. Метод двойного доступа к памяти. Кэш-команды и конфликты при обращении к данным по шине памяти. Пространство памяти многопроцессорной системы.

    реферат [28,1 K], добавлен 13.11.2009

  • Память персонального компьютера, виды и их характеристика. Классификация памяти компьютера. Кэш память как память с большей скоростью доступа, предназначенная для ускорения обращения к данным. Гибкие магнитные диски, CD-ROM, DVD-ROM и флэш-память.

    презентация [1,8 M], добавлен 15.11.2011

  • Обобщение основных видов и назначения оперативной памяти компьютера. Энергозависимая и энергонезависимая память. SRAM и DRAM. Триггеры, динамическое ОЗУ и его модификации. Кэш-память. Постоянное запоминающее устройство. Флэш-память. Виды внешней памяти.

    курсовая работа [1,7 M], добавлен 17.06.2013

  • Мониторинг системных вызовов. Системные вызовы shmget, shmat, shmctl, shmdt. Написание и внедрение модуля ядра. Выбор языка программирования. Структура программного обеспечения. Реализация мониторинга управления и удаления сегментов разделяемой памяти.

    курсовая работа [91,4 K], добавлен 24.06.2009

  • История появления и развития оперативной памяти. Общая характеристика наиболее популярных современных видов оперативной памяти - SRAM и DRAM. Память с изменением фазового состояния (PRAM). Тиристорная память с произвольным доступом, ее специфика.

    курсовая работа [548,9 K], добавлен 21.11.2014

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

    презентация [184,9 K], добавлен 12.01.2009

  • Сравнительный анализ статической и динамической памяти. Быстродействие и потребление энергии статической памятью. Объем памяти микросхем. Временные диаграммы чтения и записи памяти. Микросхемы синхронной и асинхронной памяти. Режимы модулей памяти.

    презентация [114,2 K], добавлен 27.08.2013

  • Используемые в компьютерах устройства памяти для хранения данных. Внутренние (оперативная и кэш-память) и внешние устройства памяти. Уровни иерархии во внутренней памяти. Подключения дисководов и управления их работой с помощью дискового контроллера.

    презентация [47,7 K], добавлен 26.11.2009

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.