6

次のアプリケーションについて考えてみます。起動時に、ディスクから読み取られたデータに基づいてWebページの大規模なメモリ内インデックスを作成するWeb検索サーバー。初期化されると、メモリ内インデックスは変更できず、ユーザークエリを処理するために複数のスレッドが開始されます。サーバーがネイティブコードにコンパイルされ、OSスレッドを使用していると仮定します。

現在、スレッドモデルはスレッド間の分離を提供しません。バグのあるスレッドまたはスレッドセーフでないコードは、他のスレッドによって割り当てられ、論理的に属しているインデックスまたはメモリを破損する可能性があります。このような問題の検出とデバッグは困難です。

理論的には、Linuxはより良い分離を強制することを可能にします。インデックスが初期化されると、それが占有するメモリを読み取り専用としてマークできます。スレッドは、インデックスを共有するプロセス(共有メモリ)に置き換えることができますが、それ以外のプロセスは別々のヒープを持ち、相互に破損することはありません。不正な操作は、ハードウェアとオペレーティングシステムによって自動的に検出されます。ミューテックスやその他の同期プリミティブは必要ありません。メモリ関連のデータ競合は完全に排除されます。

そのようなモデルは実際に実行可能ですか?そのようなことを行う実際のアプリケーションを知っていますか?それとも、そのようなモデルを非現実的にするいくつかの根本的な問題がありますか?このようなアプローチでは、従来のスレッドと比較してパフォーマンスのオーバーヘッドが発生すると思いますか?理論的には、使用されるメモリは同じですが、処理を遅くする実装関連の問題がいくつかありますか?

4

3 に答える 3

4

明らかな解決策は、スレッドをまったく使用しないことです。別のプロセスを使用します。各プロセスはコードおよび読み取り専用構造と多くの共通点があるため、読み取り専用データを共有することは簡単です。ファイル内でメモリ内で使用するために必要に応じてフォーマットし、ファイルをメモリにマップします。

このスキームを使用すると、プロセスごとの可変データのみが独立します。コードは共有され、静的に初期化されたデータは書き込まれるまで共有されます。プロセスが鳴った場合、他のプロセスへの影響はありません。同時実行の問題はまったくありません。

于 2012-09-06T06:42:52.337 に答える
1

mprotect()インデックスを読み取り専用にするために使用できます。64ビットシステムでは、各スレッドのローカルメモリをランダムなアドレスにマッピングできます(アドレス空間のランダム化に関するこのWikipediaの記事を参照)。これにより、あるスレッドが別のスレッドに接触することによるメモリの破損の可能性が低くなります(もちろん、マップされたメモリを完全に見逃すと、セグメンテーション違反が発生します)。明らかに、スレッドごとに異なるヒープが必要になります。

于 2012-09-05T20:56:29.490 に答える
0

memcachedがおもしろいと思うかもしれません。また、共有メモリを作成して読み取り専用として開き、スレッドを作成することもできます。これにより、パフォーマンスが大幅に低下することはありません。

于 2012-09-05T20:54:20.397 に答える