퐁키조아 2021. 12. 29. 00:20

1. Interval Timers

alarm()은 초단위로만 설정이 되고 주기적 실행도 안되기 때문에 그것보다 유연하게 설정할 수 있는 타이머들을 알아보자. Interval Timer는 실제 시계, 유저공간 시계, 프로세스 시계 3가지 중에서 골라서 타이머를 작동시킬 수 있고, 주기적으로 몇초마다 실행시킬지도 정할 수 있다. 이때 alarm과 setitimer는 real-time timer로 같이 사용하면 위험하므로 하나만 써야한다.

  • $\verb|ITIMER_REAL|$: Real Time 을 측정하고, SIGALRM 시그널을 전송한다.
  • $\verb|ITIMER_VIRTUAL|$: user-space Time 을 측정하고, SIGVTALRM 시그널을 전송한다.
  • $\verb|ITIMER_PROF|$: process, kernel excecuting Time 을 측정하고, SIGPROF 시그널을 전송한다.

 

struct itimerval: struct timeval it_interval, struct timeval it_value 정보를 가지고 있다. 각각 타이머 반복 주기와 첫번째 타이머가 울리기까지의 시간을 저장한다. it_interval 이 0이면 1회용으로 작동한다.
$\verb|setitimer(int which, struct itimerval *value, struct itimerval *ovalue)|$
  • which: $\verb|ITIMER_REAL, VIRTUAL, PROF|$ 중 하나.
  • value: 타이머 등록 (itimerval)
  • ovalue: 이전에 설정된 타이머 정보를 저장

 

$\verb|getitimer(int which, struct itimerval *value)|$

현재 which 타입의 itimer 정보를 불러옴

 

2. POSIX Clocks-based Timers

itimer의 문제점은 각 3개의 타입별로 하나의 타이머만 세팅할 수 있고, 전송하는 시그널의 종류를 바꿀 수 없으며 microseconds 단위까지만 측정이 된다. POSIX 타이머는 더 광범위하게 설정이 가능하다.

struct itimerspec: struct timespec it_interval, struct timespec it_value 정보를 가지고 있다. 각각 타이머 반복 주기와 첫번째 타이머가 울리기까지의 시간을 저장한다. it_interval 이 0이면 1회용으로 작동한다.

 

$\verb|timer_create(clockid, struct sigevent *evp, timer_t *timerid)|$

POSIX 시계를 사용하는 새로운 타이머를 생성하여 timerid에 저장한다. 성공 시 0을 리턴한다.

  • clockid: CLOCK_REALTIME, MONOTONIC, PROCESS_CPUTIME_ID, THREAD_CPUTIME ID 중 하나의 시계를 선택해서 입력한다. 
  • evp: 여러가지 환경 설정을 해줄 수 있다. 디폴트의 경우 sigev_notify는 SIGEV_SIGNAL 이며, sigev_signo 에는 SIGALRM 시그널이 저장되어 있다. 그리고 sigev_value.sival_ptr은 timerid 이다.
evp.sigev_notify Notofication Mathod
SIGEV_NONE 타이머 환경 설정 없음
SIGEV_SIGNAL evp.sigev_signo 에 저장된 시그널을 프로세스에게 전송
SIGEV_THREAD evp.sigev_notify_function 을 start function 으로 하는 새로운 스레드 호출
SIGEV_THREAD_ID evp.sigev_signo 에 저장된 시그널을 sigev_notify_thread_id 에 전달

 

$\verb|timer_settime(timerid, flags, struct itimerspec *value, sturct itimerspec *ovalue)|$

timerid 타이머를 설정하는 함수이다.

  • flags: 0이면 it_value가 상대 시간으로 해석, TIMER_ABSTIME 하면 절대 시간으로 해석됨
  • value: 타이머 등록 (itimerspec)
  • ovalue: 기존에 timerid에 등록되어 있던 타이머 정보 가져오기

 

$\verb|timer_gettime(timerid, struct itimerspec *value)|$

timerid 타이머의 정보를 value에 가져온다.

 

$\verb|timer_getoverrun(timerid)|$

timerid 타이머가 overrun 된 횟수를 리턴한다.

 

$\verb|timer_delete(timerid)|$

timerid 타이머를 삭제한다.