2013-10-02 3 views
2

В чем разница между объектом общей памяти (созданным с использованием shm_open) и сегментом общей памяти (shmget)?сегмент разделяемой памяти и объект общей памяти

Есть ли у них какие-либо ограничения, которые не могут быть настроены, как в случае общей памяти shmmax и shmall?

Есть ли различия в производительности между этими двумя, и в каких сценариях IPC они должны использоваться?

ответ

-2

«shmget» - это метод выделения общей памяти, реализованный в ядре Linux Linux.

«shm_open» - это библиотечная функция, которая эмулирует общую память путем сопоставления файлов с помощью mmap. Поскольку файлы сопоставляются с использованием «общего» флага, память распределяется между процессами.

В Linux 1.x каталог «/ dev/shm» (содержащий файлы) был обычным каталогом, поэтому разделяемая память с использованием «shm_open» действительно была файлами на диске. В Linux 3.x "/ dev/shm" - это специальный каталог, который позволяет избежать того, что разделяемая память действительно должна быть записана на диск.

Я думаю, что оба этих метода могут быть заменены другим. Только из-за исторических причин, почему существуют два разных способа создания разделяемой памяти.

+0

Я не думаю, что «shmget» - это «Linux-специфический» метод. «Функция библиотеки» довольно неопределенная, и она также относится к «shmget» независимо от того, что означает термин. – WiSaGaN

+0

Очевидно, что это не зависит от Linux - в этом случае вы правы. Термин «функция библиотеки» означает, что функция не реализована в ядре ОС, но реализована в пользовательском пространстве. Для Linux версий 1.x это абсолютно верно. –

1

Я нашел в тестировании, что доступ к памяти через shm_open был быстрее, чем доступ к памяти через shmget. Помимо этого, они довольно похожи с точки зрения особенностей. Должны быть какие-то тонкие различия в кеш или TLB между ними, но я не знаком с деталями под капотом.

Примечание. Для увеличения этой производительности мне пришлось использовать опцию POPULATE для shm_open.

Смежные вопросы