Подтвердить что ты не робот

Общая память Linux: shmget() vs mmap()?

В этом потоке OP предлагается использовать mmap() вместо shmget() для получения разделяемой памяти в Linux. Я посетил эту страницу и эту страницу, чтобы получить некоторую документацию, но вторая дает неясный пример, касающийся mmap().

Будучи почти новичком и нуждающимся в обмене некоторой информацией (в текстовом виде) между двумя процессами, я должен использовать метод shmget() или mmap()? И почему?

4b9b3361

Ответ 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, которые вы, возможно, захотите использовать в определенных ситуациях.