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, shmdtи shmget. [4] [5] Unix System V также предоставляет API для разделяемой памяти. Он использует shmget из sys/shm.h. Системы BSD предоставляют «анонимную отображаемую память», которая может использоваться несколькими процессами.

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

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

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

Поддержка Windows

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

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

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

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

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

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

Ссылки

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

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