Time
시간의 종류
•
Wall time
◦
이벤트의 시간이나 유저와 소통에 사용하는 시간이다.
◦
absolute time 즉 프로세스나 cpu동작과 관계 없이 계 바깥의 시간
◦
사용자가 변경하는 것이 가능하다.
•
Monotonic time
◦
시간의 간격이 일정하고 항상 증가하기만 하는 시간. 사용자가 임의조작하는것이 불가능하다.
▪
System's uptime
◦
특정한 계 내에서 시간을 측정하는데에 유용하다
•
Process time
◦
프로세스가 CPU 자원을 소모한 시간으로 CPU자원을 할당받지 않고 있을 경우엔 흐르지 않는다.
◦
프로세스 성능을 파악하는 등의 용도로 사용한다.
시간을 측정하는 하드웨어 장치
•
Real Time Clock (RTC)
◦
현실의 시간, 즉 Wall time을 측정하는데 사용될 수 있으며
◦
하드웨어가 꺼져 있는동안에도 시간은 흘러야 한다.
◦
정밀도가 높지 않은 편이다.
•
High Precision Event Timer (HPET)
◦
periodic interrups를 발생시킬 수 있는 상당히 정밀한 시계이다.
◦
하드웨어가 종료될땐 동작을 하지 않는다.
•
Time Stamp Counter (TSC)
◦
시피유 사이클이 몇번 일어났는지 계측하는 시계이다.
◦
HPET보다 높은 정밀도를 갖지만, periodic interrupt를 제공하지는 않는다.
하드웨어 장치를 이용하는 소프트웨어: System Clock
리눅스에서는 system clock의 최소 단위 시간(tick)을 HZ라는 단위로 표기한다.
System Time
Unix 유래 time 계측
POSIX 유래 time 계측
Sleep
•
sleep: 잔다. CPU 자원을 배정받지 않는다
초단위로 잠을 재우는 sleep()
unsigned int sleep(unsigned int seconds)
C
복사
•
seconds만큼 재우고 시간이 흐른 뒤 깨운다.
•
return: 알맞게 잤다면 0을 반환, 덜 잤다면 덜 잔 시간을 반환
나노초 단위로 잠을 재우는 nanosleep(timespec *req, timespec *remain)
int nanosleep(
const struct timespec *req, // 얼마나 재울지
struct timespec *rem) // 일찍일어났다면 얼마나 일찍인지 저장해준다.
C
복사
•
nano초 단위로 잠을 자고 중간에 잠이 깬 경우 잔여시간을 rem에 저장해준다.
•
CLOCK_REALTIME을 사용하여 계측한다.
•
return: 잘 잤다면 0 중간에 깼다면 -1
특정 시계를 기준으로 잠을 재우는 clock_nanosleep(clock_id, flag, req, rem)
•
clock_id에 명시된 시간을 기준으로 잠을 자고 일어나게 해준다.
◦
**** 중요!! clock_id에 CLOCK_PROCESS_CPUTIME_ID이나 CLOCK_THREAD_CPUTIME_ID이 올 수 없다.
→ 영원히 자게된다.
•
select()로도 잠을 재울 수 있다. (unix clock 사용)
•
일정 초 뒤에 프로세스에 SIGALARM을 주는 alarm()
◦
이미 설정된 alarm이 작동 중이라면 오래된 알람 해제하고 새 알람으로 교체
◦
실행한다고 잠들지 않고 SIGALARM만 예약해주는 함수
Timers
•
alarm()보다 많은 기능을 제공한다.
Interval Timer UNIX기반
itimer 구조체 itimerval
itimer설정 setitimer(which, itimerval newval, itimerval oldval)
itimer에 저장된 값을 가져오기 getitimer(which, itimerval)
Interval Timer POSIX기반
•
Unix기반 타이머들은 간단하지만 overrun에 대응하지 못하고, 여러개 만드는데 제한이 있다.
•
이를 해결해주는 POSIX itimer가 있으니 걱정하지말자
구조체 itimerspec
Itimer 생성 timer_create(clockid, * sigevent, * timerid)
Itimer alarm 세팅 timer_settime
•
delete timer int timer_delete(timer_t timerid)