성능 카운터 값을 예기치 않게 앞으로 도약 있습니다.

기술 자료 번역 기술 자료 번역
기술 자료: 274323 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

이 페이지에서

현상

QueryPerformanceCounter 함수에 의해 반환되는 결과 예기치 않게 앞으로 시간이 도약 수 있습니다. 이 윤년인지 몇 초 나타낼 수 있습니다.

원인

이 문제는 일부 칩셋 산업 표준 아키텍처 (ISA) 브리지에 주변 기기 구성 요소 상호 연결 (PCI) 디자인 결함으로 인해 발생합니다. 일반적으로 이 브리지는 있는 남쪽 브리지의 라고 합니다. 운영 체제가 있는 브리지에서 예기치 않은 결과 일련의 받으면 점프를 PCI 버스 부하가, 발생합니다. 운영 체제가 예기치 않은 결과를 검색하여 성능 카운터를 추가하려면 금액을 계산합니다. 앞으로 이동하려면 QueryPerformanceCounter 에서 반환된 결과가 발생합니다.

해결 방법

프로그램에 대한 예기치 않은 점프 QueryPerformanceCounter 후속 호출을 GetTickCount 함수는 연속 호출에 의해 결정된 대로 시간 변경 의해 결정된 대로 시간 변경 비교하여 주의해야 합니다. QueryPerformanceCounter (), 있지만 GetTickCount 를 기반으로 없음 비슷한 증가 기반으로 중요한 점프 없을 경우 다음 이를 성능 카운터 바로 앞으로 점프했습니다 것을 간주할 수 있습니다. 이 문서의 끝 코드 샘플에서는 이 작업을 수행하는 방법을 보여 줍니다.

현재 상태

이 운영 체제가 의도적으로 설계된 동작입니다. 운영 체제 칩셋에서 신뢰할 수 없는 데이터를 얻을 때 성능 카운터 조정이 필요합니다.

추가 정보

하드웨어 칩 내에서 디자인 결함 오류 정정 정보가 것으로 알려져 있습니다. 이러한 디자인 결함을 통해 게시된 사양을 벗어나는 제품을 발생할 수 있습니다. 오류 정정 정보가 특정 칩셋에 [NULL]에 대한 자세한 내용은 칩세트의 하드웨어 공급업체에 문의하십시오.

Windows 레지스트리에 다음 키 내에서 PCI 식별자를 있는 컴퓨터 PCI 구성 요소는 식별할 수 있습니다.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCI
하위 키 이름을 다음 형식으로 있어야
VEN_ xxxx & DEV_yyyy & SUBSYS_aaaaaaaa 및 REV_bb
여기서 xxxx: yyyy PCI 식별자를 나타냅니다.

현재, 다음 PCI 식별자가 칩 성능 카운터 값이 점프 우리 것으로 알려져 있습니다.
표 축소표 확대
PCI ID하드웨어 공급업체
1039:0530실리콘 Systems (SiS) 통합
1039:0620실리콘 Systems (SiS) 통합
10b9:0533acer Labs, Inc. (알리)
10b9:1533acer Labs, Inc. (알리)
1106:0596VIA 기술, Inc. (VIA)
1106:0686VIA 기술, Inc. (VIA)
1166:004fServerworks Corporation
1166:0050Serverworks Corporation
8086:7110Intel Corporation
이 목록에 다른 칩셋의 동작을 Microsoft 준수합니다 대로 업데이트됩니다.

예제 코드

다음 코드 예제는 위에서 설명한 성능 카운터 leaps 검색하는 방법을 보여 줍니다. 예를 들어, PIIX4 칩세트 가진 컴퓨터에서 코드를 실행할 경우 이 콘솔 응용 프로그램 성능 카운터 값이 leaps 산발적으로 보고합니다.
#include <windows.h>
#include <stdio.h>

void main() {

   LARGE_INTEGER liFrequency;
   LARGE_INTEGER liCurrent;
   LARGE_INTEGER liLast;
   LARGE_INTEGER liRecent[10];
   DWORD dwCurrent;
   DWORD dwLast;
   DWORD dwPerfElapsed;
   DWORD dwTickElapsed;
   int i = 0;
   int j;

   // Save the performance counter frequency for later use.
   if (!QueryPerformanceFrequency(&liFrequency))
      printf("QPF() failed with error %d\n", GetLastError());

   // Query the performance counter value and tick count.
   dwCurrent = GetTickCount();
   if (!QueryPerformanceCounter(&liCurrent))
      printf("QPC() failed with error %d\n", GetLastError());

   liLast = liCurrent;
   dwLast = dwCurrent;

   while (TRUE) {

      // Query the performance counter value and tick count.
      if (!QueryPerformanceCounter(&liCurrent))
         printf("QPC() failed with error %d\n", GetLastError());
      dwCurrent = GetTickCount();

      // Store the performance counter value in the list of recent values.
      liRecent[i].QuadPart = liCurrent.QuadPart;
      i = (i+1) % 10;

      // Convert difference in performance counter values to milliseconds.
      dwPerfElapsed = (DWORD) (((liCurrent.QuadPart - liLast.QuadPart) 
            * 1000) / liFrequency.QuadPart);
      
      dwTickElapsed = dwCurrent - dwLast;

      // Check for a discrepancy greater than 500 milliseconds.
      if (abs(dwPerfElapsed - dwTickElapsed) > 500) { 

         // Print the previous 9 performance-counter values.
         for (j=9; j>0; j--) {
            printf("      Previous %d:  %I64X\n", j, liRecent[i].QuadPart);
            i = (i+1) % 10;
         }

         // Print the leap value.
         printf( "LEAP: Current:     %I64X  delta = %I64X\n", 
               liCurrent.QuadPart, liCurrent.QuadPart - liLast.QuadPart);
         
         // Retrieve and print the next 9 performance-counter values.
         for (j=1; j<=9; j++) {
            
            QueryPerformanceCounter(&liCurrent);
            printf("      Next     %d:  %I64X\n", j, liCurrent.QuadPart);
            
            liRecent[i].QuadPart = liCurrent.QuadPart;
            i = (i+1) % 10;
         }

         printf("\n");
      }

      liLast = liCurrent;
      dwLast = dwCurrent;
   }

   return;
}

속성

기술 자료: 274323 - 마지막 검토: 2006년 11월 21일 화요일 - 수정: 3.1
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft Win32 Application Programming Interface
키워드:?
kbmt kbapi kbkernbase kbperfmon kbprb KB274323 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.
더 이상 지원되지 않는 제품의 KB 내용에 대한 고지 사항
이 문서에서는 Microsoft에서 더 이상 지원하지 않는 제품에 대해 설명합니다. 따라서 이 문서는 "있는 그대로" 제공되며 업데이트되지 않습니다.

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com