2012-02-17 3 views
0

プロセスをフォークする前に十分な量のメモリをプログラムにあらかじめ割り当てておき、フォークされたプロセスでこのプールからさらにメモリを割り当て/使用したいと思います。私は、Bget、Boostなどのメモリアロケータをいくつか見てきましたが、それらを使用する方法を理解することはできません。メモリを事前に割り当てて、フォークされたプロセスで使用します。

私はフォークプロセスの使用に続いて

poolhandle = poolallocate(POOL_SIZE)

よう

PTR = allocatefromPool(poolhandle、no_of_bytes)のようなものを使用することができますそこに最も簡単な1があります

このポインタをある種のIPCを介して別のプロセスに渡すと、そのプロセスでもこのポインタにアクセスできるはずです。

正しい方向に向けることができますか? Boostが行く方法なら、あなたは私にそれを使う方法の例を教えてくれますか?

答えて

1

正直なところ、これを行う最も簡単な方法は、メモリマップファイルを使用することです。それから、物事を救うために探したり書きしたり、物を得るために読んだり読んだりするだけです。

これ以外にも、メモリをまったく共有しないアクターの概念があります。アクター間でメッセージを送信するだけです。アクターのそれぞれは、自分のデータストアの管理者です。これはプログラミングが簡単です。特に、プロセス間およびスレッド間のメッセージングを簡単にするZeroMQなどのツールを使用すると簡単です。

2つのアイデアを組み合わせると、それぞれのアクタープロセスには、自分が所有するメモリマップされたファイルの領域があり、メッセージを前後に渡して読み書きを指示します。

ここで共有メモリとしてPosix shared memory vs mapped files

をメモリマップドファイルの詳細については、この質問を参照してくださいあなたがへのデータの大きなブロックを持っている場合は、アクションIPC vs domain sock vs named pipes

を調整するために、複数のプロセスのために必要となるIPCについてのものですメッセージ内を移動すると、おそらくデータをメモリマップファイルの所定の場所に残して、何らかの形でロックフリーの共有を実装する必要があります。あなたは "共有メモリ"または "データ構造"と一緒にキーワードlock-freeを使用することができるたくさんのものがあります。

+0

こんにちはMichael、これらの入力をいただきありがとうございます。メモリマップされたファイルは私が知っている一つのオプションですが、簡単に利用できるシンプルなアロケータを使うか、ヒープ/メモリマネージャのいくつかの並べ替えを自分で書くことは私のタスクの必要条件です。むしろ利用可能なオプションを最初に調べて、それが要件を満たしているかどうかを確認したいと思います。メモリマップされたファイル、すなわちmmapは、システムコールのカップルを含むので遅くなる可能性がありますか?(申し訳ありませんが、これを検証していません) – lucent

+0

一般的でシンプルなヒープマネージャ/メモリアロケータ/使うことができます ?また、ブーストは実際にメモリを事前に割り当てるわけではありませんか?基本的には、私はあらかじめ大量のメモリを割り当ててから、自分の構造体、配列、int、chars..etcデータ構造体を割り当てます。また、これらのポインタを別の(フォークされた)プロセスに渡すと、そのプロセスはそのメモリにアクセスできるはずです。 – lucent

関連する問題