Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску
Иллюстрация системы с общей памятью из трех процессоров.

В информатике , разделяемая память является памятью , которая может быть одновременно доступна по нескольким программам с намерением обеспечить связь между ними и избежать избыточных копий. Общая память - эффективное средство передачи данных между программами. В зависимости от контекста программы могут работать на одном процессоре или на нескольких отдельных процессорах.

Использование памяти для связи внутри одной программы, например, между ее несколькими потоками , также называется общей памятью.

На оборудовании [ править ]

HSA определяет особый случай совместного использования памяти, когда MMU CPU и IOMMU GPU имеют идентичное выгружаемое виртуальное адресное пространство.

В компьютерном оборудовании общая память относится к (как правило, большому) блоку оперативной памяти (ОЗУ), к которой могут обращаться несколько различных центральных процессоров (ЦП) в многопроцессорной компьютерной системе .

Системы с общей памятью могут использовать: [1]

Систему с общей памятью относительно легко программировать, поскольку все процессоры совместно используют единое представление данных, а обмен данными между процессорами может происходить так же быстро, как и доступ к памяти в одном и том же месте. Проблема с системами с общей памятью заключается в том, что многим процессорам требуется быстрый доступ к памяти и они, вероятно, будут кэшировать память , что имеет два осложнения:

  • Ухудшение времени доступа: когда несколько процессоров пытаются получить доступ к одной и той же области памяти, это вызывает конкуренцию. Попытка получить доступ к соседним ячейкам памяти может привести к ложному обмену . Компьютеры с общей памятью не могут хорошо масштабироваться. У большинства из них десять или меньше процессоров;
  • отсутствие согласованности данных: всякий раз, когда один кэш обновляется информацией, которая может использоваться другими процессорами, изменение необходимо отразить на других процессорах, в противном случае разные процессоры будут работать с несогласованными данными. Такие протоколы согласованности кэша могут, когда они хорошо работают, обеспечивать чрезвычайно высокопроизводительный доступ к общей информации между несколькими процессорами. С другой стороны, они иногда могут быть перегружены и стать узким местом для производительности.

Такие технологии, как перекрестные переключатели , сети 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 также предоставляет mmapAPI для отображения файлов в память; отображение может быть общим, что позволяет использовать содержимое файла в качестве общей памяти.

Дистрибутивы 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]

См. Также [ править ]

  • Распределенная память
  • Распределенная разделяемая память
  • Общая графическая память
  • Гетерогенная системная архитектура
  • Глобальная переменная
  • Нано-нити
  • Выполнить на месте
  • Общий реестр
  • Объекты общих снимков
  • Узкое место в архитектуре фон Неймана

Ссылки [ править ]

  1. ^ Эль-Ревини, Хешам; Абд-эль-Барр, Мостафа (2005). Расширенная компьютерная архитектура и параллельная обработка . Wiley-Interscience. С. 77–80. ISBN 978-0-471-46740-3.
  2. ^ Документация shm_open из спецификации Single Unix
  3. ^ Роббинс, Кей А .; Роббинс, Стивен (2003). Системное программирование Unix: связь, параллелизм и потоки (2-е изд.). Prentice Hall PTR. п. 512 . ISBN 978-0-13-042411-2. Проверено 13 мая 2011 . Межпроцессное взаимодействие (IPC) POSIX является частью расширения POSIX: XSI и берет свое начало в межпроцессном взаимодействии Unix System V.
  4. ^ Общая память из Единой спецификации Unix.
  5. ^ Кристоф Роланд; Хью Дикинс; KOSAKI Motohiro. "tmpfs.txt" . kernel.org . Проверено 16 марта 2010 .
  6. ^ Создание именованной общей памяти из MSDN.
  7. ^ Библиотека Boost.Interprocess C ++
  8. ^ "Описание класса QSharedMemory" .
  9. ^ Функции общей памяти в PHP-API

Внешние ссылки [ править ]

  • IPC: Shared Memory , Дэйв Маршалл
  • Общие сведения о памяти , гл. 12 из книги Ричарда Стивенса «Сетевое программирование UNIX, том 2, второе издание: межпроцессное взаимодействие».
  • SharedHashFile , хеш-таблица с общей памятью с открытым исходным кодом.