시스템의 부팅후 지난 시간을 알고 싶습니다.

uribery의 이미지

안녕하세요.
부팅후 지난 시간을 알고 싶습니다.
수십 ms, 단위의 값이 필요하기 때문에
sysinfo 함수는 적합하지 않더군요.

현재는 fopen("/proc/uptime"...) 를 이용하고 있습니다만.
/proc/uptime 관련해서 fopen, fclose가 빈번하게 일어나는 것도 그리 마음에 안들어서요.
시스템의 날짜, 시간은 바뀔수 있기때문에 gettimeofday() 함수를 이용하기도 어렵습니다.

sysinfo에서처럼 부팅후 시간을 불러오는 함수는 없을까요?

그럼 좋은 하루 보내세요. ^^

익명사용자의 이미지

fopen("/proc/uptime"...) + Real Time Clock을 사용하심이..

coremaker의 이미지

time stamp counter 를 이용하시면 되겠습니다..
CPU 내의 time tick 저장하는 Register 입니다....

long long type으로 읽어들여야하는 64비트 크기로 되어있고..

register에서 time stamp counter 값을 얻어내셨다면..
이 값은 CPU의 cycle 수 임으로..

CPU 의 HZ 값에 따라서 수식을 적용하시면 되겠습니다..

부팅시 time stamp counter를 읽으시고 저장하시고..
값이 필요할 때 마다... 현재 값에서 부팅 시 값을 빼..
Nano 초 등으로 변환해 적용하시면 되겠습니다..

/usr/include/asm or /usr/include/asm-i386 or
/usr/include/asm-x86_64/ 디렉토리내의

msh.h 에

#define rdtsc(low, high) \
__asm__ __volatile__("rdtsc":"=a"(low),"=d"(high)

이 정의되어있으며...

low와 hight 는 long 형으로 지정해서 읽어서..
long long 으로 쓰시던지 아니면..

struct rdtsc_val {
long low;
long high;
};

형식으로 사용하시면 되겠습니다...

nano second 로의 변환은 ..

tsc.c 에 정의되어 있는..

cycle_2_ns(..) 를 사용하셔도 될 것 같은데...
어쨋든...

도움이 되셨는지 모르겠네요..

uribery의 이미지

intel 계열인데 x86이 아니라 xscale입니다. TT
아무래도 어셈이 들어간것으로 보아서는 x86이고 커널 영역에서 사용할 수 있는 방법같습니다.

빈번하게 참조하는 관계로 fopen("/proc/uptime"..)을 피하고 싶어서요.
fgets, sscanf 쓰는것도 웬지 불필요한 일을 하는 기분이 들구요.
그냥 참조하는것보다 fopen을 통하면 웬지 성능 저하가 많을것 같은 느낌이 듭니다.

책도 좀 찾아보았는데, jiffies 값을 참조하면 유용할것 같은데, 사용자 영역에서 참조할수있는 방법을 없을까요?

감사합니다. ^^

MasterQ의 이미지

수십 ms정도의 정확도가 필요한 프로그램이라면 /proc/uptime을 사용하는것이 제일 좋은 방법인것 같습니다. disk에서 불러오는것도 아니라서 open하고 잃어오는데에 버려지는 시간은 충분히 무시할수 있습니다. open이 문제라면 한번 open해 놓고 lseek을 사용해도 되는것이구요..

단지 "느낌"상 꺼림직 해서 피하고 싶거나 parse하는데 걸리는게 번거로워서라면 간단한 커널모듈을 만들어서 jiffies를 보낼수도 있겠지만, uptime이 존재하는데 그럴 필요는 없겠지요.

uribery의 이미지

아 fopen문제는 전에 framebuffer 관련 예제를 살펴보다가 보니
memory에 있는 것이지만
fopen으로 제어할때와 mmap로 제어할때 fopen쪽에서는 꽤나 부하가 많이 걸리는 것을 보아서요.
그래서 가능하면 fopen을 안쓰고 가능한 방법이 있지않을까해서요.
가능하면 sscanf와 같은 라이브러리 호출없이 하고 싶었는데, 적절한 방법이 없나보네요.
답변감사합니다. ^^

bushi의 이미지

read/write() 와 mmap 과의 차이를 헷갈리셨나봅니다.
mmap() 도 open() 은 해야 가능합니다.
그리고 mmap() 은 모든 것이 PAGE_SIZE 로 align 되어 있기 때문에 만병통치약은 아닙니다.

read() 가 부담되신다면 간단한 character device (misc 를 이용하면 쉽겠지요) 를 만드셔서 mmap() 를 제공하시면 됩니다.
다만, uptime 자료를 저장할 공간으로 PAGE_SIZE align 된 공간만큼을 할당해야 한다는 것을 주의하세요.

설사 xscale 이 아니라 x86 이라 하더라도 /proc/uptime 에서 제공하는 것과 같은 자료를 참조하셔야 합니다.
CPU 의 tick 레지스터는 overflow 로 인한 wrapping 이 일어납니다.
실제 wrapping 이 일어날 시... arch 에 따라 구현의 차이가 있지만 arm 의 경우 systime 도 수십ms 정도의 오차가 생깁니다.
해당 부분을 보면 type casting 을 사용 예측(?)제어를 하는 트릭을 보실 수 있을 겁니다.
물론 jiffies 도 wrapping 됩니다. 2.6 의 64bit jiffies 는 상당이 크긴 하지만요.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.