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 的 ProcessInformation 值,以 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 |