Совместно используемая память () является самым быстрым средством обмена данными между процессами.
В других средствах межпроцессового взаимодействия (IPC) обмен информацией между процессами проходит через ядро, что приводит к переключению контекста между процессом и ядром, т.е. к потерям производительности.
Техника совместно используемой памяти позволяет осуществлять обмен информацией через общий для процессов сегмент памяти без использования системных вызовов ядра. Сегмент совместно используемой памяти подключается в свободную часть виртуального адресного пространства процесса. Таким образом, два разных процесса могут иметь разные адреса одной и той же ячейки, подключенной совместно используемой памяти.
Краткое описание работы После создания совместно используемого сегмента памяти любой из пользовательских процессов может подсоединить его к своему собственному виртуальному пространству и работать с ним как с обычным сегментом памяти. Недостатком такого обмена информацией является отсутствие каких бы то ни было средств синхронизации, однако для преодоления этого недостатка можно использовать технику семафоров.
Реализация технологии «клиент—сервер» В схеме обмена данными между двумя процессами — (клиентом и сервером), использующими совместно используемую память, — должна функционировать группа из двух семафоров. Первый семафор служит для блокирования доступа к совместно используемой памяти, его разрешающий сигнал — 1, а запрещающий — 0. Второй семафор служит для сигнализации сервера о том, что клиент начал работу, при этом доступ к совместно используемой памяти блокируется, и клиент читает данные из памяти. Теперь при вызове операции сервером его работа будет приостановлена до освобождения памяти клиентом.
Сценарий использования совместно используемой памяти Сервер получает доступ к совместно используемой памяти, используя семафор. Сервер производит запись данных в совместно используемую память. После завершения записи данных сервер освобождает доступ к совместно используемой памяти с помощью семафора. Клиент получает доступ к совместно используемой памяти, запирая доступ к этой памяти для других процессов с помощью семафора. Клиент производит чтение данных из совместно используемой памяти, а затем освобождает доступ к памяти с помощью семафора.
Программная реализация В программном обеспечении совместно используемой памятью называют: Метод межпроцессного взаимодействия (IPC), то есть способ обмена данными между программами, работающими одновременно. Один процесс создаёт область в оперативной памяти, которая может быть доступна для других процессов. Метод экономии памяти, путём прямого обращения к тем исходным данным, которые при обычном подходе являются отдельными копиями исходных данных, вместо отображения виртуальной памяти или описанного метода . Такой подход обычно используется для совместно используемых библиотек и для XIP. Поскольку оба процесса могут получить доступ к общей области памяти как к обычной памяти, это очень быстрый способ связи (в отличие от других механизмов IPC, таких как именованные каналы, UNIX-сокеты или CORBA). С другой стороны, такой способ менее гибкий, например, обменивающиеся процессы должны быть запущены на одной машине (из перечисленных методов IPC только сетевые сокеты, не путать с сокетами домена UNIX, могут вести обмен данными через сеть), и необходимо быть внимательным, чтобы избежать проблем при использовании совместно используемой памяти на разных ядрах процессора и аппаратной архитектуре без когерентного кэша.
Обмен данными через совместно используемую память используется, например, для передачи изображений между приложением и X-сервером на Unix-системах или внутри объекта IStream возвращаемого CoMarshalInterThreadInterfaceInStream в библиотеке COM под Windows.
Динамические библиотеки, как правило, загружаются в память один раз и отображены на несколько процессов, и только страницы, которые специфичны для отдельного процесса (поскольку отличаются некоторые идентификаторы) дублируются, как правило, с помощью механизма, известного как копирование-при-записи, который при попытке записи в совместно используемую память незаметно для вызывающего запись процесса копирует страницы памяти, а затем записывает данные в эту копию.
В UNIX-подобных операционных системах POSIX предоставляет стандартизированное API для работы с совместно используемой памятью — POSIX Shared Memory. Одной из ключевых особенностей операционных систем семейства UNIX является механизм копирования процессов (системный вызов fork()), который позволяет создавать анонимные участки совместно используемой памяти перед копированием процесса и наследовать их процессами-потомками. После копирования процесса совместно используемой память будет доступна как родительскому, так и дочернему процессу.
Существует два разных подхода к подключению и использованию совместно используемой памяти: в стиле UNIX System V, используя функции расширения POSIX:XSI (часть стандарта POSIX.1-2001) shmget, shmctl, shmat и shmdt; через функции POSIX shm_open, shm_unlink, ftruncate и mmap (стандарт POSIX.1-2001).
Совместно используемая память в стиле UNIX System V UNIX System V предоставляет набор функций языка C, позволяющий работать с совместно используемой памятью: shmget — создание сегмента совместно используемой памяти с привязкой к целочисленному идентификатору, либо анонимного сегмента совместно используемой памяти (при указании вместо идентификатора значения IPC_PRIVATE); shmctl — установка параметров сегмента памяти; shmat — подключение сегмента к адресному пространству процесса; shmdt — отключение сегмента от адресного пространства процесса. Именованная совместно используемая память подразумевает ассоциацию с каждым участком памяти уникального числового ключа в рамках операционной системы, по которому в дальнейшем можно подключить совместно используемой память в другом процессе.
совместно используемая память POSIX POSIX позволяет связать с объектом совместно используемой памяти файловый дескриптор, что является более унифицированным механизмом, чем механизм UNIX System V. Для работы с памятью могут быть использованы следующие функции языка C: shm_open — создание или подключение объекта совместно используемой памяти POSIX по его имени; shm_unlink — удаление объекта совместно используемой памяти по его имени (при этом сегмент совместно используемой памяти будет существовать, пока не будет отключен от всех процессов); ftruncate — задаёт или изменяет размер совместно используемой памяти (или отображённого в память файла); mmap — подключает существующий или создаёт анонимный сегмент совместно используемой памяти к адресному пространству процесса.
В операционных системах семейства Windows В операционной системе Windows для создания совместно используемой памяти используются функции CreateFileMapping и MapViewOfFile из MSDN.
Поддержка в языках программирования Некоторые библиотеки языка C++ предлагают доступ к работе с совместно используемой памятью в кроссплатформенном виде. Например, библиотека Boost предоставляет класс boost::interprocess::shared_memory_object для POSIX-совместимых операционных систем, а библиотека Qt предоставляет класс QSharedMemory, унифицирующий доступ к совместно используемой памяти для разных операционных систем с некоторыми ограничениями.
В Java 7 под операционной системой GNU/Linux совместно используемой память может быть реализована отображением файла из каталога /dev/shm/ (либо /run/shm/, в зависимости от дистрибутива) в память с помощью метода map класса java.nio.MappedByteBuffer.
Поддержка совместно используемой памяти осуществлена во многих других языках программирования. Так, PHP предоставляет API для создания совместно используемой памяти, чьи функции схожи с функциями POSIX.
См. также Состояние гонки Критическая секция Семафор Межпроцессное взаимодействие (IPC) Проблема ABA
Примечания
Категория:Управление памятью Категория:Обработка команд Категория:Межпроцессное взаимодействие