使用者搶占
核心即將返回使用者空間的時候,如果need_resched被設定,會導致schedule()被呼叫,此時就會發生使用者搶占。在核心返回使用者空間的時候,它知道自己是安全的,因為既然它可以繼續去執行當前程序,那麼它當然可以再去選擇乙個新的程序去執行。所以核心無論是從中斷處理程式還是在系統呼叫後返回,都會檢查need_resched標誌。如果它被設定了,那麼,核心就會選擇乙個其他(更合適的)程序投入執行。從中斷處理程式或系統呼叫返回的**都是跟體系結構相關的,在entry.s檔案中通過組合語言來實現。
簡而言之,使用者搶占在以下情況時發生:
從系統呼叫返回使用者空間;
從中斷處理程式返回使用者空間;
核心搶占
與其他大部分的unix變體和其他大部分的作業系統不同,linux完整地支援核心搶占。在不支援核心搶占的核心中,核心**可以一直執行,到它完成為止。也就是說,排程程式沒有辦法在乙個核心級的任務正在執行的時候重新排程--核心中的各任務是協作方式排程的,不具備搶占性。核心**一直要執行到完成(返回使用者空間)或明顯的阻塞為止。在2.6版的核心中,核心引入了搶占;現在,只要重新排程是安全的,那麼核心就可以在任何時間搶占正在執行的任務。
那麼,什麼時候重新排程才是安全的呢?只要沒有持有鎖,核心就可以進行搶占。鎖是非搶占區的域的標誌。由於核心是支援smp的,所以,如果沒有持有鎖,那麼正在執行的**就是可重新匯入的,也就是可以搶占的。
如果核心匯中的程序被阻塞了,或它顯示地呼叫了schedule(),核心搶占也會顯式地發生。這種形式的核心搶占從來都是受支援的。因為根本無需額外的邏輯來保證核心可以安全地被搶占。如果核心**顯式地呼叫了schedule(),那麼它應該清楚自己是可以安全地被搶占的。
核心搶占會發生在:
當從中斷處理程式返回核心空間的時候;
當核心**再一次具有可搶占性的時候;
如果核心中的任務顯式地呼叫schedule();
如果核心心中的任務阻塞(這同樣也會導致呼叫schedule())
Linux 核心搶占
核心搶占 kernel preemption 是一種有效的降低系統響應延時的方法。在核心裡,有三個相關的配置選項。顧名思義,不開啟核心搶占。這是很多伺服器的預設配置選項。在沒有開啟核心搶占的時候,程序的排程時機僅僅發生在非常有限的幾處 程序自己主動觸發排程,例如 通過sleep schedule y...
搶占式核心與非搶占式核心的區別
核心搶占 可搶占式核心 即當程序位於核心空間時,有乙個更高優先順序的任務出現時,如果當前核心允許搶占,則可以將當前任務掛起,執行優先順序更高的程序。非搶占式核心 高優先順序的程序不能中止正在核心中執行的低優先順序的程序而搶占cpu執行。程序一旦處於核心態 例如使用者程序執行系統呼叫 則除非程序自願放...
Linux核心搶占 2
早期的linux核心是不可搶占的。它的排程方法是 乙個程序可以通過schedule 函式自願地啟動一次排程。非自願的強制性排程只能發生在每次從系統呼叫返回的前夕以及每次從中斷或異常處理返回到使用者空間的前夕。但是,如果在系統空間發生中斷或異常是不會引起排程的。這種方式使核心實現得以簡化。但常存在下面...