2012-02-02 32 views
2

私はnewbee to IPCです。 Writerプロセスは、データを共有メモリに書き込みます。多くのリーダープロセスがデータを読み取ります。書き込まれるデータには一意の識別子があり、より高速なアクセスのために一意のキーで索引付けする必要があります(参照のためのSTL :: mapまたはhashmapなど)。また、データは可変長レコード(XML)です(平均文字数は200〜250バイトです)。 OSはIntel Xeon Quad Core Server上のsolaris 10(i86pc)です。可変長レコード用C++のロックフリー共有メモリ

合計データサイズが200Gを超えています。しかし、私たちは共有メモリに最新のデータだけを保存します。履歴データはファイルに保存されます。共有メモリサイズは約4G〜6Gです。

ブースト::プロセス間などの盛ん外部ライブラリ

私が質問のカップルは、かもしれ持っている多くの方が効率的である

  1. どのようにSHARED_MEMORYかのmmap(メモリマップドファイルを)可変長レコードの索引を作成します。 [私は考えていない、いくつかのハッシングかもしれない?]。
  2. XMLが固定サイズの構造に変換されている場合、これはきちんとしているでしょうか?(構造のトレードオフは300以上の可能性のあるフィールドがあります)
  3. カスタムアロケータを提供することでSTLをshared_memoryに配置できますか?
  4. セマフォなしで実装することは可能ですか(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  | 
|       | 
|       | 
|--------------------------| 

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

+0

どのコンパイラを使用していますか? – pyCthon

+0

タイトルに質問を記入してください。実際には、私たちはそこにいる間、これは_five_質問です。それらを投稿してください。 –

+0

読者は同じデータを読まなければなりませんか?すべてのプロセスでキー数が固定されていますか? – Karlson

答えて

-1

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

(ロックフリー)ロックフリーソリューションのために行く前に、あなたは以下の側面および代替を考慮する必要があり、実装は設計が困難であり、私たちは混乱に終わるかもしれない:

  • がある場合スケジューラがロックを保持しているスレッドをプリエンプトする可能性があるように、システム内の多くのスレッドが使用されるため、他のすべてのスレッドはロックを待っています(ロックフリーでは大幅な改善が得られない場合)。
  • これは、リーダー - ライターロックを使用して解決できる場合。 (作家は読者よりもかなり少ない)。
  • ロック競合の可能性が低い場合は、ロックフリーのパフォーマンスと同等のスピンロックを考慮する必要があります。
+0

解決策を探している他の人のために質問に答えてください – Alex

0

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

このルートを選択しない場合は、共有メモリがであることを警告してください。このshmemチャンクなどでヒープアロケータを作成することができます。STLアロケータでも動作しますが、カスタムポインタを使用するSTLアロケータに満足できるサードパーティライブラリはないと思いますタイプ。 ロックが必要です(あなたが賢明なら、場合によっては避けることができるかもしれませんが、すべてではなく、この場合はSTLのお別れにきっとキスします)。そして、あなたは普通に取るすべてを再構築する必要があります。

また、シンプルなキャッシュデーモンを使用することをお勧めします。これは大部分の時間を大丈夫にします。ちょっと待ってください。

+0

すぐにソリューションとしてSOAアーキテクチャは不可能です。この質問を投稿した後、私はshared_memoryにSTLを置くことができないことを知りました(他のプロセスには見えないポインタを使用しています) – naveenhegde

+0

あなたのケースでマスタープロセスはなぜ使えないのですか? – bdonlan

+0

解決策を探している他の人のために質問に答えてください – Alex

関連する問題