日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux时间子系统之二:表示时间的单位和结构【转】

發布時間:2024/4/17 linux 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux时间子系统之二:表示时间的单位和结构【转】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文轉載自:http://blog.csdn.net/droidphone/article/details/7979295

目錄(?)[+]

人們習慣用于表示時間的方法是:年、月、日、時、分、秒、毫秒、星期等等,但是在內核中,為了軟件邏輯和代碼的方便性,它使用了一些不同的時間表示方法,并為這些表示方法定義了相應的變量和數據結構,本節的內容就是闡述這些表示方法的意義和區別。

?

/*****************************************************************************************************/

聲明:本博內容均由http://blog.csdn.net/droidphone原創,轉載請注明出處,謝謝!

/*****************************************************************************************************/

1. ?jiffies

內核用jiffies變量記錄系統啟動以來經過的時鐘滴答數,它的聲明如下:

?

[cpp]?view plaincopy
  • extern?u64?__jiffy_data?jiffies_64;??
  • extern?unsigned?long?volatile?__jiffy_data?jiffies;??
  • 可見,在32位的系統上,jiffies是一個32位的無符號數,系統每過1/HZ秒,jiffies的值就會加1,最終該變量可能會溢出,所以內核同時又定義了一個64位的變量jiffies_64,鏈接的腳本保證jiffies變量和jiffies_64變量的內存地址是相同的,通常,我們可以直接訪問jiffies變量,但是要獲得jiffies_64變量,必須通過輔助函數get_jiffies_64來實現。jiffies是內核的低精度定時器的計時單位,所以內核配置的HZ數決定了低精度定時器的精度,如果HZ數被設定為1000,那么,低精度定時器(timer_list)的精度就是1ms=1/1000秒。因為jiffies變量可能存在溢出的問題,所以在用基于jiffies進行比較時,應該使用以下輔助宏來實現:

    ?

    ?

    [cpp]?view plaincopy
  • 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和毫秒以及納秒之間的轉換:

    ?

    [cpp]?view plaincopy
  • 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由秒和微秒組成,它的定義如下: [cpp]?view plaincopy
  • struct?timeval?{??
  • ????__kernel_time_t?????tv_sec;?????/*?seconds?*/??
  • ????__kernel_suseconds_t????tv_usec;????/*?microseconds?*/??
  • };??
  • __kernel_time_t 和__kernel_suseconds_t 實際上都是long型的整數。gettimeofday和settimeofday使用timeval作為時間單位。

    3. ?struct timespec

    timespec由秒和納秒組成,它的定義如下: [cpp]?view plaincopy
  • struct?timespec?{??
  • ????__kernel_time_t?tv_sec;?????????/*?seconds?*/??
  • ????long????????tv_nsec;????????/*?nanoseconds?*/??
  • };??
  • 同樣地,內核也提供了一些輔助函數用于jiffies、timeval、timespec之間的轉換: [cpp]?view plaincopy
  • 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);??
  • ?

    [cpp]?view plaincopy
  • 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

    linux的通用時間架構用ktime來表示時間,為了兼容32位和64位以及big-little endian系統,ktime結構被定義如下: [cpp]?view plaincopy
  • 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位的系統可以直接訪問tv64字段,單位是納秒,32位的系統則被拆分為兩個字段:sec和nsec,并且照顧了大小端的不同。高精度定時器通常用ktime作為計時單位。下面是一些輔助函數用于計算和轉換: [cpp]?view plaincopy
  • 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); ?
  • 總結

    以上是生活随笔為你收集整理的Linux时间子系统之二:表示时间的单位和结构【转】的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。