PrefetchVirtualMemory 関数 (memoryapi.h)

プロセス アドレス空間内の仮想アドレス範囲があいまいである可能性があるメモリを取り込むための効率的なメカニズムを提供します。

構文

BOOL PrefetchVirtualMemory(
  [in] HANDLE                    hProcess,
  [in] ULONG_PTR                 NumberOfEntries,
  [in] PWIN32_MEMORY_RANGE_ENTRY VirtualAddresses,
  [in] ULONG                     Flags
);

パラメーター

[in] hProcess

仮想アドレス範囲をプリフェッチするプロセスを処理します。 現在のプロセスを使用するには 、GetCurrentProcess 関数を使用します。

[in] NumberOfEntries

VirtualAddresses パラメーターが指す配列内のエントリの数。

[in] VirtualAddresses

プリフェッチする仮想アドレス範囲を指定する WIN32_MEMORY_RANGE_ENTRY 構造体の配列へのポインター。 仮想アドレス範囲は、ターゲット プロセスがアクセスできるプロセス アドレス空間の任意の部分をカバーできます。

[in] Flags

予約済み。 0 を指定する必要があります。

戻り値

関数が成功した場合、戻り値は 0 以外の値になります。

関数が失敗した場合は、0 を返します。 詳細なエラー情報を得るには、GetLastError を呼び出します。

解説

PrefetchVirtualMemory 関数は、アクセスするアドレスのセットを合理的な自信を持って認識しているアプリケーションを対象としています。 これらのアドレスがメモリ内に存在しなくなった可能性が高い (つまり、ディスクにページアウトされている) 場合は、アクセス前にこれらのアドレス範囲で PrefetchVirtualMemory 関数を呼び出すと、API は可能な限り大規模な同時 I/O 要求を使用してディスクからそれらのアドレス範囲を効率的に取り込むため、全体的な待機時間が短縮されます。

PrefetchVirtualMemory 関数を使用すると、アプリケーションがアクセスされるプロセス アドレス範囲の一覧を提供する場合に、可能な限り大規模な同時実行 I/O を発行することで、ディスク ハードウェアを効率的に使用できます。 1 つのアドレス範囲 (ファイル マッピングなど) の場合でも、 PrefetchVirtualMemory 関数は、ページ フォールトを介して発行される多数の小さな I/O ではなく、1 つの大きな I/O を発行することでパフォーマンスを向上させることができます。

PrefetchVirtualMemory 関数は、純粋にパフォーマンスの最適化です。ターゲット アドレス範囲にアクセスするためにプリフェッチは必要ありません。 プリフェッチされたメモリは、ターゲット プロセスのワーキング セットに追加されません。物理メモリにキャッシュされます。 プリフェッチされたアドレス範囲にターゲット プロセスがアクセスすると、それらのアドレス範囲がワーキング セットに追加されます。

PrefetchVirtualMemory 関数はアプリケーションの正しい操作には必要ないため、システムによって強力なヒントとして扱われ、メモリ不足の条件下で完全または部分的に失敗する可能性がある通常の物理メモリ制約の対象となります。 また、大きなアドレス範囲で呼び出された場合にメモリ不足が生じかねないため、アプリケーションでは実際に使用するアドレス範囲のみをプリフェッチする必要があります。

この関数を呼び出すアプリケーションをコンパイルするには、_WIN32_WINNTを _WIN32_WINNT_WIN8 以上として定義します。 詳細については、「 Windows ヘッダーの使用」を参照してください。

要件

   
サポートされている最小のクライアント Windows 8 [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows Server 2012 [デスクトップ アプリのみ]
対象プラットフォーム Windows
ヘッダー memoryapi.h (Windows.h、Memoryapi.h を含む)
Library onecore.lib
[DLL] Kernel32.dll

関連項目

メモリ管理関数

WIN32_MEMORY_RANGE_ENTRY