關於jiffies回繞以及time_after,time_before
實際上無論是TCP序列號還是jiffies,都面臨一類問題。就是回繞問題。就像我們看鐘表,1點時在11點前呢。還是在11點後呢?事實上這個問題並沒有想象的那麽easy回答。
我們用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的比較。基本都是附近值得比較。沒有人會去比較如今和幾千幾萬年以後的時間。
關於jiffies回繞以及time_after,time_before