7.3.3 Совместно используемая память POSIX

Предыдущая  Содержание  Следующая V*D*V

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

 

Отсутствуют накладные расходы системного вызова при чтении или записи данных.

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

 

Функции, используемые для создания и удаления общей памяти, приведены в Таблице 7.4.

 

Таблица 7.4 Функции для работы с общей памятью POSIX.1b

 

Метод

Описание

shm_open

Открывает объект в общей памяти

shm_unlink

Удаляет объект из общей памяти

 

shm_open создаёт новый POSIX объект в разделяемой памяти или открывает существующий. Функция возвращает дескриптор, который может быть использован другими функциями, такими как ftruncate и mmap. shm_open создаёт сегмент разделяемой памяти размером 0. ftruncate устанавливает желаемый размер сегмента общей памяти, а mmap затем связывает  этот сегмент с адресным пространством процесса. Сегмент разделяемой памяти удаляется с помощью shm_unlink.  Их использование иллюстрирует Распечатка 7.7.

 

Реализация в Linux

 

Поддержка общей памяти POSIX в Linux использует файловую систему tmpfs, смонтированную в /dev/shm.

 

# cat /etc/fstab

none   /dev/shm   tmpfs   defaults   0 0

 

Объект разделяемой памяти, созданный с помощью shm_open, представлен в tmpfs в виде файла. Удалите в Распечатке 7.7 вызов shm_unlink и запустите программу снова. Вы должны увидеть в /dev/shm файл my_shm.

 

# ls -l /dev/shm

-rw-r--r--  1 root root 1024 Aug 19 18:57 my_shm

 

Это показывает файл my_shm размером 1024 байт, который является размером нашей общей памяти. Таким образом, мы можем использовать для работы с общей памятью все файловые операции. Например, мы можем получить содержимое общей памяти, выполнив для этого файла команду cat. Также мы можем использовать для удаления общей памяти команду rm прямо из оболочки.

 

Что следует помнить

 

Помните о блокировании области разделяемой памяти с помощью mlock.

Для синхронизации доступа к совместно используемой области памяти используйте семафоры POSIX.

Размер области общей памяти может быть получен с помощью функции fstat.

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

Не вызывайте shm_unlink, если вы хотите сохранить общую область памяти даже после завершения процесса.

 

 

Предыдущая  Содержание  Следующая