Общая память Linux: shmget() vs mmap()?
В этом потоке OP предлагается использовать mmap()
вместо shmget()
для получения разделяемой памяти в Linux. Я посетил эту страницу и эту страницу, чтобы получить некоторую документацию, но вторая дает неясный пример, касающийся mmap()
.
Будучи почти новичком и нуждающимся в обмене некоторой информацией (в текстовом виде) между двумя процессами, я должен использовать метод shmget()
или mmap()
? И почему?
Ответы
Ответ 1
Оба метода жизнеспособны. Метод mmap
немного более shmget
, чем shmget
, но проще в использовании. shmget
- это старая модель совместно используемой памяти System V, имеющая самую широкую поддержку. mmap
/shm_open
- это новый POSIX-способ сделать разделяемую память более простым в использовании. Если ваша ОС позволяет использовать разделяемую память POSIX, я бы посоветовал пойти на это.
Некоторые намеки:
- Если вы создаете своих детей с помощью
fork
тогда mmap
с MAP_ANONYMOUS | MAP_SHARED
MAP_ANONYMOUS | MAP_SHARED
- самый простой способ - всего один вызов. MAP_ANONYMOUS
, однако, является расширением Linux, которое не указано в POSIX. - Если вы запускаете процессы независимо, но можете предоставить им имя общей памяти, тогда
shm_open
(+ ftruncate
) + mmap
с MAP_SHARED
- это два/три вызова. Требуется librt
на некоторых ОС. - Если ваша ОС имеет
/dev/shm/
то shm_open
эквивалентно открытию файла в /dev/shm/
.
Ответ 2
Многое связано с историей и будущими направлениями.
Когда-то существовали две основные (и несколько конкурирующие) версии unix - system V и BSD. У SysV были свои версии IPC, включая большую 3-разделяемую память, семафоры и очереди сообщений. POSIX пришел, чтобы попытаться объединить вещи.
Итак, в настоящее время у нас есть две версии - разделенная память posix, MQ и семафоры и версии sysV. Просто чтобы сделать вещи немного более запутанными, версии sysV также являются частью posix.
Итак, в основном ваш вопрос заключается в том, хотите ли вы использовать общую память Posix или sysV? В целом большинство людей берут долгосрочный взгляд и выбирают Posix, потому что это, кажется, дорога в будущее. Но, реалистично, sysV-материал настолько встроен во множество систем, что у вас должны быть серьезные сомнения в том, что он когда-нибудь исчезнет.
Итак, устраняя долгосрочные вещи, это сводится к тому, что имеет смысл для вашего проекта и ваших вкусов. В целом версии sysV имеют тенденцию на самом деле быть несколько более мощными, но у них есть неуклюжий интерфейс, который большинство людей на первый взгляд немного сбивает с толку при первом контакте. Особенно это касается семафоров sysV и очередей сообщений. В терминах разделяемой памяти можно утверждать, что и sysV, и posix неудобны. В версиях sysV есть неуклюжий ftok
и ключевой материал, в то время как posix заканчивает выполнение нескольких вызовов и некоторых условий гонки для настройки. С другой стороны, версии posix имеют преимущество в том, что они используют файловую систему и могут поддерживаться со стандартными функциями командной строки, такими как "rm", а не полагаться на отдельные служебные программы (например, ipcs
), которые требуется sysV.
Итак, что вы должны использовать? Как правило, версии posix. Но вы действительно должны ознакомиться с версиями sysV. У них есть некоторые функции, выходящие за рамки возможностей posix, которые вы, возможно, захотите использовать в определенных ситуациях.