次の方法で共有


OVERRIDE_PREFETCH_PARAMETER構造体 (processthreadsapi.h)

アプリ起動プリフェッチ (ALPF) 機能をさらに制御できます。

構文

typedef struct OVERRIDE_PREFETCH_PARAMETER {
  UINT32 Value;
} OVERRIDE_PREFETCH_PARAMETER;

メンバー

Value

アプリケーション ビューまたはモードを区別するための一意識別子。

注釈

アプリ起動プリフェッチ (ALPF) は、要求される前にデータとコード ページをディスクからメモリに取り込みます。 プリフェッチは、アプリケーションの起動時にアクセスされたデータとコードを監視し、後続のスタートアップの開始時にその情報を使用して、効率的な方法でコードとデータを事前に読み取り、パフォーマンスを向上させます。

ALPF が誤って予測すると、間違ったページがフェッチされ、アプリの起動が遅くなる可能性があります。 Outlook メール ビューや予定表ビューなど、"ビュー" が異なるアプリケーションでは、ビューに応じて異なるメモリ ページが必要な場合に、この問題が発生する可能性があります。 これを解決するために、アプリケーションはコマンド ラインを介してプリフェッチ パラメーターを起動に渡すことができます。これにより、ビューまたは ALPF 標準予測が失敗する原因となる他のシナリオを区別するための一意の識別子が提供されます。

ただし、場合によっては、プリフェッチによってエラーが正常に解決されるとは限りません。 たとえば、同じ実行可能ファイル内の異なるコード パスで異なるページが必要であるが、それらのスタートアップが同じプリフェッチ パラメーターを使用して起動された場合に、エラーが発生する可能性があります。 このような状況を解決するために、OVERRIDE_PREFETCH_PARAMETERをアプリで使用して、システム プリフェッチ パラメーターをオーバーライドできます ( SetProcessInformation 関数に関するページを参照してください)。

次のコード例は、コマンド ライン プリフェッチ パラメーター 2 を使用してアプリを起動するときにプリフェッチオーバーライド API を使用する方法を示しています。

  1. これはアプリの最初の起動であるため、アプリ インスタンスはそれ自体をプライマリ プロセスとして指定するとします。
  2. このプライマリ プロセスは、 OVERRIDE_PREFETCH_PARAMETERの最大許容値を照会します。
  3. オーバーライド値がこの最大値より小さいことが確認されると (アプリがプリフェッチ パラメーター 2 で起動すると)、ProcessOverrideSubsequentPrefetchParameterProcessInformation 値を使用して SetProcessInformation 関数を呼び出すことで、値 9 でオーバーライドされます。
  4. ALPF は、Override Prefetch パラメーターが設定されたことを認識します。
  5. コマンド ライン プリフェッチ パラメーター 2 を使用して、GenericApp.exe の別のインスタンスが起動されます。 プライマリ プロセスが既に存在する場合、このインスタンスは一時的なものになります。
  6. この実行可能ファイルに対して 2 から 9 のオーバーライドが設定されているため、ALPF では、この一時的なインスタンスが 2 ではなくシナリオ 9 で強制的に起動されます。
  7. ALPF は、シナリオ 2 のプライマリ プロセスの適切なページと、シナリオ 9 の他のプロセス用の個別のページセットをフェッチするようになりました。
  8. アプリのプライマリ プロセスが閉じると、オーバーライドが削除され、GenericApp.exe の次回の起動がプライマリになります。
int main (int argc, char *argv[]) {
    
    BOOL IsThisProcessPrimary;
    
    IsThisProcessPrimary = CheckIfProcessPrimary();
    
    if (!IsThisProcessPrimary) {    
    // This process is transient; it does not call the Override Prefetch Parameter API.
    PassTransientDataToPrimary(argc, argv);    
    goto Exit;    
    } else {    
    // This process is primary; attempt to call Override Prefetch Parameter    
    // before doing primary initialization.    
    SetOverridePrefetchParameter(9);
    
    InitializeThisProcessAsPrimary(argc, argv);    
    DisplayToUserAndWait();    
    }
    
Exit:
    
    return 0;    
}

DWORD SetOverridePrefetchParameter (UINT32 OverrideParameter) {
    
    OVERRIDE_PREFETCH_PARAMETER ParamInfo;    
    DWORD ErrorCode;    
    BOOL Win32Success;
    
    ZeroMemory(&ParamInfo, sizeof(ParamInfo));
    
    // Get the maximum Override Prefetch Parameter from    
    // GetProcessInformation.
    
    Win32Success = GetProcessInformation(GetCurrentProcess(),    
        ProcessOverrideSubsequentPrefetchParameter,    
        &ParamInfo,    
        sizeof(ParamInfo));
    
    if (!Win32Success) {    
        ErrorCode = GetLastError();
        goto Exit;    
    }
    
    if (OverrideParameter <= ParamInfo.OverrideScenarioId) {    
        ParamInfo.Value = OverrideParameter;    
    } else {    
        // The Override Prefetch Parameter requested isn't valid on this system.    
        // Continue to launch without setting an Override Prefetch Parameter.    
        ErrorCode = ERROR_INVALID_PARAMETER;    
        goto Exit;    
    }
    
    Win32Success = SetProcessInformation(GetCurrentProcess(),    
        ProcessOverrideSubsequentPrefetchParameter,    
        &ParamInfo,    
        sizeof(ParamInfo));
    
    if (!Win32Success) {    
        ErrorCode = GetLastError();    
        goto Exit;    
    }
    
    Exit:    
        ErrorCode = ERROR_SUCCESS;    
        return ErrorCode;    
}

要件

要件
サポートされている最小のクライアント Windows XP (デスクトップ アプリのみ)
サポートされている最小のサーバー Windows Server 2003 (デスクトップ アプリのみ)
Header processthreadsapi.h

こちらもご覧ください

列挙PROCESS_INFORMATION_CLASS、GetProcessInformation 関数