在多道程序設計系統時,通常就會有多個進程或線程同時競爭CPU。只要有兩個或更多的進程處於就緒狀態,就會發生這種情形。
如果只有一個CPU可用,那么就必須選擇下一個要運行的進程。可以想象在多核的情況下,進程數小於核數時,根本就無須競爭,直接分配給空閑CPU即可。
這一部分選擇的工作叫做調度程序。當然用來選擇的算法就叫做調度算法。
進程與線程的調度區別和會產生的問題會在下面一一道來。內核態下的線程管理,和線程屬於哪個進程沒有關系,這個點要關注一下。
早期的以磁帶上的卡片為輸入的批處理系統時代,調度算法很簡單,依次執行磁帶上的每一個作業。
然后是多道程序設計系統,經常有多個用戶等候服務,大型機上使用批處理(假設只是運行單個程序的請求)和分時服務結合使用,系統需要分辨下一個是需要處理的作業還是分時交互的用戶。
CPU被交互用戶和作業共同競爭着,那么它自然是稀缺的資源。這時候為了去提高性能和用戶滿意度,新的調度算法開始醞釀。
個人計算機開發發展,在初期,個人計算機只有一個活動進程,調度程序基本不用工作。唯一的候選程序就是文字處理軟件,當然同初期的PC對比,我們現在耗時更多的是I/O的等待,現代CPU處理速度極快,而相反用戶鍵入鍵盤或點擊鼠標的速度相對更慢。
但是當網絡服務器出現,就出現了多個進程經常去競爭CPU。
到此,為了選取正確的進程運行,調度程序還要考慮CPU的利用率,進程間切換的代價實在是有點大。
切換表現如下:
1.從用戶態切換到內核態,類似於訪管指令。
2.保存當前進程的狀態(進程表中存儲的寄存器的值)、許多系統還要保存內存映像(如頁表中的內存訪問位)。
3.運行調度算法,選定新進程。
4.將新進程的內存映像重新裝入MMU。
5.新進程開始運行。
你以為這樣就結束了嗎?其實在切換到這個進程中,整個內存cache失效,緩存強迫在內核中裝入一次,在離開內核又裝入一次。
這樣看出來單位時間內切換進程的次數過多,會十分的耗時。
一、進程行為
幾乎所有進程的I/O請求或計算都是交替突發的。
a圖是計算密集型,b圖是I/O密集型。現在基本是I/O密集型,因為CPU已經發展的足夠快,I/O運行的速度遠遠跟不上CPU處理速度,而磁盤卻趕不上這個發展速度。
二、何時調度
1.創建一個新進程之后,需要決定運行父進程還是運行子進程。
正常決策問題,可以任意決定,調度程序合法選擇即可。
2.在一個進程退出時必須做出調度決策。
必須從就緒隊列上選擇另一個進程。如果沒有,就運行一個系統的空閑進程。
3.當一個進程阻塞在I/O和信號量上 或 由於 其他原因 阻塞,必須選另一個進程運行。
4.發生I/O中斷時,需要作出調度決策。
如中斷來自I/O設備,該設備現在完成了工作,某些被阻塞等待該I/O的進程就成為就緒進程,這時是否調度,或是讓中斷發生時的程序繼續運行,就取決於調度程序。
若讓硬件時鍾在固定頻率里周期性中斷,可以在每個時鍾中斷時做出調度決策。
可以分為非搶占式、搶占式兩類調度算法。
前者,非搶占式調度算法挑選一個進程,讓該進程運行直至被堵塞,或者直到該進程自動釋放CPU,絕不會被強制掛起。
即在時鍾中斷時不進行調度,在處理完時鍾中斷后,如果沒有更高優先級的進程等待到時,則被中斷的進程會繼續執行。
后者,搶占式調度算法挑選一個進程,並讓該進程挑選另一個進程運行在某個固定時段的最大值。如果該時段結束,該進程還在運行,則掛起,調度程序此時挑選另一個進程運行(存在就緒進程)。這時候的時間中斷發生在時間間隔的末端,方便把CPU控制返回給調度程序。
沒有可用的時鍾就只能用非搶占式。
三、調度算法分類
批處理----非搶占式普及
交互式----搶占式普及
實時----搶占和非搶占結合
四、調度算法的目標
批處理中的調度算法(當然有些算法也可以用在別的系統中):
1.先來先服務(FCFS)
屬於非搶占式,進程按照他們請求的CPU順序使用CPU。用一個就緒隊列來管理。
該算法的缺點:
對長作業有利(適合於CPU繁忙型,不利於I/O繁忙型)。I/O處理時間很長,而這時CPU處於無事可做等待I/0的狀態,而后面的CPU請求也無法再去接受。
2.最短作業優先(SJF)
也屬於非搶占式,之所以叫最短,肯定運行時間是可以預測的。
長期運行,對長作業不公平
3.最短剩余時間優先
屬於SJF的搶占式版本,如果新的進程比當前運行進程需要更少的時間,當前進程就被掛起。可以讓后面的新的短作業獲得良好的服務。
交互式系統中的調度
1.輪轉調度
時間片輪轉,就不介紹了。
2.優先級調度
輪轉調度默認所有進程一樣重要。而擁有和操作多用戶計算機系統的人對不同的進程有不同級別。就好像等級順序一樣。
又或者你在看電影,而你后台的一些收發郵件的守護進程顯然比你電影的進程優先級低。
為了防止高優先級無限運行,可以設置時間中斷,每過一段時間降低優先級等級。
優先級極可能會造成飢餓現象。
3.多級隊列
比如最高優先級屬於一個隊列運行一個時間片,次高運行2個,依次往下。當一個進程用完分配的時間片后,它被移到下一類。
4.最短進程優先
老化算法改進運行時間(aT0+(1-a)T1),a的值是盡快忘掉老時間的系數。找出最短時間的進程。其他與SJF基本相通
5.保證調度
向用戶做出明確的性能保證,然后實現。假設n個進程並等價,那么每個進程將獲得CPU處理能力的1/n。由於已經可以得出每個進程的實際運行時間。然后將它與實際運行的時間比較。按照其比率轉向比率較低的進程,知道比率超過它的最接近的競爭者。
6.彩票調度
向進程提供各種系統資源的彩票。一旦需要做出一項調度決策時,就隨機抽出一張彩票,擁有該彩票的進程獲得該資源。按照彩票的配額分給CPU的份額。
7.公平分享調度
從用戶角度考慮,換句話來說從進程的所有者來考慮。取決於公平的定義......
-------下一篇寫關於線程的把...太多辣。