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。
- 假设这是应用的第一次启动,因此应用实例将自己指定为主进程。
- 此主进程查询 OVERRIDE_PREFETCH_PARAMETER的最大允许值。
- 一旦确认重写值小于此最大 (当应用启动时的预提取参数为 2) ,则通过使用 ProcessOverrideSubsequentPrefetchParameter 对 SetProcessInformation 函数的调用将覆盖该值的值设置为 9。
- ALPF 知道已设置替代预取参数。
- GenericApp.exe 的另一个实例是使用命令行预提取参数 2 启动的。 此实例将是暂时性的,因为主进程已存在。
- 由于已为此可执行文件设置了从 2 到 9 的替代,因此 ALPF 将强制在方案 9 而不是 2 中启动此暂时性实例。
- ALPF 现在为方案 2 下的主要进程提取适当的页面,为方案 9 下的其他进程提取一组单独的页面。
- 当应用的主要进程关闭时,将删除替代,允许下一次启动 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 |