-1

現在、Unix で mmap を介して IPC を試しています。

これまでのところ、10MB のスパース ファイルを RAM にマップし、2 つの別々のプロセスから読み取りと書き込みを行うことができます。素晴らしい :)

今、私は現在、mmap によって返されたメモリ セグメントのアドレスを char* に型キャストしているので、それを単純な古い cstring として使用できます。

さて、私の本当の質問はもう少し掘り下げます。高レベルのプログラミング (ruby、java) の経験はかなりありますが、C や ASM で大規模なプロジェクトを行ったことはありません。

マップされたメモリを変数割り当てのアドレス空間として使用したい。これが可能かどうか、またはまったく意味がないかどうかはわかりません。純粋に共有セグメントに存在する、ある種のハッシュマップのようなデータ構造を考えています。これにより、Ruby over FFI などの他の言語を使用した場合でも、IPC を使用した興味深い実験が可能になります。

さて、ハッシュの通常の実装では、malloc のようなものをかなり頻繁に使用します。ただし、これにより、共有スペースからメモリが割り当てられます。

私の英語は最高ではありませんが、私の考えを理解していただければ幸いです。

事前にありがとうヤコブ

4

1 に答える 1

1

mmap概して、 によって返されるメモリは、 によって返されるメモリと同様に扱うことができますmalloc。ただし、メモリは複数の「関連のない」プロセス間で共有される可能性があるため、 への独立した呼び出しによりmmap、それぞれの開始アドレスが異なる場合があります。したがって、共有メモリ内に構築するデータ構造では、直接ポインタを使用しないでください。

ポインターの代わりに、初期マップ アドレスからのオフセットを使用する必要があります。次に、データ構造は、オフセットをmmamp領域の開始アドレスに追加することにより、正しいポインター値を計算します。

データ構造は、 への 1 回の呼び出しから構築されmmapます。データ構造を拡張する必要がある場合は、mmap領域自体を拡張する必要があります。これは、バッキング ファイルが拡張された後に、mremapまたは手動でmunmap行うことができます。mmap

于 2013-06-18T14:30:05.207 に答える