У меня есть 2 приложения:
- Производитель (N экземпляров)
- Потребитель (1 экземпляр)
В настоящее время я записываю промежуточные результаты от производителей, а затем потребитель читает эти файлы с диска и выдает окончательный результат.
Я хотел бы свести к минимуму этот ввод-вывод путем «потоковой передачи» выходов от производителей непосредственно к потребителю.
Я наткнулся на именованные каналы (mkfifo) и последующий пример здесь . Это выглядит великолепно, но я не могу определить, как это на самом деле реализовано? Очередь FIFO просто буферизируется через файл? Если это так, это, вероятно, не поможет мне. Я хотел бы, чтобы содержимое передавалось «через память» полностью без использования диска. Может быть, это невозможно в разных процессах?
На самом деле не имеет значения, поддерживается ли ваш результат на диске или нет, потому что, если достаточно памяти, он все равно будет кэширован, и фактический дисковый ввод-вывод не выполняется. Напротив, если он поддерживается памятью и недостаточно памяти, его можно перенести на диск.
Если бы я догадался, я бы сказал, что канал на самом деле основан на памяти, но тогда это должно измениться только в том случае, если данные в очереди сохраняются между перезагрузками.
Вам следует позаботиться о том, чтобы, поскольку у вас было несколько производителей, ваши записи должны быть атомарными, чтобы они не чередовались в очереди. Смотрите
man 7 pipe
подробности о том, как обеспечить атомарность записи.источник