linux中中斷和定時機制

中斷機制         

        對於 Linux 內核來說,中斷信號通常分爲兩類:硬件中斷和軟件中斷(異常)。每個中斷是由 0-255

之間的一個數字來標識。對於中斷 int0--int31(0x00--0x1f),每個中斷的功能由 Intel 公司固定設定或保留

用, 屬於軟件中斷,但 Intel 公司稱之爲異常。因爲這些中斷是在 CPU 執行指令時探測到異常情況而引

起的。通常還可分爲故障(Fault)和陷阱(traps)兩類。中斷 int32--int255 (0x20--0xff)可以由用戶自己設定。

在 Linux 系統中,則將 int32--int47(0x20--0x2f)對應於 8259A 中斷控制芯片發出的硬件中斷請求信號

IRQ0-IRQ15,並把程序編程發出的系統調用(system_call)中斷設置爲 int128(0x80)。


系統定時

      在 Linux 內核中, PC機的可編程定時芯片 Intel 8253 被設置成每隔 10 毫秒就發出一個時鐘中斷
(IRQ0)信號。這個時間節拍就是系統運行的脈搏,我們稱之爲 1 個系統滴答。因此每經過 1 個滴答就
會調用一次時鐘中斷處理程序(timer_interrupt)。該處理程序主要用來通過 jiffies 變量來累計自系統啓動
以來經過的時鐘滴答數。每當發生一次時鐘中斷該值就增 1。然後從被中斷程序的段選擇符中取得當前
特權級 CPL 作爲參數調用 do_timer()函數。
    do_timer()函數則根據特權級對當前進程運行時間作累計。如果 CPL=0,則表示進程是運行在內核態
時被中斷,因此把進程的內核運行時間統計值 stime 增 1,否則把進程用戶態運行時間統計值增 1。如果
程序添加過定時器,則對定時器鏈表進行處理。若某個定時器時間到(遞減後等於 0),則調用該定時器
的處理函數。然後對當前進程運行時間進行處理,把當前進程運行時間片減 1。如果此時當前進程時間
片並還大於 0,表示其時間片還沒有用完,於是就退出 do_timer()繼續運行當前進程。如果此時進程時間
片已經遞減爲 0,表示該進程已經用完了此次使用 CPU 的時間片,於是程序就會根據被中斷程序的級別
來確定進一步處理的方法。若被中斷的當前進程是工作在用戶態的(特權級別大於 0),則 do_timer()就
會調用調度程序 schedule()切換到其它進程去運行。如果被中斷的當前進程工作在內核態,
也即在內核程序中運行時被中斷, do_timer()會立刻退出。因此這樣的處理方式決定了 Linux 系統在內核態運行時不
會被調度程序切換。內核態程序是不可搶佔的,但當處於用戶態程序中運行時則是可以被搶佔的。

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