|
윈도우 기본 타이머가 1/1000 초 주기인건 아닙니다.
Win95 ~ XP 까지 대개 최소타이밍이 다른데, 정확히 기억나진 않지만, XP의 경우 10ms 정도 (1/100초)
였던 것 같습니다.
DOS 는 1/18.2초 였고, 95 98정도도 비슷했던걸로 기억합니다.
2000 이, 1/50 이었나.
기억이 정확하지 않아 타이머 두개로 테스트를 해 봤습니다.
하나는 1ms 주기 하나는 1000ms 주기(1sec) 로 놓고, 1ms 타이머에선 int 형 카운터 변수를 1씩증가
1000ms 타이머에선 카운트 횟수를 출력하고 0으로 reset하게 말이죠.
평균 64회 카운트 됩니다. (1/64초) Windows XP(SP2)입니다.
즉, 15ms 정도 주파수 단위로 밖에 카운트가 안된다는거죠.
RDTSC 는 CPU 내부의 클럭 카운터입니다. (ReaD Time Stamp Counter 던가요)
3Ghz CPU 에선 1초에 3,000,000,000 회 카운트가 되죠.
대신에, 단지 세어주는 기능을 하는 녀석이라, 루프를 돌면서 Sleep 이라든지
적절한 흐름 제어가 필요한 것이죠.
답변을 올리신 분도 제대로 조사를 해 보셔야 할 것 같은데,
섣부른 답변이셨던듯 합니다.
다시 말씀드리지만, 단위가 1msec 라고 1msec 주기로 타이머 주파수가 발생하는건 아닙니다.
RDTSC 를 사용하는 방법은, 어셈블리나 인라인 어셈블리로 RDTSC 명령어를 날리거나
그 명령어를 지원하지 않는 경우는 emit 나 db 같은 instruction을 직접 보내주는 명령어로
명령어의 hex 값을 써 줘야 합니다. 구글에서 rdtsc 검색해 보시면 곳곳에 나올 것이구요.
인라인 어셈블리까지 동원할 만큼 최소의 클럭소모가 필요하지 않은 경우엔,
QueryPerformanceCounter API를 사용해서(내부적으로 RDTSC를 조사하는 함수로 알고 있습니다)
전원이 들어온 뒤, 현재까지의 클럭 카운트를 읽어(RDTSC)올 수 있습니다.
즉, 쓰레드를 하나 만드셔서, 적절히 RDTSC 하시면서 요구된 주파수에 이벤트 핸들러 함수를
콜백해 줄 수 있는 형태로 만드시면 되는 것이지요.
|