Python中進程的調(diào)度算法詳解
一、先來先服務(wù)調(diào)度算法
先來先服務(wù)(FCFS)調(diào)度算法是一種最簡單的調(diào)度算法,該算法既可用于作業(yè)調(diào)度,也可用于進程調(diào)度。FCFS算法比較有利于長作業(yè)(進程),而不利于短作業(yè)(進程)。
由此可知,本算法適合于CPU繁忙型作業(yè),而不利于I/O繁忙型的作業(yè)(進程)。
二、短作業(yè)優(yōu)先調(diào)度算法
短作業(yè)(進程)優(yōu)先調(diào)度算法(SJ/PF)是指對短作業(yè)或短進程優(yōu)先調(diào)度的算法,該算法既可用于作業(yè)調(diào)度,也可用于進程調(diào)度。
但其對長作業(yè)不利;
不能保證緊迫性作業(yè)(進程)被及時處理;
作業(yè)的長短只是被估算出來的。
三、時間片輪轉(zhuǎn)法
時間片輪轉(zhuǎn)(Round Robin,RR)法的基本思路是讓每個進程在就緒隊列中的等待時間與享受服務(wù)的時間成比例。
在時間片輪轉(zhuǎn)法中,需要將CPU的處理時間分成固定大小的時間片
例如,幾十毫秒至幾百毫秒。如果一個進程在被調(diào)度選中之后用完了系統(tǒng)規(guī)定的時間片,但又未完成要求的任務(wù),則它自行釋放自己所占有的CPU而排到就緒隊列的末尾,等待下一次調(diào)度。
同時,進程調(diào)度程序又去調(diào)度當(dāng)前就緒隊列中的第一個進程。
顯然,輪轉(zhuǎn)法只能用來調(diào)度分配一些可以搶占的資源。
這些可以搶占的資源可以隨時被剝奪,而且可以將它們再分配給別的進程。CPU是可搶占資源的一種。但打印機等資源是不可搶占的。
由于作業(yè)調(diào)度是對除了CPU之外的所有系統(tǒng)硬件資源的分配,其中包含有不可搶占資源,所以作業(yè)調(diào)度不使用輪轉(zhuǎn)法。
在輪轉(zhuǎn)法中,時間片長度的選取非常重要。
首先,時間片長度的選擇會直接影響到系統(tǒng)的開銷和響應(yīng)時間。如果時間片長度過短,則調(diào)度程序搶占處理機的次數(shù)增多。
這將使進程上下文切換次數(shù)也大大增加,從而加重系統(tǒng)開銷。反過來,如果時間片長度選擇過長
例如,一個時間片能保證就緒隊列中所需執(zhí)行時間最長的進程能執(zhí)行完畢,則輪轉(zhuǎn)法變成了先來先服務(wù)法。
時間片長度的選擇是根據(jù)系統(tǒng)對響應(yīng)時間的要求和就緒隊列中所允許最大的進程數(shù)來確定的。
在輪轉(zhuǎn)法中,加入到就緒隊列的進程有3種情況:
- 第一種是分給它的時間片用完,但進程還未完成,回到就緒隊列的末尾等待下次調(diào)度去繼續(xù)執(zhí)行。
- 第二種情況是分給該進程的時間片并未用完,只是因為請求I/O或由于進程的互斥與同步關(guān)系而被阻塞。當(dāng)阻塞解除之后再回到就緒隊列。
- 第三種情況就是新創(chuàng)建進程進入就緒隊列。
如果對這些進程區(qū)別對待,給予不同的優(yōu)先級和時間片從直觀上看,可以進一步改善系統(tǒng)服務(wù)質(zhì)量和效率。
例如,我們可把就緒隊列按照進程到達就緒隊列的類型和進程被阻塞時的阻塞原因分成不同的就緒隊列,每個隊列按FCFS原則排列,各隊列之間的進程享有不同的優(yōu)先級,但同一隊列內(nèi)優(yōu)先級相同。這樣,當(dāng)一個進程在執(zhí)行完它的時間片之后,或從睡眠中被喚醒以及被創(chuàng)建之后,將進入不同的就緒隊列。
四、多級反饋隊列
前面介紹的各種用作進程調(diào)度的算法都有一定的局限性。如短進程優(yōu)先的調(diào)度算法,僅照顧了短進程而忽略了長進程,而且如果并未指明進程的長度,則短進程優(yōu)先和基于進程長度的搶占式調(diào)度算法都將無法使用。
而多級反饋隊列調(diào)度算法則不必事先知道各種進程所需的執(zhí)行時間,而且還可以滿足各種類型進程的需要,因而它是目前被公認(rèn)的一種較好的進程調(diào)度算法。在采用多級反饋隊列調(diào)度算法的系統(tǒng)中,調(diào)度算法的實施過程如下所述。
應(yīng)設(shè)置多個就緒隊列,并為各個隊列賦予不同的優(yōu)先級。第一個隊列的優(yōu)先級最高,第二個隊列次之,其余各隊列的優(yōu)先權(quán)逐個降低。該算法賦予各個隊列中進程執(zhí)行時間片的大小也各不相同,在優(yōu)先權(quán)愈高的隊列中,為每個進程所規(guī)定的執(zhí)行時間片就愈小。
例如,第二個隊列的時間片要比第一個隊列的時間片長一倍,……,第i+1個隊列的時間片要比第i個隊列的時間片長一倍。
當(dāng)一個新進程進入內(nèi)存后,首先將它放入第一隊列的末尾,按FCFS原則排隊等待調(diào)度。當(dāng)輪到該進程執(zhí)行時,如它能在該時間片內(nèi)完成,便可準(zhǔn)備撤離系統(tǒng);如果它在一個時間片結(jié)束時尚未完成,調(diào)度程序便將該進程轉(zhuǎn)入第二隊列的末尾,再同樣地按FCFS原則等待調(diào)度執(zhí)行;如果它在第二隊列中運行一個時間片后仍未完成,再依次將它放入第三隊列,……,如此下去,當(dāng)一個長作業(yè)(進程)從第一隊列依次降到第n隊列后,在第n 隊列便采取按時間片輪轉(zhuǎn)的方式運行。
僅當(dāng)?shù)谝魂犃锌臻e時,調(diào)度程序才調(diào)度第二隊列中的進程運行;僅當(dāng)?shù)?~(i-1)隊列均空時,才會調(diào)度第i隊列中的進程運行。如果處理機正在第i隊列中為某進程服務(wù)時,又有新進程進入優(yōu)先權(quán)較高的隊列(第1~(i-1)中的任何一個隊列),則此時新進程將搶占正在運行進程的處理機,即由調(diào)度程序把正在運行的進程放回到第i隊列的末尾,把處理機分配給新到的高優(yōu)先權(quán)進程。
到此這篇關(guān)于Python中進程的調(diào)度算法詳解的文章就介紹到這了,更多相關(guān)Python進程的調(diào)度內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python 利用內(nèi)置set函數(shù)對字符串和列表進行去重的方法
今天小編就為大家分享一篇Python 利用內(nèi)置set函數(shù)對字符串和列表進行去重的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06Python利用內(nèi)置庫實現(xiàn)數(shù)據(jù)的加密與校驗
這篇文章主要為大家詳細(xì)介紹了如何使用Python內(nèi)置庫實現(xiàn)數(shù)據(jù)的加密和校驗,為開發(fā)者提供全方位的數(shù)據(jù)安全解決方案,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-12-12python GUI庫圖形界面開發(fā)之PyQt5結(jié)合Qt Designer創(chuàng)建信號與槽的詳細(xì)方法與實例
這篇文章主要介紹了python GUI庫圖形界面開發(fā)之PyQt5結(jié)合Qt Designer創(chuàng)建信號與槽的詳細(xì)方法與實例,需要的朋友可以參考下2020-03-03python進階教程之函數(shù)對象(函數(shù)也是對象)
這篇文章主要介紹了python進階教程之函數(shù)對象,函數(shù)對象是指函數(shù)也是對象,本文還講解了lambda函數(shù)、函數(shù)作為參數(shù)傳遞、map()函數(shù)、filter()函數(shù)、reduce()函數(shù)等內(nèi)容,需要的朋友可以參考下2014-08-08在Ubuntu中安裝并配置Pycharm教程的實現(xiàn)方法
這篇文章主要介紹了在Ubuntu中安裝并配置Pycharm教程的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01利用Python找出序列中出現(xiàn)最多的元素示例代碼
這篇文章主要給大家介紹了關(guān)于利用Python找出序列中出現(xiàn)最多的元素的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12使用Anaconda創(chuàng)建Python指定版本的虛擬環(huán)境的教程詳解
由于工作的需要和學(xué)習(xí)的需要,需要創(chuàng)建不同Python版本的虛擬環(huán)境,所以這篇文章主要為大家詳細(xì)介紹了如何使用Anaconda創(chuàng)建Python指定版本的虛擬環(huán)境,需要的可以參考下2024-03-03