Общая память Posix против сопоставленных файлов - PullRequest
24 голосов
/ 15 февраля 2010

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

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

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

Спасибо.

Ответы [ 3 ]

15 голосов
/ 15 февраля 2010

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

2 голосов
/ 15 февраля 2010

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

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

0 голосов
/ 02 октября 2011

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

...