Linux 進程調度筆記(一)

主要討論的是單核 CPU 的狀況下,進行調度的一些算法和思路。討論都是基於單核 CPU 的條件下進行。算法

在內存中,不管對於用戶而言有多少個進程,但在 CPU 運行的時候,老是隻有隻執行一個進程。進程調度的方式有不少,傳統的算法有 FIFO,SJF(shortest job first),多級隊列反饋調度。可是因爲多進程的出現,必然不會採用單個進程依次執行的狀況,因此如今的 CPU 都是對多個進程同時運行,把時間分攤到每一個進程上,這樣,對於用戶而言,能夠感覺到多個進程並行的錯覺。緩存

CPU 在對於每一個進程進行分攤的時候,在每次運行一段程序的時候,採用了時間片的概念,即這個時候 CPU 會運行這個程序一個時間段的長度。kernel 進行調度的時候,就是經過動態計算時間片來進行控制和調度選擇的。隊列

通常而言,進程能夠分爲兩類,將進程分類是有必要的,不一樣的進程因爲其須要的資源不一樣,能夠分爲 IO 消耗和處理器消耗兩類。對於這兩類進程的區分,能夠有效避免 CPU 的資源的浪費,IO 消耗可能在 IO 時間或者等待用戶輸入的時間多一些,那麼他們須要的 CPU 進行計算的時間相比之下就少,這種分類能夠有效的避免資源的浪費。進程

調度策略的核心就是在 CPU 進行效應運行和儘量的讓系統利用率,吞吐量之間作 tradeoff。內存

進程因爲其做用的不一樣,相應的就有不一樣的重要性。對於不一樣的進程,咱們能夠劃分一個不一樣的優先級,對於優先級比較高的進程先運行,而優先級比較低的程序後運行。對於相同優先級的進程,咱們能夠按照輪轉的方式,依次進行。這樣就造成了一個多級優先級,輪轉調度的算法。資源

如今的 Kernel 主要採用的最基本的調度是徹底公平調度 (CFS)的算法進行調度程序。這裏並無時間片的概念,只有程序的等待時間。即這個程序在就緒隊列中等待了多久。多進程

對於相同優先級的進程而言,咱們應該儘量的保證花在每一個進程的時間均勻。即每一個進程使用的資源同樣多。在理想狀態下,咱們能夠把時間劃分紅無窮小量,每一個進程都運行相同的無窮小量,而後在進程之間作沒有 cost 的進程切換,這樣,咱們就能夠將資源平均的花在每一個進程上。可是現實的困難是,在進行進程切換的時候,每每會有cost的存在,同時,cpu 的 cache 緩存也會受到影響。test

CFS 的作法是對每一個進程運行一個時間段,而後選擇運行最少的進程做爲下一個的進程。對於每一個進程應該運行多久,依靠的是其進程的重要性的差值在所對應的運行總時間的比重。即越重要的進程,所得到的時間就越多。同時,每一個進程在運行的時候,老是要有一個最小的運行粒度,不只能夠避免飢餓現象的出現,還要避免頻繁的調度致使的大量的 cost 。程序

相關文章
相關標籤/搜索