В информатике разделяемая память — это память , к которой могут одновременно обращаться несколько программ с целью обеспечения связи между ними или избежания избыточных копий. Разделяемая память — это эффективное средство передачи данных между программами. В зависимости от контекста программы могут работать на одном процессоре или на нескольких отдельных процессорах.
Использование памяти для связи внутри одной программы, например, между ее несколькими потоками , также называется общей памятью.
В компьютерном оборудовании общая память относится к (обычно большому) блоку оперативной памяти (ОЗУ), к которому могут обращаться несколько различных центральных процессоров (ЦП) в многопроцессорной компьютерной системе .
Системы с общей памятью могут использовать: [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
, shmdt
и shmget
. [4] [5] Unix System V также предоставляет API для разделяемой памяти. Он использует shmget из sys/shm.h. Системы BSD предоставляют «анонимную отображаемую память», которая может использоваться несколькими процессами.
Общая память, созданная с помощью, shm_open
является постоянной. Она остается в системе до тех пор, пока явно не будет удалена процессом. Это имеет недостаток в том, что если процесс аварийно завершает работу и не может очистить общую память, она останется до выключения системы; это ограничение отсутствует в специфичной для Android реализации, названной ashmem
. [6]
POSIX также предоставляет mmap
API для отображения файлов в память; отображение может быть общим, что позволяет использовать содержимое файла в качестве общей памяти.
Дистрибутивы Linux на основе ядра 2.6 и более поздних версий предлагают /dev/shm как разделяемую память в форме RAM-диска , а точнее как каталог, доступный для записи всем пользователям (каталог, в котором каждый пользователь системы может создавать файлы), который хранится в памяти. Дистрибутивы на основе RedHat и Debian включают его по умолчанию. Поддержка этого типа RAM-диска полностью необязательна в файле конфигурации ядра . [7]
В Windows можно использовать функции CreateFileMapping
и MapViewOfFile
для отображения области файла в памяти в нескольких процессах. [8]
Некоторые библиотеки C++ предоставляют переносимый и объектно-ориентированный доступ к функциональности общей памяти. Например, Boost содержит библиотеку Boost.Interprocess C++ [9] , а Qt предоставляет класс QSharedMemory. [10]
Для языков программирования с привязками POSIX (например, C/C++) можно создавать области общей памяти и получать к ним доступ, вызывая функции, предоставляемые операционной системой. Другие языки программирования могут иметь свои собственные способы использования этих операционных возможностей для аналогичного эффекта. Например, PHP предоставляет API для создания общей памяти, аналогичной функциям POSIX . [11]
Межпроцессное взаимодействие POSIX (IPC) является частью расширения POSIX:XSI и берет свое начало в межпроцессном взаимодействии Unix System V.