2

私はIPCの初心者です。Writer プロセスは共有メモリにデータを書き込み、多くの Reader プロセスがデータを読み取ります。書き込まれるデータには一意の識別子があり、アクセスを高速化するために一意のキーでインデックスを作成する必要があります (ルックアップ用の STL::map または hashmap など)。また、データは可変長レコード ( XML ) です (平均長は 200 ~ 250 バイト)。OS は Intel Xeon Quad Core Server 上の solaris 10 (i86pc) です。

合計データサイズは 200G 以上です。ただし、共有メモリには最新のデータのみを保持します。履歴データはファイルにあります。共有メモリのサイズは約 4G~6G です。

Boost::interprocess のような利用可能な外部ライブラリはありません

いくつか質問があります。

  1. どちらがより効率的ですか:shared_memoryまたはmmap(メモリマップファイル)
  2. 可変長レコードのインデックスを作成する方法。[わかりません。ハッシングがあるのでしょうか?].
  3. XML が固定サイズの構造に変換された場合、これはうまくいくでしょうか (トレードオフ - 構造のサイズは巨大になり、300 以上のフィールドが可能になります)。
  4. カスタム アロケータを提供することで、任意の STL を shared_memory に配置できますか?
  5. セマフォなしで実装することは可能ですか ( CAS を使用したロックレス実装)。

ありがとう

これはどう。

|--------------------------|
| start_id   |   end_id    |   ->  range of msg id present in the segment
|--------------------------|
| id1 | start_mem | length |   ->
|--------------------------|   ->
| id2 | start_mem | length |   -> table of index for the actual data
|--------------------------|   ->
| id3 | start_mem | length |   ->
|--------------------------|   ->
| id4 | start_mem | length |   ->
|--------------------------|   ->
|                          |
|                          |
|                          |
|       data segment       |
|       varibale length    |
|       xml are stored     |
|                          |
|                          |
|--------------------------|

新しいデータが到着し、セグメントがいっぱいになったとき。最も古いデータが循環的に消去されます。複数のレコードを消去する必要がある可能性があります。

4

2 に答える 2

0

最も簡単な解決策は、複雑なインデックス作成などが必要な場合は、共有メモリではなくサービス指向アーキテクチャを検討することです。1 つのプロセスをマスター キャッシュ プロセスとして指定し、データを必要とする他のプロセスから (UNIX ドメイン ソケット、TCP ソケットなどを介して) ローカル接続を受け入れるようにします。これにより、物事がはるかに簡単になります。

このルートを選択しない場合は、共有メモリがハードであることに注意してください。あなたが求めることは、共有メモリで間違いなく実行可能です-このshmemチャンクなどでヒープアロケーターを作成できます.STLアロケーターは機能する可能性がありますが、サードパーティのライブラリがカスタムポインタータイプを使用するSTLアロケーターに満足するとは思わないでください。ロックが必要になり(賢ければ回避できる場合もありますが、すべてではありません。この場合、STL に別れを告げることは間違いありません)。

繰り返しますが、単純なキャッシュ デーモンから始めることを強くお勧めします。これはほとんどの場合問題なくスケーリングしますが、レイテンシが少し増えるだけです。

于 2012-02-03T07:07:21.523 に答える
-1

セマフォなしで実装することは可能ですか ( CAS を使用したロックレス実装)。

ロックレス ( lock-free ) の実装は設計が難しく、混乱に陥る可能性があるため、ロックフリーのソリューションに進む前に、次の側面と代替案を検討する必要があります。

  • システムに多くのスレッドがあり、スケジューラがロックを保持しているスレッドを先取りする可能性が高い場合、他のすべてのスレッドがロックを待機することになります (そうでない場合、ロックフリーでは大幅な改善は見られません)。
  • これがリーダーライターロックを使用して解決できる場合。(ライターはリーダーよりも大幅に少ない)。
  • ロック競合の可能性が低い場合は、スピンロックを検討するとよいでしょう。これにより、ロックなしのパフォーマンスと同等のパフォーマンスが得られます。
于 2012-02-02T14:38:21.237 に答える