2009-07-27 15 views

答えて

4

mmap'd領域内に格納されるすべてのポインタは、実際のポインタではなく、mmap'd領域のベースからのオフセットとして実行する必要があります。次回のプログラム実行時に領域をmmapするとき、必ずしも同じベースアドレスを取得する必要はありません。 (私は、mmap領域のベースアドレスの不変性について誤った仮定をしたコードを整理しなければならなかった)。

3

開いているファイルサイズやメモリの使用に関する制限を確認してください。 Linuxでは、シェルコマンドulimitが組み込まれています。 ulimit -aとして実行すると、現在の設定が表示されます。

メモリ内の配列をmsync(2)のシステムコールでフラッシュするか、munmap(2)がメモリに残り、その前に停電などが発生する可能性があります。

読み取りと書き込みの権限で共有される同じメモリ領域が複数のプロセスでmmapされている場合は、データの破損を避けるため、一度に1つのプロセスしか書き込みを行わないようにしてください。または、ファイルのロックやその他の同期手段を使用します。

+0

データが一定であるため、フラッシュする必要はありません。 –

3

これはmmap()のもっとも単純な使用例ですので、あまり動かすべきではありません。

大きな定数配列をロードするだけです。定数なので、同期について心配する必要はありません。 protパラメータがPROT_READに設定されていることを確認することをお勧めします。

定数を使用する1つまたは複数のプログラムが継続的に実行される場合、データをロードして常駐させる別のプログラムを用意する価値があります。他のプログラムの実行は、本質的にファイルをメモリに連続的に読み込むのではなく、共有メモリの接続を行うだけです。

関連する問題