mkfifo-ディスクI / Oは実際に発生しますか?


10

2つのアプリケーションがあります。

  • プロデューサー(Nインスタンス)
  • 消費者(1インスタンス)

現在、プロデューサーから中間結果を書き出し、コンシューマーがこれらのファイルをディスクから読み取って、最終結果を生成しています。

プロデューサからの出力を直接コンシューマに「ストリーミング」することで、このI / Oを最小限に抑えたいと思います。

名前付きパイプ(mkfifo)とそれに続く例をここで見つけまし。これは素晴らしいように見えますが、私が判断できないことは、これが実際にどのように実装されているかです。FIFOキューはファイルを介してバッファリングされているだけですか?もしそうなら、それはおそらく私を助けません。ディスクを利用せず、コンテンツ全体を「メモリ経由」でストリーミングしたい。多分これはプロセス間で可能ではありませんか?

回答:


10

ディスクI / Oはありません(おそらく、ファイルシステムをナビゲートしてfifoファイルを開く場合を除きます)。

LinuxのFIFO(7)のmanページ

FIFO特殊ファイル(名前付きパイプ)は、ファイルシステムの一部としてアクセスされることを除いて、パイプに似ています。[...]プロセスがFIFO経由でデータを交換しているとき、カーネルはすべてのデータをファイルシステムに書き込まずに内部的に渡します。したがって、FIFO特殊ファイルにはファイルシステム上のコンテンツがありません。ファイルシステムエントリは、プロセスがファイルシステム内の名前を使用してパイプにアクセスできるように、参照ポイントとして機能します。


完璧です。mkfifoのmanページを読みましたが、「fifo」のページを探すつもりはありませんでした。ありがとうございました。
Jmoney38 14

3

十分なメモリが利用可能な場合はとにかくキャッシュされ、実際のディスクIOは実行されないため、結果が実際にディスクバックアップであるかどうかは問題ではありません。逆に、メモリを使用していて、十分なメモリがない場合は、ディスクにスワップできます。

推測すると、パイプは実際にはメモリベースであると言えますが、これにより、再起動の間にキューに入れられたデータが保持されるかどうかのみが変更されます。

注意する必要があるのは、複数のプロデューサーがあるため、キューにインターリーブされないように書き込みをアトミックにする必要があるということです。man 7 pipe書き込みがアトミックであることを確認する方法の詳細については、を参照してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.