mkfifo - действительно ли происходит дисковый ввод-вывод?

10

У меня есть 2 приложения:

  • Производитель (N экземпляров)
  • Потребитель (1 экземпляр)

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

Я хотел бы свести к минимуму этот ввод-вывод путем «потоковой передачи» выходов от производителей непосредственно к потребителю.

Я наткнулся на именованные каналы (mkfifo) и последующий пример здесь . Это выглядит великолепно, но я не могу определить, как это на самом деле реализовано? Очередь FIFO просто буферизируется через файл? Если это так, это, вероятно, не поможет мне. Я хотел бы, чтобы содержимое передавалось «через память» полностью без использования диска. Может быть, это невозможно в разных процессах?

Jmoney38
источник

Ответы:

10

Нет дискового ввода-вывода (за исключением, возможно, при навигации по файловой системе, чтобы открыть файл fifo.)

Из справочной страницы Linux fifo (7) :

Специальный файл FIFO (именованный канал) похож на канал, за исключением того, что он доступен как часть файловой системы. [...] Когда процессы обмениваются данными через FIFO, ядро ​​передает все данные внутренне, не записывая их в файловую систему. Таким образом, специальный файл FIFO не имеет содержимого в файловой системе; запись файловой системы просто служит контрольной точкой, так что процессы могут получить доступ к каналу, используя имя в файловой системе.

Марк Плотник
источник
Отлично. Я прочитал справочную страницу для mkfifo, но не думал искать страницу на "fifo" - Спасибо!
Jmoney38
3

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

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

Вам следует позаботиться о том, чтобы, поскольку у вас было несколько производителей, ваши записи должны быть атомарными, чтобы они не чередовались в очереди. Смотрите man 7 pipeподробности о том, как обеспечить атомарность записи.

pqnet
источник