Search
Duplicate
⚙️

[운영체제] Time의 종류와 Alarm

간단소개
타이머의 종류, 알람의 개념과 관련 함수 소개
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
Operating System
Scrap
태그
time.h
9 more properties

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)