Поделиться через


структура 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).

Примеры

В следующем примере кода показано, как использовать API переопределения предварительной выборки при запуске приложения с параметром предварительной выборки командной строки 2.

  1. Предположим, что это первый запуск приложения, поэтому экземпляр приложения назначает себя основным процессом.
  2. Этот основной процесс запрашивает максимально допустимое значение OVERRIDE_PREFETCH_PARAMETER.
  3. После подтверждения того, что значение переопределения меньше этого максимума (когда приложение запускается с параметром предварительной выборки 2), оно переопределяется значением 9 путем вызова функции SetProcessInformation, используя значение ProcessInformation ProcessOverrideSubsequentPrefetchParameter.
  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