亚洲欧美精品沙发,日韩在线精品视频,亚洲Av每日更新在线观看,亚洲国产另类一区在线5

<pre id="hdphd"></pre>

  • <div id="hdphd"><small id="hdphd"></small></div>
      學(xué)習(xí)啦 > 學(xué)習(xí)電腦 > 操作系統(tǒng) > Linux教程 > Linux全局變量jiffies的用法

      Linux全局變量jiffies的用法

      時(shí)間: 孫勝652 分享

      Linux全局變量jiffies的用法

        jiffies是Linux系統(tǒng)中的全局變量,與時(shí)間有關(guān),那么jiffies變量具體有哪些作用呢?下面學(xué)習(xí)啦小編就給大家介紹下Linux全局變量jiffies的用法,感興趣的朋友不妨來了解下吧。

        系統(tǒng)運(yùn)行時(shí)間以秒為單位,等于jiffies/Hz。

        注意,jiffies類型為無符號長整型(unsigned long),其他任何類型存放它都不正確。

        將以秒為單位的時(shí)間轉(zhuǎn)化為jiffies:

        seconds * Hz

        將jiffies轉(zhuǎn)化為以秒為單位的時(shí)間:

        jiffies / Hz

        相比之下,內(nèi)核中將秒轉(zhuǎn)換為jiffies用的多些。

        jiffies的內(nèi)部表示

        jiffies定義于文件中:

        /*

        * The 64-bit value is not atomic - you MUST NOT read it

        * without sampling the sequence number in xtime_lock.

        * get_jiffies_64() will do this for you as appropriate.

        */

        extern u64 __jiffy_data jiffies_64;

        extern unsigned long volatile __jiffy_data jiffies;

        ld(1)腳本用于連接主內(nèi)核映像(在x86上位于arch/i386/kernel/vmlinux.lds.S中),然后用jiffies_64變量的初值覆蓋jiffies變量。因此jiffies取整個(gè)jiffies_64變量的低32位。

        訪問jiffies的代碼只會讀取jiffies_64的低32位,通過get_jiffies_64()函數(shù)就可以讀取整個(gè)64位的值。在64位體系結(jié)構(gòu)上,jiffies_64和jiffies指的是同一個(gè)變量。

        #if (BITS_PER_LONG 《 64)

        u64 get_jiffies_64(void);

        #else

        static inline u64 get_jiffies_64(void)

        {

        return (u64)jiffies;

        }

        #endif

        在中

        #if (BITS_PER_LONG 《 64)

        u64 get_jiffies_64(void)

        {

        unsigned long seq;

        u64 ret;

        do {

        seq = read_seqbegin(&xtime_lock);

        ret = jiffies_64;

        } while (read_seqretry(&xtime_lock, seq));

        return ret;

        }

        jiffies的回繞wrap around

        當(dāng)jiffies的值超過它的最大存放范圍后就會發(fā)生溢出。對于32位無符號長整型,最大取值為(2^32)-1,即429496795。如果節(jié)拍計(jì)數(shù)達(dá)到了最大值后還要繼續(xù)增加,它的值就會回繞到0。

        內(nèi)核提供了四個(gè)宏來幫助比較節(jié)拍計(jì)數(shù),它們能正確的處理節(jié)拍計(jì)數(shù)回繞的問題:

        /*

        * These inlines deal with timer wrapping correctly. You are

        * strongly encouraged to use them

        * 1. Because people otherwise forget

        * 2. Because if the timer wrap changes in future you won‘t have to

        * alter your driver code.

        *

        * time_after(a,b) returns true if the time a is after time b.

        *

        * Do this with “《0” and “》=0” to only test the sign of the result. A

        * good compiler would generate better code (and a really good compiler

        * wouldn’t care)。 Gcc is currently neither.

        */

        #define time_after(a,b) /

        (typecheck(unsigned long, a) && /

        typecheck(unsigned long, b) && /

        ((long)(b) - (long)(a) 《 0))

        #define time_before(a,b) time_after(b,a)

        #define time_after_eq(a,b) /

        (typecheck(unsigned long, a) && /

        typecheck(unsigned long, b) && /

        ((long)(a) - (long)(b) 》= 0))

        #define time_before_eq(a,b) time_after_eq(b,a)

        /* Same as above, but does so with platform independent 64bit types.

        * These must be used when utilizing jiffies_64 (i.e. return value of

        * get_jiffies_64() */

        #define time_after64(a,b) /

        (typecheck(__u64, a) && /

        typecheck(__u64, b) && /

        ((__s64)(b) - (__s64)(a) 《 0))

        #define time_before64(a,b) time_after64(b,a)

        #define time_after_eq64(a,b) /

        (typecheck(__u64, a) && /

        typecheck(__u64, b) && /

        ((__s64)(a) - (__s64)(b) 》= 0))

        #define time_before_eq64(a,b) time_after_eq64(b,a)

        用戶空間和HZ

      317779