1、linux
核心(linux-2.6以前) 是不可搶占的,但支援使用者搶占它的排程方法是:
乙個程序可以通過schedule()
函式自願地啟動一次排程。非自願的強制性排程只能發生在每次從系統呼叫返回的前夕以及每次從中斷或異常處理返回到使用者空間的前夕
(這種強制性排程又叫使用者搶占)。但是,如果在系統空間發生中斷或異常是不會引起排程的。這種方式使核心實現得以簡化。但常存在下面兩個問題:
2、linux核心(linux-2.6)加入了核心搶占(preempt)機制。核心搶占指使用者程式在執行系統呼叫期間可以被搶占,該程序暫時掛起,使新喚醒的高優先順序程序能夠執行。這種搶占並非可以在核心中任意位置都能安全進行,比如在臨界區中的**就不能發生搶占。臨界區是指同一時間內不可以有超過乙個程序在其中執行的指令序列。在linux核心中這些部分需要用自旋鎖保護。
核心搶占要求核心中所有可能為乙個以上程序共享的變數和資料結構就都要通過互斥機制加以保護,或者說都要放在臨界區中。在搶占式核心中,認為如果核心不是在乙個中斷處理程式中,並且不在被 spinlock等互斥機制保護的臨界**中,就認為可以"安全"地進行程序切換。
linux
核心將臨界**都加了互斥機制進行保護,同時,還在執行時間過長的**路徑上插入排程檢查點,打斷過長的執行路徑,這樣,任務可快速切換程序狀態,也為核心搶占做好了準備。
linux
核心搶占只有在核心正在執行例外處理程式(通常指系統呼叫)並且允許核心搶占時,才能進行搶占核心。禁止核心搶占的情況列出如下:
(1)核心執行中斷處理例程時不允許核心搶占,中斷返回時再執行核心搶占。
(2)當核心執行軟中斷或tasklet時,禁止核心搶占,軟中斷返回時再執行核心搶占。
(3)在臨界區禁止核心搶占,臨界區保護函式通過搶占計數巨集控制搶占,計數大於0,表示禁止核心搶占。
3、從使用者空間到核心空間有兩種觸發手段
1.使用者空間的應用程式,通過系統呼叫,進入核心空間。這個時候使用者空間的程序要傳遞很多變數、引數的值給核心,核心態執行的時候也要儲存使用者程序的一些暫存器值、變數等。所謂的「程序上下文」,可以看作是使用者程序傳遞給核心的這些引數以及核心要儲存的那一整套的變數和暫存器值和當時的環境等。
2.硬體通過觸發訊號,導致核心呼叫中斷處理程式,進入核心空間。這個過程中,硬體的一些變數和引數也要傳遞給核心,核心通過這些引數進行中斷處理。所謂的「中斷上下文」,其實也可以看作就是硬體傳遞過來的這些引數和核心需要儲存的一些其他環境(主要是當前被打斷執行的程序環境)。
4、preemptible kernel(linux核心搶占模式)
nno forced preemption(server):非強迫式搶占。這是傳統的linux搶占式模型,針對於高吞吐量設計。它同樣在很多時候會提供很好的響應,但是也可能會有較長的延遲。如果是要建立伺服器或者用於科**算,或者要最大化核心的運算能力而不理會排程上的延遲,則選這項。
nvoluntary kernel preemption(desktop):自動式核心搶占。這個選項通過向核心新增更多的「清晰搶占點」來減少核心延遲。這些新的搶占點以降低吞吐量為代價,來降低核心的最大延遲,提供更快的應用程式響應。這通過允許低優先順序的程序自動搶占來響應事件,即使程序在核心中進行系統呼叫。這使得應用程式執行得更「流暢」,即使系統已經是高負荷運轉。嵌入式系統裡面通常選擇n。
npreemptible kernel(low-latency desktop):可搶占式核心(低延遲桌面)。這個選項通過使所有核心**(非致命部分)編譯為「可搶占」來降低核心延遲。通過允許低優先順序程序進行強制搶占來響應事件,即使這些程序正在進行系統呼叫或者未達到正常的「搶占點」。這使得應用程式執行得更加「流暢」,即使系統已經是高負荷運轉。代價是吞吐量降低,核心執行開銷增大。嵌入式系統編譯核心通常選擇y,這樣只有很少的延遲。
其中,preemptible kernel子選項提供了最快的響應,適合對實時性要求較高的嵌入式系統。
Linux 核心搶占
核心搶占 kernel preemption 是一種有效的降低系統響應延時的方法。在核心裡,有三個相關的配置選項。顧名思義,不開啟核心搶占。這是很多伺服器的預設配置選項。在沒有開啟核心搶占的時候,程序的排程時機僅僅發生在非常有限的幾處 程序自己主動觸發排程,例如 通過sleep schedule y...
Linux核心 了解Linux核心搶占
目錄 無強制搶占 可搶占核心 自願核心搶占 完全實時搶占 在配置linux核心時,我們可以設定一些影響系統行為的引數。您可以使用不同的優先順序,排程類和搶占模型。了解並選擇正確的引數非常重要。在這篇文章中,我將介紹不同的搶占模型,以及每種模型如何影響使用者和核心行為 如果配置核心 使用make me...
Linux核心搶占 2
早期的linux核心是不可搶占的。它的排程方法是 乙個程序可以通過schedule 函式自願地啟動一次排程。非自願的強制性排程只能發生在每次從系統呼叫返回的前夕以及每次從中斷或異常處理返回到使用者空間的前夕。但是,如果在系統空間發生中斷或異常是不會引起排程的。這種方式使核心實現得以簡化。但常存在下面...