Linux裝置驅動程式:中斷處理之頂半部和底半部

來源:互聯網
上載者:User
Linux裝置驅動程式:中斷處理之頂半部和底半

         
裝置的中斷會打斷核心中進程的正常調度和運行,系統對更高吞吐率的追求勢必要求中斷服務程式儘可能地短小精悍。但是,這個良好的願望往往與現實並不吻合。在大多數真實的系統中,當中斷到來時,要完成的工作往往並不會是短小的,它可能要進行較大量的耗時處理。 

        為了在中斷執行時間儘可能短和中斷處理需完成大量工作之間找到一個平衡點,Linux 將中斷處理常式分解為兩個半部:頂半部(top  half)和底半部(bottom half)。 頂半部完成儘可能少的比較緊急的功能,它往往只是簡單地讀取寄存器中的中斷狀態並清除中斷標誌後就進行“登記中斷”的工作。“登記中斷”意味著將底半部處理常式掛到該裝置的底半部執行隊列中去。這樣,頂半部執行的速度就會很快,可以服務更多的插斷要求。現在,中斷處理工作的重心就落在了底半部的頭上,它來完成中斷事件的絕大多數任務。底半部幾乎做了中斷處理常式所有的事情,而且可以被新的中斷打斷,這也是底半部和頂半部的最大不同,因為頂半部往往被設計成不可中斷。底半部則相對來說並不是非常緊急的,而且相對比較耗時,不在硬體中斷服務程式中執行。

頂半部是實際響應中斷的過程,也就是用request_irq註冊的中斷常式。而底半部會在稍後比較安全的時間內執行的過程。即底半部的中斷都是開啟的。比較典型的情況是頂半部儲存裝置的資料到一個裝置特定的緩衝區並調度它的底半部,然後退出;這個過程是非常迅速的。然後底半部執行其他必要的工作,例如喚醒進程、啟動另外的I/O操作等等。這種方法允許在底半部工作期間,頂半部還可以繼續為新的中斷服務。

      儘管頂半部、底半部的結合能夠改善系統的響應能力,但是,僵化地認為 Linux裝置驅動中的中斷處理一定要分兩個半部則是不對的。如果中斷要處理的工作本身很少,則完全可以直接在頂半部全部完成。其他動作系統中對中斷的處理也採用了類似於Linux系統的方法,真正的硬體中斷服務程式都應該儘可能短。因此,許多作業系統都提供了中斷上下文和非中斷上下文相結合的機制,將中斷的耗時工作保留到非中斷上下文去執行。 

        Linux 系統實現底半部的機制主要有tasklet,工作隊列和非強制中斷。Linux 的中斷處理分為兩個半部,頂半部處理緊急的硬體操作,底半部處理不緊急的耗時操作。tasklet 和工作隊列都是調度中斷底半部的良好機制,tasklet
基於非強制中斷實現。核心定時器也依靠非強制中斷實現。核心中的延時是忙等待或者睡眠等待,為了充分利用CPU資源,使系統有更好的吞吐效能,在對延遲時間的要求並不是很精確的情況下,睡眠等待通常是值得推薦的。

(1)
tasklet (首選機制),它非常快,
但是所有的
tasklet 代碼必須是原子的;始終工作在中斷期間運行。

(2)工作隊列,
它可能有更高的延時,但允許休眠。工作在一個特殊核心進程的上下文中運行。

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.