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