Зачем использовать общую память 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 обычно реализуется через получает mmap
ped, поэтому производительность должна быть эквивалентной - я бы пошел с mmap
(w/MAP_ANON
и MAP_SHARED
как вы упомянули) для простоты, если я знаю, что переносимость не является проблемой,как вы говорите, для вас.
Если память служит, единственная причина использовать SysV / POSIX over mmap
- Это портативность. В частности, старые системы Unix не поддерживают MAP_ANON
. Solaris, Linux, BSDs и OS X do, однако, так что на практике, есть мало причин не использовать mmap
.
насколько документация знает,должны используйте общую память SYSV, если вы хотите использовать Xlib/XCB изображения с общей памятью.