기술 정리/리눅스시스템프로그래밍

11장. 시간

투칼론 2016. 4. 10. 15:09
반응형

경과시간 측정방법


  • 실제시간 - 현실에서 사용하는 진짜 시간과 날짜
  • 프로세스 시간 - 프로세서에서 프로세스를 실행하는 데 소비한 시간
  • 모노티닉 시간 - 시동 직후부터 경과한 시스템 가동 시간. 반드시 일정하게 증가함


시간 표현 방법


  • 상대시간 - 현재 시각과 같이 특정 기준점에 대한 상대값으로 표현. 
  • 절대시간 - 특정 기준점 없이 절대값으로 표현. 유닉스 시스템은 1970년 1월 1일 기준으로 절대시간 표현


기타 정보

  • 유닉스 시간은 1970년 1월 1일 00:00:00 UTC가 기준임
  • UTC(Universal Time Coordinate) - GMT(Greenwith Mean Time) 또는 줄루(Zulu) 시라고도 함
  • 타이머 한 주기가 지나면 커널은 경과시간을 틱이나 지피(Jiffy)라는 한 단위만큼 늘림
  • 시스템의 타이머 빈도를 HZ이라고 함. 예를 들어 HZ가 100이면 타이머가 1초동안에 100번 동작(주파수가 100HZ). w지피값은 0.01초(1/HZ) 가 됨.  2.6은 1,000HZ, 2.6.13이후 버전은 250HZ로 조정 



1. 시간에 대한 자료구조


  • time_t 타입 - 초단위, 기준시간으로부터 경과한 시간(초). long값을 가짐. 가장 단순
  • timeval 구조체 - 마이크로 초 정밀도
  • timespec 구조체 - 나노초 정밀도
  • tm 구조체 - 프로그램적으로 주어진 날짜를 표현하는 문자열을 만들기 위한 구조체



2. POSIX 시계


  • clockid_t 타입 - CLOCK_REALTIME, CLOCK_MONOTONIC, CLOCK_MONTONIC_RAW, CLOCK_PROCESS_CPU_ID, CLOCK_THREAD_CPUTIME_ID. 이중에서 CLOCK_REALTIME만 POSIX 표준
  • clock_getes() - 시계 해상도 정보를 제공


3. 현재 시간 얻기

  • time() - 기준시간(1970년) 이후 경과시간을 초 단위로 환산(윤년, 윤초 무시) 
  • gettimeofday() - 마이크로 초 해상도 시간 구함
  • clock_gettime() - 나노 초 해상도 시간 구함
  • times() - 실행 중인 프로세스와 자식 프로세스의 프로세스 시간을 틱단위로 가져옴



4. 현재 날짜와 시각 설정하기

  • stime() - 시간 설정. CAP_SYS_TIME 기능이 필요하고, 보통 root 권한만 실행 가능
  • settimeofday() - gettimeofday()와 대응되는 시간 설정
  • clock_settime() - clock_gettime()과 대응되는 시간 설정


5. 시간 다루기

  • asctime() - tm구조체를 ASCII 문자열로 변환. 예로 "Sun Sep 16 01:03:52 1973"
  • asctime_r() - asctime()과 동일한 기능. 쓰레드세이프한 함수


  • mktime() - tm구조체를 time_t구조체로 변환


  • cmtime() - time_t구조체를 ASCII 문자열로 변환
  • cmtime_r() - cmtime()과 동일한 기능. 쓰레드세이프한 함수

  • gmtime() - time_t구조체를 tm구조체로 변환, UTC시간대
  • gmtime_r() - gmtime()과 동일한 기능. 쓰레드세이프한 함수


  • localtime() - time_t구조체를 tm구조체로 변환. 사용자시간대
  • localtime_r() - localtime()과 동일한 기능. 쓰레드세이프한 함수


  • difftime() - 경과한 초를 double로 변환하여 리턴


6. 시스템 시계 조율

  • adjtime() - 올바른 시간에 수렴할때까지 시계를 천천히 움직인다
  • adjtimex() - adjtime()보다 강력하고 복잡한 시간 조정 알고리즘 제공함


7. 잠들기와 대기


  • 초단위 잠들기 - sleep()
  • 마이크로 초단위 해상도로 잠들기 - usleep()
  • 나노초 해상도로 잠들기 - nanosleep()
  • 고급 잠들기 - clock_nanosleep()
  • 이식성을 고려한 잠들기 - select()
  • 시간 초과 - 평균적으로 주기가 X인 타이머의 초과비율은 X/2임


8. 타이머


  • 간단한 알람 - alarm(초)
  • 인터벌 타이머 - gettimer(), settimer()
  • 고급타이머 - timer_create(), timer_settime(), timer_gettime(), timer_getoverrun(), timer_delete()