悟空學Linux專欄----第19篇

  今天悟空早早地就下載了達人先生的課件,悟空打算接着昨天的問題繼續研究。悟空先研究tv1、tv2、tv3、tv4、tv5中存放的數據的條件。按照達人老師的課件。tv1中存放的是定時器的到期時間減去tvec_base中的timer_jiffies(和jiffies相等)的值小於2^8的值的定時器,tv2是存放着這個值在2^8 ~2^14之間的定時器,tv3是存放着這個值在2^14 ~2^20之間的定時器,tv4是存放着這個值在2^20 ~2^26之間的定時器,tv5是存放着這個值在2^26 ~2^32之間的定時器。然而令悟空感到困惑的是timer_jiffies會隨着時間jiffies的變化,如果每次jiffies變化系統按照上面的規則調整一次五個數組,那麼當系統的定時器足夠多的時候,系統就需要花費很多時間來維護這些鏈表。這點讓悟空很不明白,悟空覺得紅黑樹處理的效果可能會更好。

  但是Linux內核爲什麼不用紅黑樹來管理定時器呢?悟空最後還是決定夜訪達人去請教。

  悟空:老師,如果每經過一個jiffies的時間,系統就要調整一次管理定時器的五個數組,那麼系統不是要花費很多時間來處理定時器。

  達人:其實Linux內核之所以要將定時器分爲五個數組管理是由原因的,這五個數組就像五個輪子,前面的輪子轉一圈,後面的輪子只需要轉一個齒輪。

  悟空聽了之後感覺更加困惑了,怎麼這個還和輪子有關了。

  悟空:老師,你能不能具體一點?

  達人:哦,其實很簡單,定時器並不是每增加一個jiffies系統就調整一次struct tvec_base中5個鏈表,而是當struct tvec_base中的timer_jiffies的低八位全爲零時,調整一次tv2中的鏈表,將tv2中的滿足條件的遷移到tv1中。而當timer_jiffies的8-13位爲0時,調整一次tv3的鏈表,將符合條件的tv3的鏈表中的數據遷移到tv2中。

  悟空:哦,原來是這樣啊,那麼這個表示不是很複雜嗎,爲什麼不用紅黑樹呢?

  達人:其實這樣設計用到了一個很重要的思想,就是用空間換取時間的思想。對Linux系統來說時間是一種很寶貴的資源,通過這種設計,雖然佔用了更多的內存,但是卻很好的將算法複雜度降低了。而採用紅黑樹卻會加大調整時間,導致系統要花費很多時間在紅黑樹的調整上。其實低分辨率的定時器的時間精度比較低,一般只有毫秒級別的,而且有些時候即使低分辨率的定時器到期了,系統也不一定會執行,系統只能保證延時不小於定時器設定的時間。而Linux系統中還有一種定時器叫高精度定時器,這種定時器可以達到ns級別。

  悟空:唉,學了半天原來白學了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章