為什麼中斷不能休眠

來源:互聯網
上載者:User

1. 中斷處理的時候,不應該發生進程切換,因為在中斷context中,唯一能打斷當前中斷handler的只有更高優先順序的中斷,它不會被進程打斷(這點對 於softirq,tasklet也一樣,因此這些bottom half也不能休眠),如果在中斷context中休眠,則沒有辦法喚醒它,因為所有的 wake_up_xxx都是針對某個進程而言的,而在中斷context中,沒有進程的概念,沒有一個task_struct(這點對於softirq和
tasklet一樣),因此真的休眠了,比如調用了會導致block的常式,核心幾乎肯定會死.


2.schedule()在切換進程時,儲存當前的進程上下文(CPU寄存器的值、進程的狀態以及堆棧中的內容),以便以後恢複此進程運行。中斷髮生後,核心會先儲存當前被中斷的進程上下文(在調用中斷處理常式後恢複);但在中斷處理常式裡,CPU寄存器的值肯定已經變化了吧(最重要的程式計數器PC、堆棧SP等),如果此時因為睡眠或阻塞操作調用了schedule(),則儲存的進程上下文就不是當前的進程context了.所以不可以在中斷處理常式中調用schedule()。

3.中斷handler會使用被中斷的進程核心堆棧,但不會對它有任何影響,因為handler使用完後會完全清除它使用的那部分堆棧,恢複被中斷前的原貌.


4.處於中斷context時候,核心是不可搶佔的,因此,如果休眠,則核心一定掛起.

如果中斷是可以睡眠的,那麼會引起很多問題.例 如,你在時鐘中斷中睡眠了,那作業系統的時鐘就亂了,調度器也了失去依據;例如,你在一個IPI(處理器間中斷)中,其它CPU都在死迴圈等你回覆,你確 睡眠了,那其它處理器也不工作了;例如,你在一個DMA中斷中睡眠了,上面的進程還在同步的等待I/O的完成,效能就大大降低了……還可以舉出很多例子。 所以,中斷是一種緊急事務,需要作業系統立即處理,不是不能做到睡眠,是它沒有理由睡眠。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.