Linux에서의 Time 측정 정밀도?

khk의 이미지

리눅스에서 시간 측정시 사용하는 함수가 여러가지 있는 것 같은데요...
일반적으로 가장 정밀한 단위까지 측정하려면 어떤 함수를 써야 하는지요..
제 경우 struct timeval 구조체와 gettimeofday() 함수를 사용하는데
이 보다 더 나은방법이 있으면 알려 주시기 바랍니다.

그리고 어느 것을 쓰던지간에 그 정밀도는 10ms 이하로는 불가능한게 맞는지요?
만약 그렇다면 왜 그런지 이유에 대해서 설명 좀 부탁드리겠습니다.

좀 더 정밀하게 micro sec나 nano sec까지 측정할 수 있는 방법이 없을까요...

wooix의 이미지

struct timeval {
long tv_sec; /* 초 */
long tv_usec; /* 마이크로초 */
};

micro sec 측정가능합니다.

평온하다~

khk의 이미지

구조체 자체는 long tv_usec으로 micro sec까지 잡혀있긴 하지만
Linux Kernel(혹은 IA32 CPU)에서 10ms 이하의 정밀도로는 처리를 못하는 걸로 알고 있습니다.

실제로 usleep(1)을 해도 usleep(10000) 했을 때와 결과는 같게 나옵니다.
제가 잘 못 알고 있는것가요? :?:

그래서 혹시나 다른 방법이 없는지 해서요....

kihlle의 이미지

CPU가 시간을 측정하는 것은 clocktick 단위이고 그 이하로는
안되는 것으로 알고 있습니다. (x86 계열은 1/17 초이던데요)
그래서, tms 같은 구조체의 단위는 clocktick이고 따라서 10ms 단위로는
안되는 것이리라 생각되는데... 정확하진 않습니다. 어쨌든, time 같은
커맨드로 시간측정해보면 불연속성이 있는것 같습니다.
clocktick 이하의 단위로 측정하는 방법도 있는지 궁금하군요.
아마 clocktick 이 1/100쯤 되는 다른머신이면 가능할수도 있겠네요.

homeless

ksil의 이미지

아울러 리눅스의 스케쥴링의 기본 단위가 10ms입니다.

HZ의 수가 100으로 10ms를 나타내어 그 이하의 정밀도의 수행은 안되는것으로 알고 있는데요 ?

커널 컴파일시 HZ의 값을 변경하면 어느 정도 원하는목적을(?) 이룰수 있다고 알고 있습니다.

icmplayer의 이미지

클럭칩 자체에선 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

ganadist의 이미지

http://high-res-timers.sourceforge.net/

POSIX 1003.1b Section 14 (Clocks and Timers) API를 리눅스에서 구현하려고 시도하는 곳입니다. 일부는 커널 2.5에 포함된걸로 알고 있습니다.

----
데스크탑 프로그래머를 꿈꾸는 임베디드 삽질러

kevinhan의 이미지

http://bbs.kldp.org/viewtopic.php?t=234

Quote:
SELECT() 함수를 사용해 보시지요.

참고하세요.

quid pro quo

이종현의 이미지

커널에서 정의된 HZ 값은 커널에서 기본적으로 사용되는 jiffies값이
1초에 몇번 증가하는지에 대한것 아닌가요.
제 서버에서 2.4 커널 소스를 보니까 HZ값이 512 더군요.
그렇다면 이론적으로 1/512초단위까지 시간측정이 가능하지 않을까 합니다.
물론 HZ값을 변경함으로서 더 정밀하게 측정할수는 있지만
CPU scheduling time이 변하게 되니까 프로그램 수행시간등을
구하는 예에는 부적절하지 않을까 짐작이 되네요.

chaeso의 이미지

시간을 잴 때는 CPU 에 있는 엄청난 정밀도의 시간 레지스터인 RTC (맞나?) 가 있고 외부 시계도 있는걸로 압니다.
컴터에 손땐지 오래되서 기억이 가물 가물 하군요..
암튼 HZ 는 인터럽터 발생 주기만 결정하는걸로 압니다. 그래서 jiffies 값이 올라가는 거구요

mach337의 이미지

이종현 wrote:
커널에서 정의된 HZ 값은 커널에서 기본적으로 사용되는 jiffies값이
1초에 몇번 증가하는지에 대한것 아닌가요.
제 서버에서 2.4 커널 소스를 보니까 HZ값이 512 더군요.
그렇다면 이론적으로 1/512초단위까지 시간측정이 가능하지 않을까 합니다.
물론 HZ값을 변경함으로서 더 정밀하게 측정할수는 있지만
CPU scheduling time이 변하게 되니까 프로그램 수행시간등을
구하는 예에는 부적절하지 않을까 짐작이 되네요.

x86 이라면 예외없이 100으로 커널 컴파일 되는 것으로 알고 었었거든요...
Alpha 라면 1024 를 사용하구요... Real-Time 인 경우는 더 큰것 같던데...
어떤 아키텍쳐의 커널인지... 궁금합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.