Зачем использовать общую память SysV или POSIX против mmap ()?

необходимость использования IPC для передачи больших объемов данных (200kb+) от дочернего процесса к родительскому в OS X 10.4 и выше, я прочитал об общей памяти в Unix, в частности о механизмах общей памяти System V и POSIX. Затем я понял, что mmap() можно использовать с флагами MAP_ANON и MAP_SHARED, чтобы сделать аналогичную вещь (или просто с флагом MAP_SHARED, если я не против создания обычного файла).

мой вопрос в том, есть ли причина не просто использовать mmap()? Кажется гораздо проще, память по-прежнему общая, и ей не нужно создавать реальный файл, если я использую MAP_ANON. Я могу создать файл в Родительском процессе, затем fork() и exec () дочерний и использовать его в дочернем процессе.

вторая часть вопроса заключается в том, каковы были бы причины, по которым этот подход недостаточен, и нужно было бы использовать механизмы общей памяти SysV или POSIX?

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

4 ответов


Если у вас есть отношения родитель / ребенок, это прекрасно использовать mmap.

sysv_shm-это оригинальная реализация unix, которая позволяет связанным и несвязанным процессам совместно использовать память. posix_shm стандартизированная общая память.

Если вы находитесь в системе posix без mmap, вы бы использовали posix_shm. Если вы находитесь в unix без posix_shm, вы бы использовали sysv_shm. Если вам нужно только поделиться памятью с родителем / ребенком, вы бы использовали mmap, если он доступен.


shm в Linux обычно реализуется через получает mmapped, поэтому производительность должна быть эквивалентной - я бы пошел с mmap (w/MAP_ANON и MAP_SHARED как вы упомянули) для простоты, если я знаю, что переносимость не является проблемой,как вы говорите, для вас.


Если память служит, единственная причина использовать SysV / POSIX over mmap - Это портативность. В частности, старые системы Unix не поддерживают MAP_ANON. Solaris, Linux, BSDs и OS X do, однако, так что на практике, есть мало причин не использовать mmap.


насколько документация знает,должны используйте общую память SYSV, если вы хотите использовать Xlib/XCB изображения с общей памятью.