Разделяемая память в многопоточных приложениях

Лекция

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

Разделяемая память (англ. Shared memory) является самым быстрым средством обмена данными между процессами.[1]

В других средствах межпроцессового взаимодействия (IPC) обмен информацией между процессами проходит через ядро, что приводит к переключению контекста между процессом и ядром, т.е. к потерям производительности.[2]

Техника разделяемой памяти позволяет осуществлять обмен информацией через общий для процессов сегмент памяти без использования системных вызовов ядра. Сегмент разделяемой памяти подключается в свободную часть виртуального адресного пространства процесса[3]. Таким образом, два разных процесса могут иметь разные адреса одной и той же ячейки подключенной разделяемой памяти.

Разделяемая память в многопоточных приложениях

Наглядное представление разделяемой памяти

Содержание

  • 1Краткое описание работы
  • 2Реализация технологии «клиент— сервер »
    • 2.1Сценарий использования разделяемой памяти
  • 3Программная реализация
    • 3.1В UNIX-подобных операционных системах
      • 3.1.1Разделяемая память в стиле UNIX System V
      • 3.1.2Разделяемая память POSIX
    • 3.2В операционных системах семейства Windows
    • 3.3Поддержка в языках программирования
  • 4См. также
  • 5Примечания

Краткое описание работы

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

Реализация технологии «клиент—сервер»

В схеме обмена данными между двумя процессами — (клиентом и сервером), использующими разделяемую память, — должна функционировать группа из двух семафоров. Первый семафор служит для блокирования доступа к разделяемой памяти, его разрешающий сигнал — 1, а запрещающий — 0. Второй семафор служит для сигнализации сервера о том, что клиент начал работу, при этом доступ к разделяемой памяти блокируется, и клиент читает данные из памяти . Об этом говорит сайт https://intellect.icu . Теперь при вызове операции сервером его работа будет приостановлена до освобождения памяти клиентом.

Сценарий использования разделяемой памяти

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

Программная реализация

В программном обеспечении разделяемой памятью называют:

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

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

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

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

В UNIX-подобных операционных системах

POSIX предоставляет стандартизированное API для работы с разделяемой памятью — POSIX Shared Memory. Одной из ключевых особенностей операционных систем семейства UNIX является механизм копирования процессов (системный вызов fork()), который позволяет создавать анонимные участки разделяемой памяти перед копированием процесса и наследовать их процессами-потомками. После копирования процесса разделяемая память будет доступна как родительскому, так и дочернему процессу.[3][4]

Существует два разных подхода к подключению и использованию разделяемой памяти:

  • в стиле UNIX System V, используя функции расширения POSIX:XSI (часть стандарта POSIX.1-2001) shmget, shmctl, shmat и shmdt[5];
  • через функции POSIX shm_open, shm_unlink, ftruncate и mmap (стандарт POSIX.1-2001)[6].

Разделяемая память в стиле UNIX System V

UNIX System V предоставляет набор функций языка C, позволяющий работать с разделяемой памятью[7]:

  • shmget — создание сегмента разделяемой памяти с привязкой к целочисленному идентификатору, либо анонимного сегмента разделяемой памяти (при указании вместо идентификатора значения IPC_PRIVATE)[8];
  • shmctl — установка параметров сегмента памяти[9];
  • shmat — подключение сегмента к адресному пространству процесса[4];
  • shmdt — отключение сегмента от адресного пространства процесса[10].

Именованная разделяемая память подразумевает ассоциацию с каждым участком памяти уникального числового ключа в рамках операционной системы , по которому в дальнейшем можно подключить разделяемую память в другом процессе.[8]

Разделяемая память POSIX

POSIX позволяет связать с объектом разделяемой памяти файловый дескриптор, что является более унифицированным механизмом, чем механизм UNIX System V. Для работы с памятью могут быть использованы следующие функции языка C:

  • shm_open — создание или подключение объекта разделяемой памяти POSIX по его имени[6];
  • shm_unlink — удаление объекта разделяемой памяти по его имени (при этом сегмент разделяемой памяти будет существовать, пока не будет отключен от всех процессов)[11];
  • ftruncate — задает или изменяет размер разделяемой памяти (или отображенного в память файла)[12];
  • mmap — подключает существующий или создает анонимный сегмент разделяемой памяти к адресному пространству процесса[3].

В операционных системах семейства Windows

В операционной системе Windows для создания разделяемой памяти используется функция CreateSharedMemory[13] из пакета Win32-SDK. C другой стороны, возможно использование функций CreateFileMapping и MapViewOfFile[14] из MSDN.

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

Некоторые библиотеки языка C++ предлагают доступ к работе с разделяемой памятью в кроссплатформенном виде. Например, библиотека Boost предоставляет классboost::interprocess::shared_memory_object[15] для POSIX-совместимых операционных систем, а библиотека Qt предоставляет класс QSharedMemory, унифицирующий доступ к разделяемой памяти для разных операционных систем с некоторыми ограничениями[16].

В Java 7 под операционной системой GNU/Linux разделяемая память может быть реализована отображением файла из каталога /dev/shm/ (либо /run/shm/, в зависимости от дистрибутива) в память [17] с помощью метода map класса java.nio.MappedByteBuffer[18].

Поддержка разделяемой памяти осуществлена во многих других языках программирования. Так, PHP предоставляет API[19] для создания разделяемой памяти, чьи функции схожи с функциями POSIX.

См. также

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

148
0

Заказать контрольную или курсовую/дипломную работу

У меня мало времени и хочу
Заказать работу
или
я специалист в данной области и
Хочу заработать

Без посредников, но с опцией гаранта

Rating 9 of 10. count vote: 2
You vote:



Комментарии


Оставить комментарий

ответить

Операционные системы и системное программировние

Термины: Операционные системы и системное программировние