stringtranslate.com

Общая память

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

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

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

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

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

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

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

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

Такие технологии, как перекрестные коммутаторы , сети Omega , HyperTransport или внешняя шина, можно использовать для смягчения эффектов узких мест.

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

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

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

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

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

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

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

По сравнению с операционными системами с несколькими адресными пространствами совместное использование памяти (особенно процедур совместного использования или структур на основе указателей) проще в операционных системах с одним адресным пространством . [2]

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

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

Общая память, созданная, shm_openявляется постоянной. Он остается в системе до тех пор, пока не будет явно удален процессом. Недостаток этого подхода заключается в том, что если процесс выйдет из строя и не удастся очистить разделяемую память, он останется до завершения работы системы; этого ограничения нет в реализации для Android, получившей название ashmem. [6]

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

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

Поддержка в Windows

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

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

Некоторые библиотеки C++ предоставляют переносимый и объектно-ориентированный доступ к функциям общей памяти. Например, Boost содержит библиотеку C++ Boost.Interprocess [9] , а Qt предоставляет класс QSharedMemory. [10]

Поддержка языков программирования

Для языков программирования с привязками POSIX (например, C/C++) области общей памяти можно создавать и получать к ним доступ путем вызова функций, предоставляемых операционной системой. Другие языки программирования могут иметь свои собственные способы использования этих операционных средств для достижения аналогичного эффекта. Например, PHP предоставляет API для создания общей памяти, аналогично функциям POSIX . [11]

Смотрите также

Рекомендации

  1. ^ Эль-Ревини, Хешам; Абд-эль-Барр, Мостафа (2005). Усовершенствованная компьютерная архитектура и параллельная обработка . Уайли-Интерсайенс. стр. 77–80. ISBN 978-0-471-46740-3.
  2. ^ Джеффри С. Чейз; Генри М. Леви; Майкл Дж. Фили; и Эдвард Д. Лазовска. «Совместное использование и защита в операционной системе единого адресного пространства». дои : 10.1145/195792.195795 1993. с. 3
  3. ^ Документация shm_open из единой спецификации Unix.
  4. ^ Роббинс, Кей А.; Роббинс, Стивен (2003). Системное программирование Unix: связь, параллелизм и потоки (2-е изд.). Прентис Холл PTR. п. 512. ИСБН 978-0-13-042411-2. Проверено 13 мая 2011 г. Межпроцессное взаимодействие POSIX (IPC) является частью расширения POSIX:XSI и берет свое начало в межпроцессном взаимодействии Unix System V.
  5. ^ Функция общей памяти из единой спецификации Unix.
  6. ^ «Функции ядра Android» . elinux.org . Проверено 12 декабря 2022 г.
  7. ^ Кристоф Роланд; Хью Дикинс; КОСАКИ Мотохиро. "tmpfs.txt". ядро.орг . Проверено 16 марта 2010 г.
  8. ^ Создание именованной общей памяти из MSDN.
  9. ^ Библиотека Boost.Interprocess C++
  10. ^ "Справочник класса QSharedMemory" .
  11. ^ Функции общей памяти в PHP-API

Внешние ссылки