Совместное использование памяти в Linux
мотивация
Я хотел бы написать пару программ, в которых одна программа считывает данные и передает их во внутренний формат, а другая программа передает внутренний формат во что-то другое. В качестве упражнения я хочу закодировать взаимодействие между этими программами без использования каналов. Я предпочитаю использовать сигналы и общую память.
Что я хочу
У меня есть программы A и B, где A вызывает B. Как я могу
- Создать блок памяти из программы A
- Вызовите программу B из программы A, передав ей информацию о том, где найти блок памяти.
- Используйте блок памяти из обеих программ.
Более конкретно, 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()
из возвращенного дескриптора файла.