어느 프로그래머의 기록

core.egloos.com

포토로그



GetTickCount()의 49일 후 오버플로우. 컴퓨팅

GetTickCount() 함수.
OS부팅할 때부터 지나간 시간을 msec 단위로 돌려주는 함수이다.

뭔가 기준 시간을 잡을 때 무척 중요하게 사용되는 함수인데,
문제는 32비트 unsigned 값이다 보니 약 49일, 즉 7주 정도가 지나면 오버플로우가 발생한다.

프로그램 실행 도중에 이 경계를 넘어가면, 대소비교 등에서 문제가 생겨서 이상 동작을 하게 되므로,,
서버의 경우에 아예, OS 부팅 후 4주 넘어가면 처음부터 아예 안 뜨게 만들어 놓기도 한다.
 
하지만 다시 생각해 보니 다음과 같은 단순한 방법이 가능할 듯.

프로그램 시작할 때 GetTickCount를 읽어서 T0에 저장해 둔다.
프로그램 내에서 사용하는 모든 GetTickCount를 (GetTickCount - T0)로 대체한다.
프로그램을 7주동안 띄워놓지만 않으면, 굳이 OS를 부팅할 필요는 없지 않을까...

프로그램을 중단하고 다시 실행하는 것과, OS의 리부팅은 좀 다르다...

덧글

  • 아아아 2008/01/23 10:47 # 삭제 답글

    음.. 비스타에서는 이것보다 더 가능하다더군요 참고하세요 ㅎㅎ (몇일까지는 않구해봤다는)
  • 키키 2008/08/01 12:17 # 답글

    비스타 및 Windows 2008에서는 64비트 값을 돌려주는 GetTickCount64() 함수를 사용할 수 있지요.
    그렇지만 비스타를 테스트해 본 바로는, 비스타 코어를 사용하는 OS를 당분간 사용하고 싶지는 않네요.
    메모리 관리를 어떻게 하고 있는 건지.
댓글 입력 영역