В информатике , разделяемая память является памятью , которая может быть одновременно доступна по нескольким программам с намерением обеспечить связь между ними и избежать избыточных копий. Общая память - эффективное средство передачи данных между программами. В зависимости от контекста программы могут работать на одном процессоре или на нескольких отдельных процессорах.
Использование памяти для связи внутри одной программы, например, между ее несколькими потоками , также называется общей памятью.
На оборудовании [ править ]
В компьютерном оборудовании общая память относится к (как правило, большому) блоку оперативной памяти (ОЗУ), к которой могут обращаться несколько различных центральных процессоров (ЦП) в многопроцессорной компьютерной системе .
Системы с общей памятью могут использовать: [1]
- унифицированный доступ к памяти (UMA): все процессоры единообразно совместно используют физическую память;
- неравномерный доступ к памяти (NUMA): время доступа к памяти зависит от расположения памяти относительно процессора;
- Архитектура только кэш-памяти (COMA): локальная память для процессоров на каждом узле используется как кэш, а не как фактическая основная память.
Систему с общей памятью относительно легко программировать, поскольку все процессоры совместно используют единое представление данных, а обмен данными между процессорами может происходить так же быстро, как и доступ к памяти в одном и том же месте. Проблема с системами с общей памятью заключается в том, что многим процессорам требуется быстрый доступ к памяти и они, вероятно, будут кэшировать память , что имеет два осложнения:
- Ухудшение времени доступа: когда несколько процессоров пытаются получить доступ к одной и той же области памяти, это вызывает конкуренцию. Попытка получить доступ к соседним ячейкам памяти может привести к ложному обмену . Компьютеры с общей памятью не могут хорошо масштабироваться. У большинства из них десять или меньше процессоров;
- отсутствие согласованности данных: всякий раз, когда один кэш обновляется информацией, которая может использоваться другими процессорами, изменение необходимо отразить на других процессорах, в противном случае разные процессоры будут работать с несогласованными данными. Такие протоколы согласованности кэша могут, когда они хорошо работают, обеспечивать чрезвычайно высокопроизводительный доступ к общей информации между несколькими процессорами. С другой стороны, они иногда могут быть перегружены и стать узким местом для производительности.
Такие технологии, как перекрестные переключатели , сети Omega , HyperTransport или внешняя шина, могут использоваться для смягчения эффекта узких мест.
В случае гетерогенной системной архитектуры (архитектура процессора, которая объединяет различные типы процессоров, такие как ЦП и графические процессоры , с общей памятью), блок управления памятью (MMU) ЦП и блок управления памятью ввода-вывода (IOMMU) GPU должен иметь общие характеристики, например общее адресное пространство.
Альтернативами общей памяти являются распределенная память и распределенная общая память , каждая из которых имеет аналогичный набор проблем.
В программном обеспечении [ править ]
В компьютерном программном обеспечении общая память либо
- метод межпроцессного взаимодействия (IPC), то есть способ обмена данными между программами, работающими одновременно. Один процесс создаст область в ОЗУ, к которой будут иметь доступ другие процессы;
- метод экономии места в памяти путем направления доступа к тому, что обычно было бы копией части данных, вместо этого к одному экземпляру, с использованием отображений виртуальной памяти или с явной поддержкой рассматриваемой программы. Это чаще всего используется для разделяемых библиотек и для выполнения на месте (XIP).
Поскольку оба процесса могут обращаться к общей области памяти, как и к обычной рабочей памяти, это очень быстрый способ связи (в отличие от других механизмов IPC, таких как именованные каналы , сокеты домена Unix или CORBA ). С другой стороны, он менее масштабируемый, так как, например, коммуникационные процессы должны выполняться на одном компьютере (из других методов IPC только сокеты домена Интернета, а не сокеты домена Unix, могут использовать компьютерную сеть ), и необходимо соблюдать осторожность. принято во избежание проблем, если процессы, совместно использующие память, выполняются на отдельных процессорах, а базовая архитектура не является согласованной с кешем .
IPC с помощью общей памяти используется, например, для передачи изображений между приложением и X-сервером в системах Unix или внутри объекта IStream, возвращаемого CoMarshalInterThreadInterfaceInStream в библиотеках COM в Windows .
Динамические библиотеки обычно хранятся в памяти один раз и сопоставляются с несколькими процессами, и дублируются только страницы, которые должны были быть настроены для отдельного процесса (поскольку символ там разрешается по-разному), обычно с помощью механизма, известного как копирование при записи, которое прозрачно копирует страницу при попытке записи, а затем позволяет успешно выполнить запись в частной копии.
Поддержка Unix-подобных систем [ править ]
POSIX предоставляет стандартизированный API для использования общей памяти, POSIX Shared Memory . Здесь используется функция shm_open
из sys / mman.h. [2] POSIX межпроцессного взаимодействия (часть POSIX: XSI Extension) включает в себя функции совместно используемой памяти shmat
, shmctl
, shmdt
и shmget
. [3] [4] Unix System V также предоставляет API для разделяемой памяти. Это использует shmget из sys / shm.h. Системы BSD предоставляют «анонимную отображаемую память», которая может использоваться несколькими процессами.
Общая память, созданная с помощью shm_open
. Он остается в системе до тех пор, пока не будет явно удален процессом. У этого есть недостаток: если процесс выйдет из строя и не сможет очистить разделяемую память, он останется до завершения работы системы.
POSIX также предоставляет mmap
API для отображения файлов в память; отображение может быть общим, что позволяет использовать содержимое файла в качестве общей памяти.
Дистрибутивы Linux, основанные на ядре 2.6 и более поздних версиях, предлагают / dev / shm в качестве общей памяти в форме RAM-диска , а точнее, в качестве каталога с возможностью записи всем (каталог, в котором каждый пользователь системы может создавать файлы), который хранится в памяти. И дистрибутивы на основе RedHat, и Debian включают его по умолчанию. Поддержка этого типа RAM-диска не является обязательной в файле конфигурации ядра . [5]
Поддержка в Windows [ править ]
В Windows можно использовать CreateFileMapping
и MapViewOfFile
функцию для отображения области файла в память в нескольких процессах. [6]
Кросс-платформенная поддержка [ править ]
Некоторые библиотеки C ++ предоставляют переносимый и объектно-ориентированный доступ к функциям общей памяти. Например, Boost содержит библиотеку Boost.Interprocess C ++ [7], а Qt предоставляет класс QSharedMemory. [8]
Поддержка языков программирования [ править ]
Кроме C / C ++, имеется встроенная поддержка общей памяти и в других языках программирования. Например, PHP предоставляет API для создания общей памяти, аналогично функциям POSIX . [9]
См. Также [ править ]
- Распределенная память
- Распределенная разделяемая память
- Общая графическая память
- Гетерогенная системная архитектура
- Глобальная переменная
- Нано-нити
- Выполнить на месте
- Общий реестр
- Объекты общих снимков
- Узкое место в архитектуре фон Неймана
Ссылки [ править ]
- ^ Эль-Ревини, Хешам; Абд-эль-Барр, Мостафа (2005). Расширенная компьютерная архитектура и параллельная обработка . Wiley-Interscience. С. 77–80. ISBN 978-0-471-46740-3.
- ^ Документация shm_open из спецификации Single Unix
- ^ Роббинс, Кей А .; Роббинс, Стивен (2003). Системное программирование Unix: связь, параллелизм и потоки (2-е изд.). Prentice Hall PTR. п. 512 . ISBN 978-0-13-042411-2. Проверено 13 мая 2011 .
Межпроцессное взаимодействие (IPC) POSIX является частью расширения POSIX: XSI и берет свое начало в межпроцессном взаимодействии Unix System V.
- ^ Общая память из Единой спецификации Unix.
- ^ Кристоф Роланд; Хью Дикинс; KOSAKI Motohiro. "tmpfs.txt" . kernel.org . Проверено 16 марта 2010 .
- ^ Создание именованной общей памяти из MSDN.
- ^ Библиотека Boost.Interprocess C ++
- ^ "Описание класса QSharedMemory" .
- ^ Функции общей памяти в PHP-API
Внешние ссылки [ править ]
- IPC: Shared Memory , Дэйв Маршалл
- Общие сведения о памяти , гл. 12 из книги Ричарда Стивенса «Сетевое программирование UNIX, том 2, второе издание: межпроцессное взаимодействие».
- SharedHashFile , хеш-таблица с общей памятью с открытым исходным кодом.