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) ,则通过使用 ProcessOverrideSubsequentPrefetchParameterSetProcessInformation 函数的调用将覆盖该值的值设置为 9。
  4. ALPF 知道已设置替代预取参数。
  5. GenericApp.exe 的另一个实例是使用命令行预提取参数 2 启动的。 此实例将是暂时性的,因为主进程已存在。
  6. 由于已为此可执行文件设置了从 2 到 9 的替代,因此 ALPF 将强制在方案 9 而不是 2 中启动此暂时性实例。
  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 [仅限桌面应用]
标头 processthreadsapi.h

另请参阅

PROCESS_INFORMATION_CLASS 枚举,GetProcessInformation 函数