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