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);
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.