В информатике разделяемая память — это память , к которой могут одновременно обращаться несколько программ с целью обеспечить связь между ними или избежать избыточных копий. Общая память — эффективное средство передачи данных между программами. В зависимости от контекста программы могут работать на одном процессоре или на нескольких отдельных процессорах.
Использование памяти для связи внутри одной программы, например, между ее несколькими потоками , также называется общей памятью.
В компьютерном оборудовании под общей памятью понимается (обычно большой) блок оперативной памяти (ОЗУ), к которому могут обращаться несколько различных центральных процессоров (ЦП) в многопроцессорной компьютерной системе .
Системы с общей памятью могут использовать: [1]
Систему с общей памятью относительно легко программировать, поскольку все процессоры совместно используют единое представление данных, а связь между процессорами может быть такой же быстрой, как и доступ к памяти в одном и том же месте. Проблема с системами с общей памятью заключается в том, что многим процессорам необходим быстрый доступ к памяти и, скорее всего, они будут кэшировать память , что имеет две сложности:
Такие технологии, как перекрестные коммутаторы , сети Omega , HyperTransport или внешняя шина, можно использовать для смягчения эффектов узких мест.
В случае гетерогенной системной архитектуры (архитектура процессора, которая объединяет различные типы процессоров, такие как ЦП и ГП , с общей памятью), блок управления памятью (MMU) ЦП и блок управления памятью ввода-вывода (IOMMU) графический процессор должен иметь общие характеристики, например общее адресное пространство.
Альтернативами общей памяти являются распределенная память и распределенная разделяемая память , каждая из которых имеет схожий набор проблем.
В компьютерном программном обеспечении общая память либо
Поскольку оба процесса могут обращаться к области общей памяти, как к обычной рабочей памяти, это очень быстрый способ связи (в отличие от других механизмов IPC, таких как именованные каналы , доменные сокеты Unix или CORBA ). С другой стороны, он менее масштабируем, поскольку, например, процессы связи должны выполняться на одной и той же машине (из других методов IPC только сокеты домена Интернета, а не сокеты домена Unix, могут использовать компьютерную сеть ), и необходимо соблюдать осторожность. Это делается во избежание проблем, если процессы, совместно использующие память, выполняются на отдельных процессорах, а базовая архитектура не является когерентной кеш-памятью .
IPC по общей памяти используется, например, для передачи изображений между приложением и X-сервером в системах Unix или внутри объекта IStream, возвращаемого CoMarshalInterThreadInterfaceInStream в COM-библиотеках под Windows .
Динамические библиотеки обычно хранятся в памяти один раз и сопоставляются с несколькими процессами, и дублируются только страницы, которые нужно было настроить для отдельного процесса (поскольку символ там разрешается по-другому), обычно с помощью механизма, известного как копирование при записи , который прозрачно копирует страницу при попытке записи, а затем разрешает успешную запись в частную копию.
По сравнению с операционными системами с несколькими адресными пространствами совместное использование памяти (особенно процедур совместного использования или структур на основе указателей) проще в операционных системах с одним адресным пространством . [2]
POSIX предоставляет стандартизированный API для использования общей памяти — POSIX Shared Memory . При этом используется функция shm_open
из sys/mman.h. [3] Межпроцессное взаимодействие POSIX (часть расширения POSIX:XSI) включает функции общей памяти shmat
, shmctl
и . [4] [5] Unix System V также предоставляет API для общей памяти. Для этого используется shmget из sys/shm.h. Системы BSD предоставляют «анонимную отображаемую память», которая может использоваться несколькими процессами.shmdt
shmget
Общая память, созданная, shm_open
является постоянной. Он остается в системе до тех пор, пока не будет явно удален процессом. Недостаток этого способа заключается в том, что если процесс выйдет из строя и не удастся очистить общую память, он останется в памяти до завершения работы системы; этого ограничения нет в реализации для Android, получившей название ashmem
. [6]
POSIX также предоставляет mmap
API для отображения файлов в памяти; отображение может быть общим, что позволяет использовать содержимое файла в качестве общей памяти.
Дистрибутивы Linux, основанные на ядре 2.6 и более поздних версиях, предлагают /dev/shm в качестве разделяемой памяти в виде RAM-диска , точнее, в качестве общедоступного каталога (каталог, в котором каждый пользователь системы может создавать файлы), который хранится в памяти. Оба дистрибутива на основе RedHat и Debian включают его по умолчанию. Поддержка этого типа RAM-диска совершенно необязательна в файле конфигурации ядра . [7]
В Windows можно использовать функции CreateFileMapping
и MapViewOfFile
для отображения области файла в памяти в нескольких процессах. [8]
Некоторые библиотеки C++ предоставляют переносимый и объектно-ориентированный доступ к функциям общей памяти. Например, Boost содержит библиотеку C++ Boost.Interprocess [9] , а Qt предоставляет класс QSharedMemory. [10]
Для языков программирования с привязками POSIX (например, C/C++) области общей памяти можно создавать и получать к ним доступ путем вызова функций, предоставляемых операционной системой. Другие языки программирования могут иметь свои собственные способы использования этих операционных средств для достижения аналогичного эффекта. Например, PHP предоставляет API для создания общей памяти, аналогично функциям POSIX . [11]
Межпроцессное взаимодействие POSIX (IPC) является частью расширения POSIX:XSI и берет свое начало в межпроцессном взаимодействии Unix System V.