setitimer , getittimer 값이 이해가 안되네요
글쓴이: shamlock / 작성시간: 목, 2005/08/18 - 5:33오후
#include <stdio.h> #include <sys/time.h> #define MILLION 1000000L int main(void) { int i; long diftime; struct itimerval a, b; a.it_interval.tv_sec = 0; a.it_interval.tv_usec = 0; a.it_value.tv_sec = MILLION; /* a large number */ a.it_value.tv_usec = 0; if (setitimer(ITIMER_VIRTUAL, &a, NULL) == -1) { perror("Failed to set virtual timer"); return 1; } for(i=0;i<10;i++) { printf("."); fflush(stdout); usleep(1000); } if (getitimer(ITIMER_VIRTUAL, &b) == -1) { perror("Failed to get virtual timer"); return 1; } printf("\n처음 설정 시간: %06ld초.%06ld" , a.it_value.tv_sec, a.it_value.tv_usec); printf("\n남은시간 : %06ld초.%06ld" , b.it_value.tv_sec, b.it_value.tv_usec); printf("\n"); diftime = MILLION*(a.it_value.tv_sec - b.it_value.tv_sec) + a.it_value.tv_usec - b.it_value.tv_usec; printf("The function_to_time took %ld microseconds or %f seconds.\n", diftime, diftime/(double)MILLION); return 0; }
a.out .......... 처음 설정 시간: 1000000초.000000 남은시간 : 1000000초.010000 The function_to_time took -10000 microseconds or -0.010000 seconds.
왜 남은 시간이 더 큰거죠?
Forums:
답좀 알려주세요
..
@.@
struct itimerval 의 필드값을 잘 못이해하신것 같습니다.
struct itimerval 의 필드값을 잘 못이해하신것 같습니다.
둘이 합쳐하나의 시간을 말하는 것이 아니라, 하나는 만료시간이고, 하나는 지난시간입니다.
---
http://coolengineer.com
Unix Systems Programming 책을 보고 있는데요. 이상하네요.
책에는 이렇게 나오거든요
Kay A.Robbins, Steven Robbins 공저
글구 맨페이지를 봐도 비슷한 내용인데..
@.@
ITIMER_REAL로 설정하니깐 제대로 나오네요.. 희한하네
아침부터 ... 이런 저런 테스트하게 되네요
위의 소스코드에서 ITIMER_VIRTUAL을 ITIMER_REAL로 설정하니깐
실행결과가 예상했던대로 남아 있는 시간이 나오네요
ITIMER_VIRTUAL은 프로세스가 실행한 시간(sleep 이나 블럭킹은 빼고)
ITIMER_REAL는 경과한 벽시계 시간
인 것으로 이해하고 있었는데 그렇다면 ITIMER_VIRTUAL을 ITIMER_REAL이 비슷하게 나와야할 것 같은데..이상하네요
@.@
먼저, usleep(1000)한 시간은 타이머 감소에 포함되지 않습니다.
먼저, usleep(1000)한 시간은 타이머 감소에 포함되지 않습니다. 타이머타입을 ITIMER_VIRTUAL로 설정하셨기 때문이지요.
설정값보다 남은 타이머의 값이 더 크게 나온 것은 setitimer()/getitimer() 구현의 버그이거나, 아니면 어떤 이유가 있기 때문이 아닐까 싶습니다. 가령 (약간 오버성이 있습니다만) 함수 실행 시간을 보정해 준다는 명목으로 setitimer시에 틱 하나정도 증가시켜서 타이머를 저장하는 거 같습니다. do_setitimer의 소스를 찾아보니 ITIMER_VIRTUAL의 경우와 ITIMER_PROF의 경우는 it_value의 값에다 틱 하나만큼 붙여서 저장하는 거 같네요. (j++) (2.6.11기준입니다.)
이게 옳은 건지, 옳지 않은 건지는 잘 모르겠습니다. 어쨌든 실수는 아니고, 의도된 것은 분명한 것 같습니다. :-)
FreeBSD 7-CURRENT에서는, 다음과 같은 결과가 나옵니다. (효과를 확실히 보기 위해 i < 1000인 동안 loop을 실행시켰습니다.)
덧. 위에 글을 쓰셨네요. :-) ITIMER_VIRTUAL의 경우는 프로세스가 RUNNING상태일때만 timer를 감소시키므로 sleep()한 시간은 포함이 되지 않는 것입니다.
두번째 덧글. 루프를 10000번 정도 실행시키니까 시간의 감소가 보입니다. 물론 usleep(1000)은 빼고 실행시키시는 편이 시간을 절약하실 수 있겠습니다. :-)
----
Let's shut up and code.
커널 소스가 허술하네요
getitimer할때 처음 설정값보다 더 크면 별도의 처리를 해줬으면 좋겠는데..
커널 개발자분들이 이정도를 예상하지 못했다는게..좀 납득이 안되네요
마이크로 초 단위의 타이머로는 부족한 점이 있네요
@.@
댓글 달기