0

ネイティブの Win32 環境で動作させるために必要なコード (変更できない) がいくつかあります。このコードはmmap()とを呼び出すので、 、 などmunmap()を使用してこれらの関数を作成し、同じことを実現しました。最初はこれで問題なく動作し、コードは期待どおりにファイルにアクセスできます。残念ながら、コードはファイルの不要になった選択部分に進みます。CreateFileMapping()MapViewOfFile()munmap()

x = mmap(0, size, PROT_READ, MAP_SHARED, fd, 0);
... 
munmap(x, hdr_size);
munmap(x + foo, bar);
...

残念ながら、マップされた範囲の中央にポインターを渡すと、マッピングUnmapViewOfFile()全体が破棄されます。さらに悪いことに、これが部分的なマップ解除要求であることを検出して無視する方法がわかりません。

範囲を呼び出してみVirtualFree()ましたが、当然のことながら、これにより ERROR_INVALID_PARAMETER が生成されます。

部分的なマッピング解除を検出して無視できるように、静的/グローバル変数を使用してすべての開いているメモリ マッピングを追跡する必要があると考え始めていますが、より良いアイデアがあることを願っています...

編集:

上記で十分に明示的ではなかったため、 UnMapViewOfFile のドキュメントはその関数の動作を正確に反映していません。

ビュー全体のマッピングを解除して断片を再マッピングすることは、適切な解決策ではありません。新しいマッピングのベース アドレスを提案することしかできず、それを実際に制御することはできないからです。don'tのセマンティクスでmunmap()は、まだマップされている部分のベース アドレスを変更できません。

私が本当に必要としているのは、既にマップされているメモリ領域のベース アドレスとサイズを見つける方法です。

edit2:問題をそのように言い直すと、VirtualQuery()関数で十分であるように見えます。

4

2 に答える 2

2

UnmapViewOfFile の MSDN ライブラリのドキュメントで非常に明示的です。

lpBaseAddressマップを解除
するファイルのマップ ビューのベース アドレスへのポインター。この値は、以前に MapViewOfFile または MapViewOfFileEx 関数を呼び出したときに返された値と同じである必要があります。

古いマッピングを解除して新しいマッピングを作成することにより、マッピングを変更します。断片的なマッピングの解除は十分にサポートされておらず、メモリ管理の観点から有用な副作用もありません。アドレス空間が断片化する危険を冒したくありません。

これは別の方法で行う必要があります。

于 2010-09-08T01:17:18.330 に答える
0

各マッピングと、クライアントによってまだ割り当てられているページの数を追跡し、そのカウンターがゼロに達したときにのみマッピングを解放できます。中央のセクションは引き続きマップされますが、クライアントがそのメモリにアクセスすることはないので問題ありません。

このインターフェイスを介してメモリ マッピングのグローバル ディクショナリを作成します。マッピング要求が届いたら、アドレス、サイズ、および範囲内のページ数を記録します。マップ解除要求が行われると、そのアドレスを所有するマッピングを見つけて、解放されるページの数だけページ数を減らします。そのカウントがゼロになったら、実際にビューをマップ解除します。

于 2010-09-16T15:44:37.407 に答える