私はmmapを介して永続的な大きな定数配列を実装しています。mmapを使用するときに知っておくべきヒントやコツや落とし穴はありますか?
3 に答える
mmap された領域内に格納されるすべてのポインターは、実際のポインターとしてではなく、mmap された領域のベースからのオフセットとして行う必要があります。プログラムの次回の実行時にリージョンを mmap するときに、必ずしも同じベース アドレスを取得するとは限りません。(mmap 領域のベースアドレスの不変性について誤った仮定を行ったコードをクリーンアップする必要がありました)。
開いているファイル サイズまたはメモリ使用量の制限を確認してください。Linux には、組み込みのシェル コマンド ulimit があります。as を実行しulimit -a
て、現在の設定を確認します。
msync(2) syscall を使用してメモリ内配列への書き込みをファイルにフラッシュします。さもないと、それらは munmap(2) までメモリ内に留まり、それ以前に停電または何かが発生する可能性があります!
複数のプロセスが読み取り権限と書き込み権限で共有されている同じメモリ領域を mmap している場合は、データの破損を避けるために、一度に 1 つのみが書き込みを行っていることを確認してください。または、ファイルのロックやその他の同期手段を使用してください。
これは mmap() の最も単純な使用例であるため、つまずく必要はあまりありません。
大きな定数配列を効果的にロードしているだけです。定数であるため、同期について心配する必要はありません。書き込みを行わないため、 protパラメータが PROT_READ のみに設定されていることを確認することをお勧めします。
定数を使用する 1 つ以上のプログラムを継続的に実行する場合は、データをロードして常駐させる別のプログラムを作成する価値があります。他のプログラムの実行は、基本的に、ファイルを継続的にメモリに読み込むのではなく、共有メモリのアタッチを行うだけです。