Linux에서의 Time 측정 정밀도?
글쓴이: khk / 작성시간: 화, 2003/04/15 - 11:59오후
리눅스에서 시간 측정시 사용하는 함수가 여러가지 있는 것 같은데요...
일반적으로 가장 정밀한 단위까지 측정하려면 어떤 함수를 써야 하는지요..
제 경우 struct timeval 구조체와 gettimeofday() 함수를 사용하는데
이 보다 더 나은방법이 있으면 알려 주시기 바랍니다.
그리고 어느 것을 쓰던지간에 그 정밀도는 10ms 이하로는 불가능한게 맞는지요?
만약 그렇다면 왜 그런지 이유에 대해서 설명 좀 부탁드리겠습니다.
좀 더 정밀하게 micro sec나 nano sec까지 측정할 수 있는 방법이 없을까요...
Forums:
struct timeval { long tv
struct timeval {
long tv_sec; /* 초 */
long tv_usec; /* 마이크로초 */
};
micro sec 측정가능합니다.
평온하다~
구조체 자체는 long tv_usec으로 micro sec까지 잡혀있긴
구조체 자체는 long tv_usec으로 micro sec까지 잡혀있긴 하지만
Linux Kernel(혹은 IA32 CPU)에서 10ms 이하의 정밀도로는 처리를 못하는 걸로 알고 있습니다.
실제로 usleep(1)을 해도 usleep(10000) 했을 때와 결과는 같게 나옵니다.
제가 잘 못 알고 있는것가요? :?:
그래서 혹시나 다른 방법이 없는지 해서요....
CLK_TCK 에 영향을 받는게 아닌지?
CPU가 시간을 측정하는 것은 clocktick 단위이고 그 이하로는
안되는 것으로 알고 있습니다. (x86 계열은 1/17 초이던데요)
그래서, tms 같은 구조체의 단위는 clocktick이고 따라서 10ms 단위로는
안되는 것이리라 생각되는데... 정확하진 않습니다. 어쨌든, time 같은
커맨드로 시간측정해보면 불연속성이 있는것 같습니다.
clocktick 이하의 단위로 측정하는 방법도 있는지 궁금하군요.
아마 clocktick 이 1/100쯤 되는 다른머신이면 가능할수도 있겠네요.
homeless
아울러 리눅스의 스케쥴링의 기본 단위가 10ms입니다.HZ의 수가
아울러 리눅스의 스케쥴링의 기본 단위가 10ms입니다.
HZ의 수가 100으로 10ms를 나타내어 그 이하의 정밀도의 수행은 안되는것으로 알고 있는데요 ?
커널 컴파일시 HZ의 값을 변경하면 어느 정도 원하는목적을(?) 이룰수 있다고 알고 있습니다.
클럭칩 자체에선 8192까지 지원해 주지요.제가 알기론:64 Hz
클럭칩 자체에선 8192까지 지원해 주지요.
제가 알기론:
64 Hz 까지는 유저 프로세스로 가능하고
8192 Hz 까지는 root로만 사용가능....
커널 컴파일 하실떼 enhanced real time clock을 켜 주시면 /proc/driver/rtc를 (/dev/rtc) 사용하실수 있습니다.
MPlayer같은 프로그램들도 a/v 씽크할떼 이 기능을 쓰죠.
ioctl(fd, RTC_IRQP_SET, 1024);
이렇게 바꾸실수 있고요:
# cat /proc/driver/rtc 하시면:
periodic_freq : 1024 이렇게 나오죠.
보통 유저로 64Hz 이상으로 바꾸려면:
ioctl: Permission denied
http://high-res-timers.sourceforge.net/
http://high-res-timers.sourceforge.net/
POSIX 1003.1b Section 14 (Clocks and Timers) API를 리눅스에서 구현하려고 시도하는 곳입니다. 일부는 커널 2.5에 포함된걸로 알고 있습니다.
----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러
예전에 나왔던 비슷한 답
http://bbs.kldp.org/viewtopic.php?t=234
참고하세요.
quid pro quo
커널에서 정의된 HZ 값은 커널에서 기본적으로 사용되는 jiffies값이
커널에서 정의된 HZ 값은 커널에서 기본적으로 사용되는 jiffies값이
1초에 몇번 증가하는지에 대한것 아닌가요.
제 서버에서 2.4 커널 소스를 보니까 HZ값이 512 더군요.
그렇다면 이론적으로 1/512초단위까지 시간측정이 가능하지 않을까 합니다.
물론 HZ값을 변경함으로서 더 정밀하게 측정할수는 있지만
CPU scheduling time이 변하게 되니까 프로그램 수행시간등을
구하는 예에는 부적절하지 않을까 짐작이 되네요.
HZ 값과 상관 없는걸로 아는데..
시간을 잴 때는 CPU 에 있는 엄청난 정밀도의 시간 레지스터인 RTC (맞나?) 가 있고 외부 시계도 있는걸로 압니다.
컴터에 손땐지 오래되서 기억이 가물 가물 하군요..
암튼 HZ 는 인터럽터 발생 주기만 결정하는걸로 압니다. 그래서 jiffies 값이 올라가는 거구요
아키텍쳐가 어떻게 되는지요..?
x86 이라면 예외없이 100으로 커널 컴파일 되는 것으로 알고 었었거든요...
Alpha 라면 1024 를 사용하구요... Real-Time 인 경우는 더 큰것 같던데...
어떤 아키텍쳐의 커널인지... 궁금합니다.
댓글 달기