先想想中斷,中斷分類可以分成幾種
- 從來源,分為內部中斷(cpu引起,如除0)跟外部中斷(硬體週邊引起)
- 從是否可遮罩,分成可遮罩與不可遮罩
- 從中斷處理函數,分成向量中斷跟非向量中斷
不論如何,基本的處理精神都是希望趕緊將中斷處理完畢跟著把控制權交還給本來的程式,很可惜有的中斷要長時間處理,比方鏡頭要拷貝整個影像,這需要長時間
所以很多OS設計就將中斷分成兩個部份,一個部份是處理引發的事情,讀入一些需要的資料(如暫存器),記憶體拷貝的部份在另外找時間處理,以如此折衷的方式進行。前面稱為中斷的top half,後續的處理過程稱為bottom half。
跟著我們知道有個獨特的中斷為計時中斷,很多軟體的timer也是基於此設計,書中先介紹不使用OS支援的方式實作timer,跟著引入有OS支援的方式
一開始介紹了如何使用jiffies來計算時間,每個jiffiers是一次震盪的時間(不管是cpu或者是主機板上的石英振盪器),一開始書本給的範例是使用busy waiting的方式來計時,也就是讓程式一直消耗cpu,且反覆觀察jiffies的變化,透過time_after、time_before等函數來比較jiffies變數之間的大小,進而達成timer的作法
很明顯busy waiting的方式當然是不好的,與其等待不如把cpu讓給有需要的人。另外就是OS為了服務更多的timer(想像很多process需要定時執行某些事情,這些process需要很多timers),於是OS維護了一個timers的list,每隔一段時間就檢驗這些list,並且將那些時間到了的process放入排程(schedule)之中
而這樣的作法就是將那些process視為half bottom,而kernel中檢驗list中的timer變成了half top,中斷發生的時候就快速篩選timer並且進入排程
一個簡化的版本是呼叫schedule_timeout()該函數中是使用timer_list來維護
接著談到中斷的bottom half的實作方式有tasklet與work queue的方式
沒有留言:
張貼留言