為什麼中斷不能休眠

2021-06-13 20:23:38 字數 861 閱讀 7082

1. 中斷處理的時候,不應該發生程序切換,因為在中斷context中,唯一能打斷當前中斷handler的只有更高優先順序的中斷,它不會被程序打斷(這點對 於softirq,tasklet也一樣,因此這些bottom half也不能休眠),如果在中斷context中休眠,則沒有辦法喚醒它,因為所有的 wake_up_***都是針對某個程序而言的,而在中斷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的完成,效能就大大降低了……還可以舉出很多例子。 所以,中斷是一種緊急事務,需要作業系統立即處理,不是不能做到睡眠,是它沒有理由睡眠。

為什麼中斷不能休眠

1.中斷處理的時候,不應該發生程序切換,因為在中斷context中,唯一能打斷當前中斷handler的只有更高優先順序的中斷,它不會被程序打斷 這點對 於softirq,tasklet也一樣,因此這些bottom half也不能休眠 如果在中斷context中休眠,則沒有辦法喚醒它,因為所有的 wa...

為什麼在中斷上下文中不能休眠

這個問題有很多人問過,我看了下linux得核心 原因如下 當然我不能保證一定對,如果有牛人理解得更好,歡迎指正 1.中斷處理的時候,不應該發生程序切換,因為在中斷context中,唯一能打斷當前中斷handler的只有更高優先順序的中斷,它不會被程序打斷 這點對 於softirq,tasklet也一...

為什麼需要中斷

為什麼需要中斷?如果讓核心定期對裝置進行輪詢,以便處理裝置,那會做很多無用功,因為外設的處理速度一般慢於cpu,而cpu不能一直等待外部事件。所以能讓裝置在需要核心時主動通知核心,會是乙個聰明的方式,這便是中斷。1.中斷處理程式 在響應乙個特定中斷時,核心會執行乙個函式 中斷處理程式。中斷處理程式與...