Linux 시간 서브 시스템 의 2: 시간의 단위 와 구 조 를 나타 낸다.

사람들 이 시간 을 나타 내 는 방법 은 년, 월, 일, 시, 분, 초, 밀리초, 주 등 이다. 그러나 커 널 에서 소프트웨어 논리 와 코드 의 편의 성 을 위해 서로 다른 시간 표시 방법 을 사용 하고 이런 표현 방법 에 해당 하 는 변수 와 데이터 구 조 를 정의 했다. 이 절 의 내용 은 바로 이러한 표현 방법의 의미 와 차 이 를 논술 하 는 것 이다.
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * / 성명: 본 블 로그 내용 은 모두http://blog.csdn.net/droidphone오리지널, 전재 출처 를 밝 혀 주세요. 감사합니다!
/*****************************************************************************************************/
1.  jiffies
커 널 은 jiffies 변수 로 시스템 이 시 작 된 이래 지나 간 시계 똑 딱 이 를 기록 합 니 다. 이 성명 은 다음 과 같 습 니 다.
extern u64 __jiffy_data jiffies_64;
extern unsigned long volatile __jiffy_data jiffies;
이 를 통 해 알 수 있 듯 이 32 비트 시스템 에서 jiffies 는 32 비트 의 부호 가 없 는 숫자 로 시스템 이 1 / HZ 초 지나 면 jiffies 의 값 이 1 을 추가 하고 최종 적 으로 이 변 수 는 넘 칠 수 있 기 때문에 커 널 은 64 비트 의 변 수 를 동시에 정의 했다. jiffies64, 링크 스 크 립 트 는 jiffies 변수 와 jiffies 를 보증 합 니 다.64 변수의 메모리 주 소 는 같 습 니 다. 보통 jiffies 변 수 를 직접 방문 할 수 있 지만 jiffies 를 얻 으 려 면64 변수, 보조 함수 getjiffies_64 로 이 루어 진다.jiffies 는 커 널 의 저 정밀도 타이머 의 시간 단위 이기 때문에 커 널 에 설 치 된 HZ 수 는 저 정밀도 타이머 의 정 도 를 결정 합 니 다. HZ 수가 1000 으로 설정 되면 저 정밀도 타이머 (timer list) 의 정 도 는 1ms = 1 / 1000 초 입 니 다.jiffies 변수 에 넘 치 는 문제 가 있 을 수 있 기 때문에 jiffies 기반 으로 비교 할 때 다음 과 같은 보조 매크로 를 사용 하여 이 루어 져 야 합 니 다.
time_after(a,b)
time_before(a,b)
time_after_eq(a,b)
time_before_eq(a,b)
time_in_range(a,b,c)

이 동시에 커 널 은 jiffies 와 밀리초, 나 초 간 의 전환 에 사용 되 는 보조 함 수 를 제공 합 니 다.
unsigned int jiffies_to_msecs(const unsigned long j);
unsigned int jiffies_to_usecs(const unsigned long j);
unsigned long msecs_to_jiffies(const unsigned int m);
unsigned long usecs_to_jiffies(const unsigned int u);

2.  struct timeval
timeval 은 초 와 초 로 구성 되 어 있 습 니 다. 그 정 의 는 다음 과 같 습 니 다.
struct timeval {
	__kernel_time_t		tv_sec;		/* seconds */
	__kernel_suseconds_t	tv_usec;	/* microseconds */
};
__kernel_time_t
화해시키다
__kernel_suseconds_t 는 사실상 모두 롱 형의 정수 이다.gettimeofday 와 settimeofday 는 timeval 을 시간 단위 로 사용 합 니 다.
3.  struct timespec
timespec 는 초 와 나 초 로 구성 되 어 있 으 며, 그 정 의 는 다음 과 같다.
struct timespec {
	__kernel_time_t	tv_sec;			/* seconds */
	long		tv_nsec;		/* nanoseconds */
};
마찬가지 로 커 널 도 jiffies, timeval, timespec 간 의 전환 에 보조 함 수 를 제공 합 니 다.
static inline int timespec_equal(const struct timespec *a, const struct timespec *b);
static inline int timespec_compare(const struct timespec *lhs, const struct timespec *rhs);
static inline int timeval_compare(const struct timeval *lhs, const struct timeval *rhs);
extern unsigned long mktime(const unsigned int year, const unsigned int mon,
			    const unsigned int day, const unsigned int hour,
			    const unsigned int min, const unsigned int sec);
extern void set_normalized_timespec(struct timespec *ts, time_t sec, s64 nsec);
static inline struct timespec timespec_add(struct timespec lhs,	struct timespec rhs);
static inline struct timespec timespec_sub(struct timespec lhs,	struct timespec rhs);

static inline s64 timespec_to_ns(const struct timespec *ts);
static inline s64 timeval_to_ns(const struct timeval *tv);
extern struct timespec ns_to_timespec(const s64 nsec);
extern struct timeval ns_to_timeval(const s64 nsec);
static __always_inline void timespec_add_ns(struct timespec *a, u64 ns);
unsigned long timespec_to_jiffies(const struct timespec *value);
void jiffies_to_timespec(const unsigned long jiffies, struct timespec *value);
unsigned long timeval_to_jiffies(const struct timeval *value);
void jiffies_to_timeval(const unsigned long jiffies, struct timeval *value);

timekeeper 의 xtime 필드 는 timespec 를 시간 단위 로 합 니 다.
4.  struct ktime
Liux 의 유 니 버 설 시간 구 조 는 ktime 로 시간 을 표시 합 니 다. 32 비트 와 64 비트, big - little endian 시스템 을 호 환 하기 위해 ktime 구 조 는 다음 과 같이 정의 되 었 습 니 다.
union ktime {
	s64	tv64;
#if BITS_PER_LONG != 64 && !defined(CONFIG_KTIME_SCALAR)
	struct {
# ifdef __BIG_ENDIAN
	s32	sec, nsec;
# else
	s32	nsec, sec;
# endif
	} tv;
#endif
};
64 비트 의 시스템 은 tv 64 필드 를 직접 방문 할 수 있 습 니 다. 단 위 는 나 초 이 고 32 비트 의 시스템 은 두 필드 로 나 눌 수 있 습 니 다. sec 와 nsec 이 며 크기 의 차 이 를 고려 합 니 다.고밀도 타 이 머 는 보통 ktime 를 시간 단위 로 한다.다음은 계산 과 변환 에 사용 되 는 보조 함수 입 니 다.
ktime_t ktime_set(const long secs, const unsigned long nsecs); 
ktime_t ktime_sub(const ktime_t lhs, const ktime_t rhs); 
ktime_t ktime_add(const ktime_t add1, const ktime_t add2); 
ktime_t ktime_add_ns(const ktime_t kt, u64 nsec); 
ktime_t ktime_sub_ns(const ktime_t kt, u64 nsec); 
ktime_t timespec_to_ktime(const struct timespec ts); 
ktime_t timeval_to_ktime(const struct timeval tv); 
struct timespec ktime_to_timespec(const ktime_t kt); 
struct timeval ktime_to_timeval(const ktime_t kt); 
s64 ktime_to_ns(const ktime_t kt); 
int ktime_equal(const ktime_t cmp1, const ktime_t cmp2); 
s64 ktime_to_us(const ktime_t kt); 
s64 ktime_to_ms(const ktime_t kt); 
ktime_t ns_to_ktime(u64 ns);

좋은 웹페이지 즐겨찾기