Каков наиболее эффективный способ обмена большими объемами данных между двумя процессами? - PullRequest
3 голосов
/ 29 августа 2009

Недавно я создаю программное обеспечение для DVR .

Он будет установлен на сервере x86 с подключенной 2 или более платой видеокодера PCIE x4.

У нас есть 2 отдельных процесса, один должен получить закодированные видеоданные с этой карты кодера, другой должен сохранить эти данные на жесткий диск. Почему у нас 2 процесса? Некоторая проблема с историей.

Итак, какой IPC мы должны использовать? Сокет, труба или разделяемая память?

В настоящее время мы используем сокет.

Ответы [ 2 ]

10 голосов
/ 29 августа 2009

С помощью каналов в Linux вы можете использовать функциональность splice, чтобы получить перемещение данных из одного процесса в другой без копирования. Например, процесс отправки использует vmsplice() с SPICE_F_GIFT для передачи данных в канал, затем принимающий процесс использует splice() с SPLICE_F_MOVE для перемещения данных прямо из канала в файл диска, не касаясь его. Обратите внимание, что, естественно, существуют некоторые ограничения на выравнивание и длину.

В зависимости от того, как работает драйвер для вашей карты кодировщика, потенциально вы могли бы организовать все, чтобы получить нулевое копирование на всем пути от драйвера к диску - карты DMA кодировщика в память, а дисковые DMA - обратно, без ЦПУ всегда нужно было на это смотреть (в этом случае вы splice() передавали бы данные с карты кодера в канал, а затем splice() возвращали их из канала в файл диска).

0 голосов
/ 30 августа 2009

Использовать IPC:

  • Одна область совместно используемой памяти: общий буфер с низкими издержками между двумя процессами (см. Shmat ()).
  • Один семафор: его счетчиком будет количество доступных кадров (см. Semop ()). Процесс, который качает видеоданные с камеры, поместит кадр в область общей памяти и поместит () на семафор. Процесс, который записывает кадры на диск, получит () на семафор, и кадр будет в общей памяти.

Это немного похоже на реализацию очереди с семфором в качестве счетчика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...