Разделяемая памятьСовместно используемая память (англ. Shared memory) является самым быстрым средством обмена данными между процессами[1]. В других средствах межпроцессового взаимодействия (IPC) обмен информацией между процессами проходит через ядро, что приводит к переключению контекста между процессом и ядром, т.е. к потерям производительности[2]. Техника совместно используемой памяти позволяет осуществлять обмен информацией через общий для процессов сегмент памяти без использования системных вызовов ядра. Сегмент совместно используемой памяти подключается в свободную часть виртуального адресного пространства процесса[3]. Таким образом, два разных процесса могут иметь разные адреса одной и той же ячейки, подключенной совместно используемой памяти. Краткое описание работыПосле создания совместно используемого сегмента памяти любой из пользовательских процессов может подсоединить его к своему собственному виртуальному пространству и работать с ним как с обычным сегментом памяти. Недостатком такого обмена информацией является отсутствие каких бы то ни было средств синхронизации, однако для преодоления этого недостатка можно использовать технику семафоров. Реализация технологии «клиент—сервер»В схеме обмена данными между двумя процессами — (клиентом и сервером), использующими совместно используемую память, — должна функционировать группа из двух семафоров. Первый семафор служит для блокирования доступа к совместно используемой памяти, его разрешающий сигнал — 1, а запрещающий — 0. Второй семафор служит для сигнализации сервера о том, что клиент начал работу, при этом доступ к совместно используемой памяти блокируется, и клиент читает данные из памяти. Теперь при вызове операции сервером его работа будет приостановлена до освобождения памяти клиентом. Сценарий использования совместно используемой памяти
Программная реализацияВ программном обеспечении совместно используемой памятью называют:
Поскольку оба процесса могут получить доступ к общей области памяти как к обычной памяти, это очень быстрый способ связи (в отличие от других механизмов IPC, таких как именованные каналы, UNIX-сокеты или CORBA). С другой стороны, такой способ менее гибкий, например, обменивающиеся процессы должны быть запущены на одной машине (из перечисленных методов IPC только сетевые сокеты, не путать с сокетами домена UNIX, могут вести обмен данными через сеть), и необходимо быть внимательным, чтобы избежать проблем при использовании совместно используемой памяти на разных ядрах процессора и аппаратной архитектуре без когерентного кэша. Обмен данными через совместно используемую память используется, например, для передачи изображений между приложением и X-сервером на Unix-системах или внутри объекта IStream возвращаемого CoMarshalInterThreadInterfaceInStream в библиотеке COM под Windows. Динамические библиотеки, как правило, загружаются в память один раз и отображены на несколько процессов, и только страницы, которые специфичны для отдельного процесса (поскольку отличаются некоторые идентификаторы) дублируются, как правило, с помощью механизма, известного как копирование-при-записи, который при попытке записи в совместно используемую память незаметно для вызывающего запись процесса копирует страницы памяти, а затем записывает данные в эту копию. В UNIX-подобных операционных системахPOSIX предоставляет стандартизированное API для работы с совместно используемой памятью — POSIX Shared Memory. Одной из ключевых особенностей операционных систем семейства UNIX является механизм копирования процессов (системный вызов Существует два разных подхода к подключению и использованию совместно используемой памяти:
Совместно используемая память в стиле UNIX System VUNIX System V предоставляет набор функций языка C, позволяющий работать с совместно используемой памятью[7]:
Именованная совместно используемая память подразумевает ассоциацию с каждым участком памяти уникального числового ключа в рамках операционной системы, по которому в дальнейшем можно подключить совместно используемой память в другом процессе.[8] совместно используемая память POSIXPOSIX позволяет связать с объектом совместно используемой памяти файловый дескриптор, что является более унифицированным механизмом, чем механизм UNIX System V. Для работы с памятью могут быть использованы следующие функции языка C:
В операционных системах семейства WindowsВ операционной системе Windows для создания совместно используемой памяти используются функции Поддержка в языках программированияНекоторые библиотеки языка C++ предлагают доступ к работе с совместно используемой памятью в кроссплатформенном виде. Например, библиотека Boost предоставляет класс В Java 7 под операционной системой GNU/Linux совместно используемой память может быть реализована отображением файла из каталога Поддержка совместно используемой памяти осуществлена во многих других языках программирования. Так, PHP предоставляет API[18] для создания совместно используемой памяти, чьи функции схожи с функциями POSIX. См. такжеПримечания
|