socket read time out解决方法_time_after方法对jiffies回绕问题的解决
前言:
最近在啃《 Linux內核設計與實現》,看到第四章CFS時候,讀了幾遍沒太理清這一小節到思路,看到40頁這么一句話:“如果這里所討論的定時器節拍對你來說很陌生,快先去看看第十一章再說。因為這點正是引入CFS的唯一原因”。
于是就先讀了十一章:定時器和時間管理,其中提到了linux使用unsigned long jiffies,一個無符號的long記錄節拍的數量,如果時鐘頻率是1000hz,32位的系統上。這個值47.9天就會溢出。如果溢出之前設定了定時器,溢出以后jiffies作為無符號數的值會小于超時時間的值,如果使用current > timeout 就會導致錯誤的判斷。
但是,操作系統提供了宏time_after(current,timeout)可以避免這個問題。看到這個宏的定義,剛開始沒有立刻看懂,上網查了一些解析也說的不是很簡潔。自己想明白以后,覺得挺有意思,就打算記錄一下。希望如果有人在上網查這個的時候,有機會查到我這種思路,看下是不是比較容易理解。
轉載:
time_after防止回繞原理
正文:
首先看下這個宏的定義:
#define time_after(current,timeout) ((long)(timeout) - (long)(current)< 0)WTF?只是把無符號輸轉化成有符號數就能解決這個問題嗎?這是什么原理。。。
下面用我覺得比較簡單的思路分析一下這個問題。
首先我們用4位的數字來舉例比較簡單。
問題是這樣發生的:假設當前的時間是13(1101),設定一個節拍以后超時,所以超時時間就是14(1110).然后,過了3個節拍以后,當前時間變成了current = 13 + 3 = 1101 + 0011 = 10000 = 0000 = 0,這個時候雖然超時了,但是(current =0) < (timout=14),如果代碼使用if(current > timeout)來判斷是否超時就會判斷錯誤。
那么如果把這兩個數強制轉化成有符號數,是不是就能正確判斷了呢?
計算機使用補碼存儲數字,負數原碼轉補碼是+1以后取反,所以timeout = 1110 轉成負數源碼就是-1再取反就是(1101取反)1010 也就是-2,current是0,這個時候current = 0 > timeout= -2 是成立的。
但是我的疑問是,這只能保證回繞的時候,timeout - current < 0,那不回繞呢?而且這只測試了回繞的一種情況,不能證明所有的回繞都滿足timeout - current < 0吧,怎么證明這個一定成立呢?
time_after防止回繞原理 這個帖子給了我思路,但是感覺他說的還是不夠簡潔。帖子里說的內容其實可以用一個坐標系圖簡單的表達出來。其中x軸是無符號數的取值,y軸是對應的有符號數的取值。首先我們在excel中列出4位數的xy所有取值,然后生成曲線圖,就很明白了:
current 與 timout 的取值總共分以下4中情況:
1. current 和 timout 都在正數單調遞增的部分:
這種情況下 很明顯 timeout - current < 0。
2. current 和 timout 都在負數單調遞增的部分:
這種情況下同情況1。
3. current 為負數 和 timout 為正數:
這種情況下 timeout - current= 正數-負數 ,應該是一個正數啊,怎么會小于0呢?
問題是最終結果的取值相當于兩個點y軸絕對值相加,如果兩個點x坐標距離小于8,那么這兩個點y的絕對值之和一定大于8,而大于8的無符號數轉化成有符號數是一個負數。所以timeout - current <0
4. urrent 為正數 和 timout 為負數:
這種情況下 同情況3,不再贅述。
假設在32位系統使用32位來保存jiffies,1000hz的處理器,想要讓兩個點的距離超過0xffff,相當于設置一個20多天以后超時的定時任務。這種情況下timeout - current <0才不成立,而內核肯定不會使用這么長的超時時間,所以可以認為timeout - current <0在所有情況下都是成立的。
這樣就很清晰的把這個原理表達清楚了。
總結:
第十一章總算是看完了,后邊回到第四章在好好理解一下,希望能有新的收獲吧~~
最后,讓我們保持獨立思考,不卑不亢。長成自己想要的樣子! (引用自 我非常喜歡的B站up主 ”獨立菌兒“->猛戳鏈接<-的口頭禪)
總結
以上是生活随笔為你收集整理的socket read time out解决方法_time_after方法对jiffies回绕问题的解决的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: saas物资管理界面设计_大型物流企业都
- 下一篇: 结构专业规范大全_1.2万篇 建筑行业规