關於jiffies迴繞以及time_after,time_before

系統中有不少變量用來記錄一個單調遞增的現實,典型的有兩個,一個是TCP的序列號,另外一個就是jiffies,可是因爲計算機內表示的數字都 是有限×××的,因此任何數字都不能作到徹底意義的單調遞增,它們只是在繞圈圈,就像鐘錶同樣,值域就是那些有限的數字,周而復始。實際上無論是TCP序列 號仍是jiffies,都面臨一類問題,就是迴繞問題。就像咱們看鐘表,1點時在11點前呢,仍是在11點後呢?其實這個問題並無想象的那麼容易回答。
       咱們用char型來簡單描述一下這個問題的解法。char只有8位,二進制從00000000到11111111,若是用一個char表示 jiffies,那麼當其值已經達到11111111的時候,將面臨一次跳變,即迴歸到0,這是由於11111111加1的話,將會獲得 100000000,然而char只有8位,形成最高位溢出,所獲得的結果就是00000000,這就是0點跳變,本質緣由就是在跳變點附近,值域並非 連續的。11111111的十進制是255,顯然和0並非連續的。
       然而,11111111除了能夠表示255以外,還能夠表示-1,而-1和0倒是連續的!咱們知道,計算機內對於數據的存儲是不區分符號的,符號只是在計 算的時候才根據指令的不一樣給與不一樣的解釋,所以只須要將無符號的jiffies看做是有符號的數字,就能夠解決這個跳變問題,顯然0是在-1後面的,這也 就是說,0在255後面。將有符號數字解釋爲無符號數字,只是一種解釋方式的不一樣,對於數據的表示沒有任何影響,它隻影響計算。有符號計算指令會將值域坐 標軸往左平移半個值域寬度,從而將0點變成中點,而不是左端點,解決0點跳變問題。然而這個只在後半個值域空間有效,也就是說,對於char而言,系統只 能正確識別128之後的跳變,若是你測試129和1水更靠前,答案是129,然而若是你測試127和1誰更靠前,答案就是1!可是這已經足夠了,由於對於 jiffies的比較,基本都是附近值得比較,沒有人會去比較如今和幾千幾萬年之後的時間。
       詳情參見time_after,time_before宏。
ide

相關文章
相關標籤/搜索