linux調度器(五)——進程管理與CFS

來源:互聯網
上載者:User

進程調度初始化

         由於該過程涉及到進程的管理模組,這個模組的詳細過程我們將在以後的機會介紹,所以這裡,我們主要扣出與調度相關的內容。進程的建立核心入口為do_fork,首先我們簡單的看一下它的主要行為:


圖 do_fork與CFS的互動

         我們只是畫了do_fork最普通的fork操作,及正常的啟動狀態,上面的三個sched_class函數調用就是我們想要的進程調度初始化。我們分別來分析:
task_fork_fair:確定新進程的vruntime值。首先更新當前進程(父進程)的執行資訊(update_curr),確定新進程的起始vruntime(place_entity),如果新的進程被設定了sysctl_sched_child_runs_first,並且父進程的vruntime大於子進程的,那麼就交換它們的vruntime值,並且設定父進程的TIF_NEED_RESCHED,讓它在下次主調度中結束運行,讓其它更低vruntime的先運行(不能保證一定是它的子進程先運行,但在它退出運行後,它的子進程一定會比它先運行),然後標準化vruntime,因為現在的子進程還沒有入隊。

enqueue_task_fair:將子進程放入運行隊列中。注意此時傳入的flag=0,因為上面把vruntime標準化了,所以現在入隊需要把它再反標準化(在CFS內部使用的是非標準化的vruntime,但在紅/黑樹狀結構裡儲存的是標準化的值)。所以對於組調度來說,它需要先把它開始往上的不在運行隊列裡的se都進行入隊操作,(enqueue_entity該函數需要注意的是:如果要入隊的se是被ENQUEUE_WAKEUP,那麼它的vruntime要進行調整補償place_entity,顯然這裡不是被wakeup的),並且更新cfs_rq的load,se->on_rq
= 1, cfs_rq->h_nr_running++;對於已經在隊列裡的groupse只需要更新h_nr_running就可以了,所以再遞迴到group root更新這個變數就可以了。

check_preempt_wakeup:檢查子進程是否應該搶佔當前父進程。顯然如果在task_fork_fair我們已經確定了子進程將搶佔父進程,那麼這裡就直接返回;如果當前進程是idle進程(該函數不一定只檢查父子進程之間的搶佔與否,只是在現在的情境是這樣的),那麼它應該無條件被搶佔,更新當前進程的執行時間,在確定是否要搶佔前必須保證比較的兩個se處於同一group之下(find_matching_se,即找到它們第一次分開的祖先為止,只有處理同一個層次它們才有可比較性),然後再判斷這兩個同級的se(可能是之前兩個se的祖先),舊的se是否可以被新的se搶佔(wakeup_preempt_entity),如果允許的話,更新set_next_buddy,這樣在pick_next_entity時它就可以優先被獲得;最後就是調用resched_task設定當前進程的TIF_NEED_RESCHED,以及更新set_last_buddy(這個的作用同樣見pick_next_entity)。

    我們總結一下上面的過程,父進程在執行copy_process時通過task_fork_fair確定子進程的vruntime,同時可能確定子進程是否該搶佔父進程;建立完子進程結構及確定vruntime後就可以把子進程入放運行隊列enqueue_task_fair,該過程就對組調度上的資訊進程更新及入隊而已;最後再次確定子進程是否該搶佔父進程,並且更新buddy,以保證在pick的時候能夠取到最合適的進程。這樣我們就把進程fork時調度器為它完成的工作介紹完成。下面我們再考慮進程從不可運行狀態喚醒到可運行狀態調度器的處理邏輯。

 

進程喚醒調度過程

         我們知道linux的喚醒入口在try_to_wake_up,通過查看該函數,我們可以發現它大多數在處理SMP的情況,對於非SMP的話,其實很簡單,如果要被喚醒的進程已經在運行隊列裡,那麼直接檢查它是否可以搶佔當前進程(check_preempt_curr),否則先把進程加入運行隊列中activate_task,再check_preempt_curr。注意這裡的activate_task及標誌不再是do_fork時的0,而是ENQUEUE_WAKEUP,這樣在CFS enqueue_entity時就會調用place_entity對睡眠進程進行vruntime補償。

上面我們把CFS與調度相關的內容簡單的介紹了,但我們並沒有詳細分析到每個函數裡,如果要瞭解這些細節的話,可以看後面的OTHER CFS CLASS APICFS主要的內建函式。下面我們再在應用程式層上來理解和觀察CFS組調度的分配

相關文章

聯繫我們

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