0

次の問題があります。

キューを作成しました。要素 (malloc) の追加は main() 関数によって行われ、要素/データを処理して解放するスレッドを作成しました。これは継続的なプロセスであり、プロセスを強制終了するまで続きます。

ここで、プロセスを強制終了するとキュー内のデータが失われるため、mmap() を実装することを考えていました。キューも通常のファイルに保存されるように、プロセスを再起動すると、スレッドによるさらなる処理のためにデータがメモリにリロードされます...

私はメモリを malloc して free しているので、mmap されたファイルのサイズは継続的に増加または減少すると思います。

これを実装することは可能ですか、それとも他のオプションを検討する必要がありますか???

ありがとう。

EDIT1: lseek または ftruncate() を使用してファイルのサイズを変更できますか?

4

1 に答える 1

0

キュー (またはその他のデータ構造) をmmap()ヒープ メモリの代わりに ed メモリに入れることは確かにできますが、克服しなければならないいくつかの問題に遭遇します。

  • mmap()ed ファイルに対応するメモリ ブロック内のすべてのメモリ管理を自分で行う必要があります。キューのデータ構造がメモリの 1 つのモノリシック ブロックでない限り、作成、削除、および再配置できるノードとポインターが含まれている可能性があります。ヒープ メモリを使用すると、データ構造内の新しいノードで使用するために解放されたメモリを再利用するmalloc()など、メモリの小さなブロックを および に割り当てて解放するタスクを委任できます。free()ed ファイルでは、mmap()これらすべてを自分で行う必要があります。

  • mmap()メモリの ed ブロック内でポインタを使用することはできません。ブロックの先頭からのオフセットのみです。これは、ブロックがデタッチされて別のプロセスで再アタッチされた場合、おそらく同じメモリ アドレスにないためです。mmap()データ構造へのアクセスはポインターを使用して行われるため、ブロックのベース アドレスを加算または減算することにより、オフセットをポインターに変換したり元に戻したりするオーバーヘッドが常に発生します。

  • 最初のプロセスが強制終了された後、別のプロセスでブロックを再アタッチして回復できるようにしたい場合は、最初のプロセスがクリティカル セクションの途中で強制終了され、1 つ以上の不変条件が発生した場合に備える必要があります。のデータ構造が一時的に侵害されました。つまり、一貫性のない破損したデータ構造を再接続している可能性があります。これを完全に正しくサポートするには、データ構造に対して実行する変更の種類に細心の注意を払う必要があります。

全体として、私のお勧めは、それだけの価値がないということです。ヒープ メモリに基づく高速で効率的で使いやすいデータ構造を使用し、ときどきシリアル化されたスナップショットを通常のファイルに保存する必要があります。受信する必要がある場合は、最後の既知の正常なスナップショットから回復します。

于 2013-02-26T15:59:37.140 に答える