2017-05-12 16 views
0

mmap()addrlenバイトから始まる呼び出し元プロセスの仮想アドレス空間内の新しいマッピングを作成し、munmap()は、プロセス開始のアドレス空間の任意の部分を含むもの全体のページのすべてのマッピングを削除しますaddrで続き、lenバイトです。のmmap()とと、munmap()

変更されたmmapファイルがメモリを解放する前にmunmapによってディスクに書き込まれているかどうか、または変更を同期させるために別の関数を呼び出さなければならないかどうか尋ねます。

+0

どのオペレーティングシステムでですか?あなたは 'mmap'にどのようなフラグを渡していますか? 「mmapファイル」と「munmapファイル」はどういう意味ですか? – Gilles

+0

UNIXオペレーティングシステム。 mmapファイルは、マップされたメモリに書き込まれたデータを意味します。データがマップされたメモリにロードされていて、その上で何らかの変更が行われた場合。提供されるパーマネータは、mmap( NULL、size、readOnly?PROT_READ:PROT_READ | PROT_WRITE、MAP_SHARED、fd、0)です。 – Pragya

+0

あなたの質問の問題は、mmapはすべてのジャック・オール・トレード機能です。その振る舞いは、あなたが実際どのようにそれをしているかによって決まります通話で使用している設定については、より具体的に説明する必要があります。 – user3344003

答えて

1

mmap()MAP_PRIVATEフラグでコールすると、変更は保存されません。 MAP_SHAREDフラグを使用すると、不確定な時刻に、しかし、munmap()が返される前に、追加の呼び出しなしで変更が保存されます。そして、msync()呼び出しを使用して、変更を強制的にファイルに書き込むことができます。

the POSIX standard for mmap()パー

説明

...

MAP_SHAREDとMAP_PRIVATEは、メモリオブジェクトへの書き込み 参照の配置を説明します。 MAP_SHAREDが指定されている場合は、 の参照は、基になるオブジェクトを変更します。 MAP_PRIVATEが01​​である場合、呼び出し元プロセス によってマップされたデータを変更することは、呼び出し元のプロセスにのみ表示され、基礎オブジェクトである を変更してはならない。 ...

...

マップされたファイルの最後のデータアクセスタイムスタンプがmmap()コールと対応する munmap()コール間の任意の時点で 更新のためにマークすることができます。マップされた領域への最初の読み出しまたは書き込み参照 は、ファイルの最後のデータアクセスタイムスタンプに、 更新がまだマークされていない場合に更新をマークさせるものとする。

MAP_SHAREDとPROT_WRITEにマッピングさ ファイルの最後のデータ変更と最後のファイルの状態変更のタイムスタンプが マッピングされた領域への書き込み基準と次の呼び出しの間の間隔の中でいくつかの点で 更新のためにマークされなければなりませんmsync()(MS_ASYNC)またはMS_SYNC (任意のプロセスによるファイルのその部分)。このような呼び出しがない場合は となり、基礎ファイルが書き込み 参照の結果として変更された場合、これらのタイムスタンプは、書き込み基準の後のある程度 の時刻に更新マークされます。

そしてthe munmap() documentationあたり:

説明

...

削除するマッピングがプライベートである場合、この のアドレス範囲で行われた変更は破棄されます。

関連する問題