Общая память - Shared memory

Иллюстрация системы с общей памятью из трех процессоров.

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

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

В аппаратном обеспечении

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

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

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

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

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

Такие технологии, как поперечные переключатели, Омега сети, Гипертранспорт или же фронтальный автобус может использоваться для ослабления эффекта «узкого места».

В случае Гетерогенная системная архитектура (архитектура процессора, которая объединяет различные типы процессоров, например Процессоры и GPU, с общей памятью), блок управления памятью (MMU) ЦП и блок управления памятью ввода-вывода (IOMMU) графического процессора должны иметь общие характеристики, например общее адресное пространство.

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

В программном обеспечении

В компьютерном программном обеспечении Общая память либо

  • метод межпроцессного взаимодействия (IPC), то есть способ обмена данными между программами, работающими одновременно. Один процесс создаст область в баран какие другие процессы могут получить доступ;
  • метод экономии пространства памяти путем направления доступа к тому, что обычно было бы копией части данных, вместо этого к одному экземпляру, используя виртуальная память сопоставления или с явной поддержкой рассматриваемой программы. Это чаще всего используется для общие библиотеки и для Выполнить на месте (XIP).

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

IPC с общей памятью используется, например, для передачи изображений между приложением и X сервер в системах Unix или внутри объекта IStream, возвращаемого CoMarshalInterThreadInterfaceInStream в библиотеках COM под Windows.

Динамические библиотеки обычно хранятся в памяти один раз и отображаются на несколько процессов, и только страницы, которые должны были быть настроены для отдельного процесса (потому что символ там разрешен по-разному), дублируются, обычно с помощью механизма, известного как копирование при записи который прозрачно копирует страницу при попытке записи, а затем позволяет успешно выполнить запись в частной копии.

Поддержка Unix-подобных систем

POSIX предоставляет стандартизированный API для использования общей памяти, Общая память POSIX. Здесь используется функция shm_open из sys / mman.h.[2] Межпроцессное взаимодействие POSIX (часть POSIX: XSI Extension) включает функции совместно используемой памяти. шмат, shmctl, шмдт и шмгет.[3][4] Unix System V также предоставляет API для общей памяти. Это использует shmget из sys / shm.h. Системы BSD предоставляют «анонимную отображаемую память», которая может использоваться несколькими процессами.

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

POSIX также предоставляет mmap API для отображения файлов в память; отображение может быть общим, что позволяет использовать содержимое файла в качестве общей памяти.

Дистрибутивы Linux, основанные на ядре 2.6 и более поздних версиях, предлагают / dev / shm в качестве общей памяти в виде RAM-диск, более конкретно как каталог с возможностью записи всем (каталог, в котором каждый пользователь системы может создавать файлы), который хранится в памяти. Оба Красная шляпа и Debian дистрибутивы на основе включают его по умолчанию. Поддержка этого типа RAM-диска в ядре не является обязательной. конфигурационный файл.[5]

Поддержка в Windows

В Windows можно использовать CreateFileMapping и MapViewOfFile функции для отображения области файла в память в нескольких процессах.[6]

Кросс-платформенная поддержка

Некоторые библиотеки C ++ предоставляют переносимый и объектно-ориентированный доступ к функциям общей памяти. Например, Способствовать росту содержит библиотеку 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 из единой спецификации Unix
  3. ^ Роббинс, Кей А .; Роббинс, Стивен (2003). Системное программирование Unix: связь, параллелизм и потоки (2-е изд.). Prentice Hall PTR. п.512. ISBN  978-0-13-042411-2. Получено 2011-05-13. Межпроцессное взаимодействие (IPC) POSIX является частью POSIX: XSI Extension и берет свое начало в межпроцессном взаимодействии Unix System V.
  4. ^ Общая память из спецификации Single Unix.
  5. ^ Кристоф Роланд; Хью Дикинс; KOSAKI Motohiro. "tmpfs.txt". kernel.org. Получено 2010-03-16.
  6. ^ Создание именованной общей памяти из MSDN.
  7. ^ Библиотека Boost.Interprocess C ++
  8. ^ "Описание класса QSharedMemory".
  9. ^ Функции общей памяти в PHP-API

внешняя ссылка

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