none
Win32 APIのVirtualAllocのように空き論理アドレスをMapViewOfFileExで探すには RRS feed

  • 質問

  • Win32APIの質問はこのフォーラムがもっとも近いと思い投稿させていただきます。

    VirtualAllocは論理アドレスを自動で割り当て物理アドレスを自動で割り当て、スワップファイル上のオフセットは自動で割り当てます。
    VirtualAllocExは論理アドレスを手動で割り当て物理アドレスを自動で割り当て、スワップファイル上のオフセットは自動で割り当てます。
    MapViewOfFileは論理アドレスを自動で割り当て物理アドレスを自動で割り当て、スワップ(メモリマップド)ファイル上のオフセットは手動で割り当てます。
    MapViewOfFileExは論理アドレスを手動で割り当て物理アドレスを自動で割り当て、スワップ(メモリマップド)ファイル上のオフセットは手動で割り当てます。

    やりたいことはMapViewOfFileExで論理アドレスとスワップ(メモリマップド)ファイル上のオフセットを完全一致させたいのです。
    今はVirtualQueryを使い、空き論理アドレスを線形で検索して見つかった空き論理アドレスにMapViewOfFileExで割り当てています。スワップ(メモリマップド)ファイル上のオフセットも空き論理アドレスと同じにしてあります。
    しかしVirtualQueryで線形で検索すると遅いです。
    この検索を高速化する方法はないでしょうか?
    またはMapViewOfFileを使っても良いので割り当てる(メモリマップド)ファイル上のオフセットを論理アドレスと完全一致させる方法はないものでしょうか?
    2009年4月30日 1:07

すべての返信

  • スワップファイル、スワップ(メモリマップド)ファイル、(メモリマップド)ファイルとありますが、すべて同じものを指すのでしょうか? また何を指しているのでしょうか?
    OSとは別に用意した独自のスワップファイル or OSのwin386.swp or OSのpagefile.sys or そのほか。

    なぜアドレスを一致させたいのかがわかりませんでした。ポインタ値を一致させたいとか? それによっては別の解決策もあるのではと思います。
    単にアドレスを一致させる方法として2つ思いつきました。
    1つ目はセグメントレジスタです。DSではなくESとか使えないのでしょうか? ESははまりそうなのでFSとか。もちろん私にはやり方わかりません!
    2つ目はスパースファイルです。独自のスワップファイルなら、メモリアドレスに合わせてファイルを作成してはどうでしょう?
    2009年4月30日 2:28
  • 言葉が足らず申し訳ありませんでした。詳しく説明させていただきます。
    目的はある巨大なデータ構造をメモリ上に展開して加工したいのです。
    しかし途中で落ちてしまうことがあります。
    やり直すのは時間がかかるのでメモリマップドファイルにして運がよければもう一度再起動してリジュームしたいのです。
    VirtualAllocはファイルはスワップファイルですのでそのような機能は実現できません。
    しかしMapViewOfFile系であれば実現できると考えました。

    論理アドレスを一致させたい理由というのも作業の途中からリジュームするためです。
    もちろん同じ論理アドレスに割り当てれるという保障はありません。
    その場合異なる論理アドレスに割り当て、ファイル上のデータもその位置に移動して、必要なポインタを書き換えることで対処します。
    上記の機能は既に実装できています。
    ファイル上のオフセットと論理アドレスを一致させる方法は現在は空き論理アドレスを探すのにVirtualQueryを使っているため遅いのです。
    これをすばやく探す方法がないか探しています。

    今ちょっと思いついたことがあります。すぐには試せないですが

    1.VirtualAllocでメモリを予約します。そのアドレスを取得します。
    2.そのアドレスでMapViewOfFileExで割り当てれないか?

    ということです。たとえ出来たとしてもドキュメントにもVirtualAllocとMapViewOfFileExが相互に使えるという保証がないので不安ですが。

    2009年4月30日 4:30