Совместное использование памяти в Linux

мотивация

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

Что я хочу

У меня есть программы A и B, где A вызывает B. Как я могу

  1. Создать блок памяти из программы A
  2. Вызовите программу B из программы A, передав ей информацию о том, где найти блок памяти.
  3. Используйте блок памяти из обеих программ.

Более конкретно, A декодирует пользовательский формат видео и помещает один несжатый кадр в общий буфер. B читает из буфера и кодирует его в выходную строку. Декодер декодирует до 100 кадров в секунду, что составляет около 500 МБ / с трафика памяти. Каналы оказались медленными, поскольку данные нужно копировать слишком часто, а буферы не очень большие.

То, что я думаю, может сработать

Моя идея состоит в том, чтобы использовать mmap(NULL,len,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0) создать раздел общей памяти. Проблема в том, что manpage execve(2) состояния:

Отображения памяти не сохраняются (mmap(2)).

Итак, как я могу поделиться этой памятью с другой программой? Лучше ли объединить обе функции в одну программу и использовать fork вместо?

1 ответ

Решение

* В системах nix есть несколько API для совместной памяти:

  • BSD: использовать mmap(), Чтобы разделить память между несвязанными процессами, вы связываете ее с файлом. Вы также можете разделить память между связанными процессами, используя MAP_ANONYMOUS а также fork()ing (но не забудьте использовать -1 как fd для мобильности).
  • Система V: (некоторые люди действительно не любят этот) использовать shmget() создать / получить ссылку на общую область памяти, прикрепить к ней через shmat()отсоединить через shmdt(), отметьте для удаления shmctl(), Вы определяете общие области памяти по ключу, который должен быть уникальным.
  • POSIX: использовать shm_open() затем mmap() из возвращенного дескриптора файла.
Другие вопросы по тегам