timer를 사용해서요 일정한 간격에 데이터를 보내는데요...

leo~~~~의 이미지

제가 struct itimerval를 사용해서
일정한 간격으로 데이터를 보내려고 하는데요
1.25 밀리세컨드마다 보내려고요

struct itimerval timer

timer.it_interval.tv_usec = 1250;

이렇게 했는데요...
1.25 밀리세컨드가 1250 마이크로 세컨드가 맞자나요??
시스템 시간찍어서 확인해보니까요
interval이 0.01초더라구요...
이상해서 1로 바꿨는데도....0.01 정도더군요....
interval을 1.25 밀리세컨드로 하려면 어떻게 해야 하나요??

ssehoony의 이미지

시그널 인터벌 사이에는 커널이 스케줄링을 하게 되는데
그 것 또한 시간을 소비하는 작업입니다.
아무리 시그널 인터벌을 작게 잡아도, 그런 커널 처리 시간보다 작을 수는 없습니다.
leo~~~~님 의 10밀리 세크 간격은 그러한 시간 간격이라 보시면 됩니다.

그리고 1.25 밀리세컨드의 일정 간격을 계속 유지하는 것은 범용 OS 로는 힘듭니다.
real time OS 라고 들어보셨나요? 보통 RTOS 라고 표기하는데
leo~~~~님의 경우 처럼 (크든 작든) 일정 시간 간격 내에 반응을 해줘야 하는 곳에서 사용하는 OS 입니다. (자동차의 에어백 같것 말이죠)

RTOS 는 응답시간의 보장에 초점을 둡니다. 응답시간이 작다는 것을 의미하는 것은 아니고, 인간이 예상할 수 있는 (늦던 빠르던) 응답시간이 요구될 때 사용하고, 일반 범용 OS는 컴퓨터 전체의 throughput 에 좀 더 초점을 둡니다.
그렇다고 일반 OS 가 응답시간을 무시한다는게 아니고 RTOS 보다 상대적으로 그렇다는 것이지요.
일반 OS의 경우 메모리 SWAP IN, SWAP OUT 이 발생하는데 이건 프로그래머가 언제 발생할지, 얼마나 시간이 걸릴지 예상이 불가능하지요.
이런 요소도 RTOS 에서는 발생빈도는 어쩔 수 없다 하여도, 최대 응답 시간은 예상 가능 해야 한다는 것이지요. (안그러면 에어백이 늦게 터져 유명무실해 질 수가 있죠.)

서버의 부하를 무시하고 구현한다면
시그널 등을 사용하지 말고, 그냥 무한 루프를 돌면서 시간간격을 직접 계산해서 해당 시간에 송신하면 어느정도 해결 할 수 있을 듯 하군요. 하지만 이것도 계속 유지하는 건 불가능 이겠죠.
1.25 밀리세크와 같은 작은 시간은 소켓으로 송신하다면 소켓처리 시간의 오차도 발생하고 중간에 장비에 의한 오차. 더욱이 TCP를 사용한다면 네이글 알고리즘의 사용여부에 따른 지연등 많이 복잡해 집니다.

leo~~~~의 이미지

좋은 정보 감사드립니다~~
음...근데요 정확하면 좋겠지만
그렇지 않다하고 1.25 밀리세컨드 정도의
간격으로 데이터를 보낼수는 없나요??

struct itimerval timer
timer.it_interval.tv_usec = 1250;

이렇게 하는게 아닌가요??

익명 사용자의 이미지

rtc 를 이용하면 조금더 정확할겁니다

/usr/src/linux/Documentation/rtc.txt
참고 하세요

익명 사용자의 이미지

타이머 사용법이 틀리지는 않았습니다만, ssehoony님의 답변처럼 범용운영체제에서는 이를 보장받기가 어렵습니다. 특화된 운영체제나, 관련 패치를 사용하셔야하는데 realtime관련 패치 또는 realtime os를 사용하셔야 합니다.

아주 오래전에 VOD 시뮬레이션할때, 초당 30 프레임을 전송하는 테스트를 했었는데, 30ms(밀리초)단위 전송을 시행하는 것도 어렵더군요.(타이머가 밀리기 시작함 ;소위 오차가 생기고; 보정을 해주어야 한다는...) 현재 컴퓨터들의 하드웨어 사양이 좋아졌지만, 오차를 규정짓고 보정하는 로직을 생각하는 것이 필요합니다.
아울러, 매 1.25밀리세컨드 단위로 어떤 후처리(?)를 한다고 했을때, 그 후처리를 하는시간은 1.25밀리세컨드 보다 작은 시간내에 일어나야 한다는 것은 자명하겠지요? 이런 정도라면, 하드웨어의 도움 및 실시간 운영체제를 검토하시는것이 좋을 듯합니다.

cococo의 이미지

익명 사용자의 이미지

leo~~~~ wrote:
제가 struct itimerval를 사용해서
일정한 간격으로 데이터를 보내려고 하는데요
1.25 밀리세컨드마다 보내려고요

struct itimerval timer

timer.it_interval.tv_usec = 1250;

이렇게 했는데요...
1.25 밀리세컨드가 1250 마이크로 세컨드가 맞자나요??
시스템 시간찍어서 확인해보니까요
interval이 0.01초더라구요...
이상해서 1로 바꿨는데도....0.01 정도더군요....
interval을 1.25 밀리세컨드로 하려면 어떻게 해야 하나요??

8) 8) 8) 8) 8) 8) 8)
ksil의 이미지

leo님이 측정하신 10ms는 보통의 리눅스가 10ms단위로 스케쥴링 되기때문에 그렇습니다.

Windows나 Linux나 10m단위 이하의 작업은 안되는것으로 알고 있습니다.

아주 코드가 간단하다면야 interrupt를 사용하는 방법도 있겠지만....

다른 코드 안들어가고 그 코드만 들어간다면야 어셈으로 짜도 될것 같습니다만...

어떤 경우도 수월치 않게 생각됩니다.

# 1.25ms라고 하시니 800 Hz로 데이타를 처리하시는 것 같은데...

댓글 달기

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