Вопрос

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

Оба, похоже, используют подсистему /dev/tmpfs, а не старый механизм IPC.

Так есть ли какое-либо преимущество использования файла mmap перед общей памятью?

Спасибо.

Это было полезно?

Решение

Различие не всегда четкое.Общая память может быть реализована через файлы, отображаемые в памяти. Отличную статью об этом можно найти здесь (применительно к программированию на C/C++).

Другие советы

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

Использование функции mmap() ограничено системным значением QSHRMEMCTL.Если это системное значение равно 0, функция mmap() не может создать общее сопоставление с возможностью PROT_WRITE.По сути, это предотвращает создание карты памяти, которая может изменить содержимое отображаемого файла потока.Если параметр flags указывает MAP_SHARED, параметр prot указывает PROT_WRITE, а системное значение QSHRMEMCTL равно 0, то функции mmap() завершатся ошибкой и результатом будет номер ошибки EACCES.

По сути, общая память является формой IPC. Общая область создается в /dev/shm, которая создается только в памяти (ОЗУ) и не требует никаких дисковых операций, следовательно, это более быстрый метод IPC. Хотя IPC можно выполнить с помощью дисковый файл, а затем также использовать mmap, но это будет сравнительно медленно. Альтернативно вы всегда можете использовать MAP_ANONYMOUS с mmap, который не выполняет резервное копирование ни с одним файлом диска.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top