2011-03-26 14 views
2

私は何度も呼び出されているLinuxプロセスを持っており、このプロセスをできるだけ早く行う必要があります。プロセスコール間でデータを転送する

問題は、別のプロセス/デーモンを実行することなく、呼び出し(前の呼び出しからデータをロードして次の呼び出しのためにデータを格納する)の間に状態を維持する必要があることです。

すばやく提案することはできますか?私はI/Oのためにファイルを使用できることを知っていて、明白なパフォーマンス上の理由から、それを避けたいと思います。実際のディスクI/Oを避けるために、読み書きするための名前付きパイプを作成する必要がありますか?

+1

* fast *は相対的なものですが、あなたの要件は何ですか?多くの場合、状態情報をファイルに格納することは適切な解決策になります。 –

答えて

2

パイプはこれには適していません。ファイルが遅すぎることが絶対にわかっている場合は、posix shared memoryまたはposix message queueを使用してください。最初にテストする必要があります。

共有メモリの場合、プログラムは存在しない場合はshm_open()でセグメントを作成し、存在する場合はセグメントを開きます。メモリをmmap()して何らかの変更と終了を行います。あなたのプログラムがもはや呼び出されず、もはや共有メモリを必要としないことが分かっているときだけ、shm_unlink()を実行します。

メッセージキューでは、キューを設定するだけです。プログラムはキューを読み込み、変更を加え、キューに書き込み、終了します。キューが不要になったときにMq_unlink()を呼び出します。

両方の方法にはカーネルの永続性があるため、再起動時に共有メモリとキューが失われます。

0

何かによって連続して実行されるプロセスがあるようです。

なぜワーカースレッドを生成するファクトリを作成しないのですか? 工場は必要な情報を労働者に提供することができます。

+0

素晴らしいアイデアですが、そのマシンでさらに多くのプロセスを起動することはできません。 – liorda

0

...明らかにパフォーマンス上の理由から、I/O用のファイルを使用でき、避けたいと考えています。私はこれらの理由下さい...

Linuxはどのようなものだろ

page cacheにカーネルメモリ内のファイルをキャッシュします。書き込みは最初にページの現金に行きます。換言すれば、write()は、ユーザースペースからページキャッシュにデータをコピーするだけのカーネル呼び出しです(システムがストレス下にあるときは少し複雑です)。後でpdflushはデータをディスクに非同期で書き込みます。

ファイルread()は、最初にページキャッシュをチェックして、ディスク読み込みを避けるためにデータがメモリ内にすでに存在するかどうかを確認します。つまり、あるプログラムがファイルにデータを書き込み、別のプログラムがそのファイルを読み込むと、これらの2つのプログラムは、ページキャッシュがそれらのファイルを保持している限り、カーネルメモリを介して効果的に通信します。通常IN-のマウントポイントです

あなたはディスクが完全に、つまり、状態は、OSの再起動しても持続する必要はありません書き込みを避けたい場合は、それらのファイルが/dev/shmまたは/tmpに入れることができるに、メモリファイルシステム。

+0

私は、ディスクアクセスがRAMアクセスと比較して実際に遅いという経験則だと思います。私は、私のプロセス呼び出しの間にキャッシュに留まるためにページに頼ることはできないと思います。その間に何がどのように起こるかわからないからです。 – liorda

関連する問題