Зачем использовать разделяемую память SysV или POSIX против mmap ()? - PullRequest
10 голосов
/ 14 июля 2009

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

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

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

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

Ответы [ 4 ]

9 голосов
/ 15 июля 2009

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

sysv_shm - исходная реализация Unix, которая позволяет связанным и не связанным процессам совместно использовать память posix_shm стандартизированная разделяемая память.

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

1 голос
/ 14 июля 2009

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

1 голос
/ 14 июля 2009

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

0 голосов
/ 28 августа 2017

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

...