[C/C++]定時器相關

【計算機定時器相關】timer定時器的底層實現邏輯:時間輪。
在linux內部,如何得到時間節奏的呢?答案是高精度的硬件,如果有一個硬件能夠保證每次過一個絕對固定的時間,一模一樣的時間,觸發一次中斷(tick),那麼其實計算機就能夠實現基於這個中斷作爲最高精度的定時器了。所以定時器的實現實際上還是依賴於硬件。另外,linux中有幾種定時器的必須實現的場景:

  • ①tick:有些tick間隔內必須要去做的事情;
  • ②獲得當前的時間,這個也是很多應用層的軟件的需要的,但是tick硬件怎麼能夠轉成當前的時間呢?答案是不能夠,因此還需要一個專門的硬件,這個硬件就像一個時鐘一樣,可以從中IO讀取當前的時間,可以理解爲他是一個精度恆爲1秒的tick,只要輸入一次當前的時間,並且他右後電,不管你計算機是開機狀態還是關機狀態,這個硬件恆定的運行,因此開機後,任意的時間,只需要進行一次IO就可以讀取到當前的年與日時分秒的時間,但是linux並沒有每次都去讀取這個硬件,而是開機之後讀取一次,存儲在xtime結構的全局變量中,然後後面每次tick中斷對這個值進行累加操作,因爲IO本身耗費太多的時間,如果操作頻繁,讀出來的時間可能不準確了。
  • ③定時器的實現原理:時間輪算法,這裏的時間可以理解我tick時間,因爲知道tick時間,一定可以換算成年月日時間,而通常的定時器,都是針對一個時間段,所以用tick更加合理,一開始的想法當然是維護一個定時器的鏈表(因爲定時器可能會數量越來越多,用鏈表比較好),然後將多久過期填好,掛載到鏈表上面,然後通過每次tick中斷的時候,去遍歷這個鏈表,看看有沒有到期的,有的話,就觸發對應的處理函數即可(可能是觸發一個對應的中斷或者新啓動一個線程)顯然這種方式在定時器越來越多之後,往往可能會導致效率底下,少量的問題不大,如果每次插入進行一些排序,那麼這個其實也要海飛不少的時間段的,因此有了是時間輪算法:時間輪盤其實和我們的時鐘運行很類似,就是60妙一圈,嘉定tick的間隔正好是1妙,那麼每次秒針數組前進一格,並檢查是否有掛載timer,如果有,就執行超時處理,當然,有些時候,我們定時器可能比較大的,比如一個小時,那麼也簡單,再維護一個分鐘的數組和一個小時的數組,這樣3個數組,每次60秒走完一圈,維護一下小時的數組、維護一下分鐘的數組,其實就是時鐘運行的邏輯,並且維護的同時看對應的數組是否掛載了timer,如果掛載了,並且也不是秒數組,那麼就將timer往下一級進行一次掛載即可。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章