다음을 통해 공유


OVERRIDE_PREFETCH_PARAMETER 구조체(processthreadsapi.h)

ALPF(앱 시작 프리페치) 기능에 대한 추가 제어를 제공합니다.

구문

typedef struct OVERRIDE_PREFETCH_PARAMETER {
  UINT32 Value;
} OVERRIDE_PREFETCH_PARAMETER;

멤버

Value

애플리케이션 보기 또는 모드를 구분하기 위한 고유 식별자입니다.

설명

ALPF(앱 시작 프리페치)는 요구되기 전에 디스크에서 데이터 및 코드 페이지를 메모리로 가져옵니다. 프리페칭은 애플리케이션 시작 중에 액세스하는 데이터와 코드를 모니터링하고 후속 스타트업 시작 시 해당 정보를 사용하여 효율적인 방식으로 코드 및 데이터를 사전에 읽어 성능을 향상시킵니다.

ALPF가 잘못 예측하면 잘못된 페이지가 페치되어 앱 시작 속도가 느려질 수 있습니다. Outlook 메일 보기 또는 일정 보기와 같이 "보기"가 다른 응용 프로그램은 보기에 따라 다른 메모리 페이지가 필요하여 이 문제를 일으킬 수 있습니다. 이 문제를 해결하기 위해 애플리케이션은 명령줄을 통해 프리페치 매개 변수를 시작에 전달할 수 있습니다. 이 매개 변수는 ALPF 표준 예측이 실패하게 만드는 뷰 또는 기타 시나리오를 구분하는 고유 식별자를 제공합니다.

그러나 경우에 따라 프리페치가 항상 실패를 성공적으로 resolve 것은 아닙니다. 예를 들어 동일한 실행 파일의 다른 코드 경로에 다른 페이지가 필요하지만 이러한 시작이 동일한 프리페치 매개 변수로 시작된 경우 오류가 발생할 수 있습니다. 이러한 유형의 상황을 resolve 위해 앱에서 OVERRIDE_PREFETCH_PARAMETER 사용하여 시스템 프리페치 매개 변수를 재정의할 수 있습니다(SetProcessInformation 함수 참조).

예제

다음 코드 예제에서는 명령줄 프리페치 매개 변수가 2인 앱이 시작될 때 프리페치 재정의 API를 사용하는 방법을 보여 줍니다.

  1. 앱의 첫 번째 시작이므로 앱 instance 자신을 기본 프로세스로 지정합니다.
  2. 이 기본 프로세스는 OVERRIDE_PREFETCH_PARAMETER 허용되는 최대 값을 쿼리합니다.
  3. 재정의 값이 이 최대값보다 작은 것으로 확인되면(앱이 프리페치 매개 변수 2로 시작하는 경우) ProcessOverrideSubsequentPrefetchParameterProcessInformation 값을 사용하여 SetProcessInformation 함수를 호출하여 값 9로 재정의됩니다.
  4. ALPF는 재정의 프리페치 매개 변수가 설정되었음을 알고 있습니다.
  5. GenericApp.exe 또 다른 instance 명령줄 프리페치 매개 변수 2로 시작됩니다. 이 instance 기본 프로세스가 이미 있으므로 일시적입니다.
  6. 이 실행 파일에 대해 2에서 9까지의 재정의가 설정되었으므로 ALPF는 이 일시적인 instance 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 [데스크톱 앱만 해당]
머리글 processthreadsapi.h

추가 정보

PROCESS_INFORMATION_CLASS 열거형, GetProcessInformation 함수