共有リソース==競合
定義上、通常のファイルへの書き込みはシリアル化された操作です。複数のスレッドから書き込もうとしてもパフォーマンスは得られません。I/Oは、最も低速または最も過負荷のCPUよりも帯域幅が桁違いに少ない有限の制限付きリソースです。
共有リソースへの同時アクセスは複雑になる可能性があります(そして遅くなる可能性があります)
高価な計算を実行している複数のスレッドがある場合は、オプションがあります。何かを高速化すると思われるために複数のスレッドを使用している場合は、逆のことを実行します。 I / Oの競合は常にリソースへのアクセスを遅くし、ロック待機やその他のオーバーヘッドのためにリソースを高速化することはありません。
保護され、一度に1人のライターのみを許可するクリティカルセクションが必要です。同時実行性をサポートするロギングライターのソースコードを調べるだけで、ファイルに書き込むスレッドが1つしかないことがわかります。
アプリケーションが主に次の場合:
-
CPUバウンド: いくつかのロックメカニズム/データ構造を使用して、一度に多くのスレッドのうち1つのスレッドのみをファイルに書き込むことができます。これは、単純なソリューションとしての同時実行の観点からは役に立ちません。これらのスレッドがCPUにバインドされていて、I / Oがほとんどない場合、これは機能する可能性があります。
-
I / Oバウンド: これは最も一般的なケースです。ある種のキューを備えたメッセージングパッシングシステムを使用し、すべてのスレッドをキュー/バッファにポストし、そこから単一のスレッドをプルしてファイルに書き込む必要があります。これは、最もスケーラブルで実装が最も簡単なソリューションになります。
ジャーナル-非同期書き込み
書き込みの順序が重要でなく、プログラムがCPUにバインドされている単一の超大型ファイルを作成する必要がある場合は、ジャーナリング手法を使用できます。
各process
を持っている 別のファイルに書き込み、最後に複数のファイルを1つの大きなファイルに連結します。これは非常に古い学校ですローテク うまく機能し、何十年にもわたって使用できるソリューション。
明らかに、ストレージI / Oが多ければ多いほど、エンドコンキャットでのパフォーマンスが向上します。