2013-03-27 25 views
1

我正在爲我的操作系統類進行一些Linux CFS分析,並觀察到我無法解釋。Linux CFS志願者上下文切換SCHED_OTHER SCHED_FIFO

對於另外兩個相同的進程,當它們使用SCHED_OTHER策略執行時,與使用SCHED_FIFO或SCHED_RR策略執行它們相比,我看到的自願上下文切換多出50%。

這不會讓我感到意外非自願的交換機,因爲SCHED_OTHER的優先級低得多,所以它不得不放棄CPU。但爲什麼這會是自願交換機的情況。爲什麼SCHED_OTHER會比實時流程更頻繁地放棄CPU?這是一個完全相同的過程,所以它只在志願者放棄CPU時切換到I/O,對吧?我認爲政策的選擇不會影響I/O嘗試的頻率。

任何Linux的人有一個想法?謝謝!

回答

6

首先明白調度策略不過是在內核中實現的調度算法。所以SCHED_FIFO,SCHED_RR,SCHED_OTHER在內核中是不同的算法。 SCHED_FIFO和SCHED_RR屬於實時調度算法「類」。 SCHED_OTHER不過是系統中正常進程的調度算法,通常稱爲CFS(完全公平調度程序)算法。

SCHED_OTHER具有低得多的優先級

準確地說它不具有「多」低優先級,但有「一個」比實時調度類優先級較低。 Linux Scheduler中有三個調度類 - 實時調度類,普通進程調度類和空閒任務調度類。優先級如下:

  1. 實時調度類。
  2. 正常任務調度類。
  3. 空閒任務調度類。

系統上的任務屬於這些類別之一。 (請注意,在任何時間點,任務只能屬於一個調度類,儘管其類可以更改)。 Linux中的調度器首先檢查實時類中是否有任務。如果有的話,它會調用SCHED_FIFO或SCHED_RR算法,具體取決於系統上配置的內容。如果沒有實時任務,則調度程序將檢查正常任務並根據是否有任何正常任務準備好運行來調用CFS算法。另外

回到主要問題,當您在兩個不同的調度類中運行相同的進程時,爲什麼會看到更多的上下文切換。有兩種情況:

  1. 通常在一個簡單的系統上,幾乎沒有任何實時任務,大多數任務屬於普通任務類。因此,當你實時運行這個過程時,你將使所有的處理器專門用於這個過程(因爲實時調度類比普通的任務調度類具有更高的優先級,並且沒有(非常少的)實時)任務共享CPU)。當您在普通任務類中運行相同的進程時,進程必須與其他各種進程共享處理器,從而導致更多的上下文切換。
  2. 即使系統中有許多實時任務,所討論的實時調度算法(FIFO和RR)的性質導致較低的上下文切換。在FIFO中,處理器不會切換到其他任務,直到當前處理完成,並且在RR中存在給予處理的固定間隔(時間 - 量子)。當您查看CFS時,進程獲得的時間片與處理器運行隊列中的任務數量成正比。這是它的重量和處理器runqueue的總重量的函數。我假設你熟悉FIFO和RR,因爲你正在學習操作系統類。欲瞭解更多關於CFS的信息,我會建議你谷歌它,或者如果你足夠勇敢,然後通過它的源代碼。

希望答案是完整的:)

+0

感謝這個答案。再次閱讀本文和OP後,我意識到我忽略了一個重要的事實,那就是我正在測試的過程是一個I/O綁定過程。因此,就其性質而言,它將進行大量的自願上下文切換。然而,我仍然不能回答爲什麼正常計劃的任務會比實時計劃任務更頻繁地自動切換的問題。我知道這樣一個過程會自動切換很多,但爲什麼我會看到這些策略之間的差異?我認爲自動交換機有...... – Alex 2013-03-30 15:50:36

+0

......與策略無關,但表示該進程已經轉移到I/O,並且在那個時候不需要CPU。政策在這裏並不重要,只有當時的過程正在進行,對嗎?我認爲*非自願*轉換可以通過政策來解釋,但是*自願*轉換歸因於潛在計劃?非常感謝您的回答。對不起,如果我很密集。 – Alex 2013-03-30 15:52:09

+0

是的,你是正確的,無意的開關是由政策解釋,而自願開關是由過程本身引起的。但是我可能是錯的,因爲這是我們教給我們的單處理器系統。我懷疑多處理器系統,我將不得不看它的源代碼。你讓我對這裏感興趣。我可以知道你正在運行的程序是什麼(看看你是否可以將它附加到OP),以及如何通過getrusage()找出上下文切換?程序是多線程的嗎?你在多處理器系統上嗎? – Varun 2013-04-01 05:33:13