現代操作系統------進程與線程調度


在多道程序設計系統時,通常就會有多個進程或線程同時競爭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.公平分享調度

從用戶角度考慮,換句話來說從進程的所有者來考慮。取決於公平的定義......

-------下一篇寫關於線程的把...太多辣。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM