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

1. Time의 종류

  • Wall Time (Real Time): 실제 시간. Absolute Time을 측정하기 위해 사용됨. (ex 2021년 12월 8일)
  • Monotonic Time: 상대적인 시간. Relative Time을 측정하기 위해 사용됨. 사용자가 임의로 변경할 수 없다. (ex 컴퓨터가 켜진 뒤로부터 지난 시간, 두 샘플에서 시간차이를 측정) 
  • Process Time: 프로세스가 user-space, kernel에서 사용된 시간. 프로세스 profiling 등에 사용됨. 프로세스 시간은 멀티 태스킹 환경에서 wall time보다 천천히 돌아가는 것처럼 보일 수 있다.

 

2. Hardware Clocks

  • Real Time Clock (RTC): 컴퓨터가 꺼져도 시간이 흘러가는 것을 기록함. 
  • High Precision Event Timer (HPET): RTC보다 높은 Resolution의 periodic interrupts 를 발생시킬 수 있다. 시스템이 꺼지면 동작하지 않는다.
  • Time Stamp Counter (TSC): CPU 사이클이 몇번 발생했는지를 누적하는 레지스터이다. HPET보다 Resolution이 높다. periodic interrupts 를 발생시킬 수 없고 시스템이 꺼지면 동작하지 않는다.

 

3. Software Clocks

  • Timer interval이 종료되면 커널은 경과 시간을 tick / jiffy 단위로 증가시킨다. 디폴트 간격은 4ms 주기 (250HZ)
  • System Time: Unix Time (00:00:00 1 Jan 1970) 으로부터 지난 시간을 기록한다.

 

4. Unix - get, set time

struct timeval: seconds, micro seconds 정보를 저장한다.
struct timeval {
	time_t tv_sec; // seconds
	suscenods_t tv_usec; // micro seconds
}

 

$\verb|gettimeofday(struct timeval *tv, struct timezone *tz)|$

System Time의 값을 tv에 저장한다. (tz는 항상 NULL 사용) (성공 시 0 리턴)

 

$\verb|settimeofday(struct timeval *tv, struct timezone *tz)|$

System Time의 값을 tv에 저장된 값으로 변경한다. (tz는 항상 NULL 사용) (성공 시 0 리턴)

 

5. POSIX Clocks

  • $\verb|CLOCK_REALTIME|$: Real time
  • $\verb|CLOCK_MONOTONIC|$: 시스템이 부팅된 후 지난 시간
  • $\verb|CLOCK_PROCESS_CPUTIME_ID|$: 프로세스가 사용한 시간
  • $\verb|CLOCK_THREAD_CPUTIME_ID|$: 스레드가 사용한 시간

 

6. POSIX - get, set Time

struct timespec: seconds, nano seconds 정보를 저장한다.
struct timespec {
	time_t tv_sec; // seconds
	long tv_nsec; // nano seconds
}

 

$\verb|int clock_getres(clock_id, struct timespec *res)|$

clock_id의 resolution 값을 가져와서 res에 저장한다.

 

$\verb|int clock_gettime(clock_id, struct timespec *ts)|$

clock_id 시계의 값을 ts에 저장한다. (성공 시 0 리턴)

 

$\verb|int clock_settime(clock_id, struct timespec *ts)|$

clock_id 시계의 값을 ts의 값으로 설정한다. (성공 시 0 리턴)