linux的進(jìn)程調(diào)度發(fā)生的情況:1、進(jìn)程狀態(tài)轉(zhuǎn)換的時(shí)刻,進(jìn)程終止、進(jìn)程睡眠,進(jìn)程要調(diào)用“sleep()”或“exit()”等函數(shù)進(jìn)行狀態(tài)轉(zhuǎn)換,這些函數(shù)會(huì)主動(dòng)調(diào)用調(diào)度程序進(jìn)行進(jìn)程調(diào)度;2、當(dāng)前進(jìn)程的“current->counter=0”時(shí),進(jìn)程的時(shí)間片是由時(shí)鐘中斷來(lái)更新的;3、當(dāng)設(shè)備驅(qū)動(dòng)程序執(zhí)行長(zhǎng)而重復(fù)的任務(wù)時(shí),直接調(diào)用調(diào)度程序;4、進(jìn)程從中斷、異常及系統(tǒng)調(diào)用返回到用戶態(tài)時(shí)。
本教程操作環(huán)境:linux7.3系統(tǒng)、Dell G3電腦。
linux的進(jìn)程調(diào)度發(fā)生在什么情況下
Linux的調(diào)度程序是一個(gè)叫Schedule()的函數(shù),由它來(lái)決定是否要進(jìn)行進(jìn)程的切換。而所謂的調(diào)度時(shí)機(jī)則是在什么情況下執(zhí)行調(diào)度程序。
Linux進(jìn)程調(diào)度采用的是搶占式多任務(wù)處理,所以進(jìn)程之間的掛起和繼續(xù)運(yùn)行無(wú)需彼此之間的協(xié)作。
主要有一下幾種狀況:
-
進(jìn)程狀態(tài)轉(zhuǎn)換的時(shí)刻:進(jìn)程終止、進(jìn)程睡眠;
進(jìn)程要調(diào)用sleep()或exit()等函數(shù)進(jìn)行狀態(tài)轉(zhuǎn)換,這些函數(shù)會(huì)主動(dòng)調(diào)用調(diào)度程序進(jìn)行進(jìn)程調(diào)度;
-
當(dāng)前進(jìn)程的時(shí)間片用完時(shí)(current->counter=0);
由于進(jìn)程的時(shí)間片是由時(shí)鐘中斷來(lái)更新的,因此,這種情況和時(shí)機(jī)4是一樣的。
-
設(shè)備驅(qū)動(dòng)程序
當(dāng)設(shè)備驅(qū)動(dòng)程序執(zhí)行長(zhǎng)而重復(fù)的任務(wù)時(shí),直接調(diào)用調(diào)度程序。在每次反復(fù)循環(huán)中,驅(qū)動(dòng)程序都檢查need_resched的值,如果必要,則調(diào)用調(diào)度程序schedule()主動(dòng)放棄CPU。
-
進(jìn)程從中斷、異常及系統(tǒng)調(diào)用返回到用戶態(tài)時(shí);
如前所述,不管是從中斷、異常還是系統(tǒng)調(diào)用返回,最終都調(diào)用ret_from_sys_call(),由這個(gè)函數(shù)進(jìn)行調(diào)度標(biāo)志的檢測(cè),如果必要,則調(diào)用調(diào)用調(diào)度程序。
擴(kuò)展知識(shí)
在Linux中,進(jìn)程的運(yùn)行時(shí)間不可能超過(guò)分配給他們的時(shí)間片,他們采用的是搶占式多任務(wù)處理,所以進(jìn)程之間的掛起和繼續(xù)運(yùn)行無(wú)需彼此之間的協(xié)作。
在一個(gè)如linux這樣的多任務(wù)系統(tǒng)中,多個(gè)程序可能會(huì)競(jìng)爭(zhēng)使用同一個(gè)資源,在這種情況下,我們認(rèn)為,執(zhí)行短期的突發(fā)性工作并暫停運(yùn)行以等待輸入的程序,要比持續(xù)占用處理器以進(jìn)行計(jì)算或不斷輪詢系統(tǒng)以查看是否有輸入到達(dá)的程序要更好。我們稱表現(xiàn)好的程序?yàn)閚ice程序,而且在某種意義上,這個(gè)nice 是可以被計(jì)算出來(lái)的。操作系統(tǒng)根據(jù)進(jìn)程的nice值來(lái)決定它的優(yōu)先級(jí),一個(gè)進(jìn)程的nice值默認(rèn)為0并將根據(jù)這個(gè)程序的表現(xiàn)不斷變化。長(zhǎng)期不間斷運(yùn)行的程序的優(yōu)先級(jí)一般會(huì)比較低。
為什么從系統(tǒng)調(diào)用返回時(shí)要調(diào)用調(diào)度程序呢?
這當(dāng)然是從效率考慮。從系統(tǒng)調(diào)用返回意味著要離開(kāi)內(nèi)核態(tài)而返回到用戶態(tài),而狀態(tài)的轉(zhuǎn)換要花費(fèi)一定的時(shí)間,因此,在返回到用戶態(tài)前,系統(tǒng)把在內(nèi)核態(tài)該處理的事全部做完。
下面簡(jiǎn)單看一下每個(gè)時(shí)鐘中斷發(fā)生時(shí)內(nèi)核要做的工作,首先對(duì)這個(gè)最頻繁的調(diào)度時(shí)機(jī)有一個(gè)大體了解,然后再詳細(xì)討論調(diào)度程序的具體工作過(guò)程。
每個(gè)時(shí)鐘中斷(timer interrupt)發(fā)生時(shí),由三個(gè)函數(shù)協(xié)同工作,共同完成進(jìn)程的選擇和切換,它們是:schedule()、do_timer()及ret_form_sys_call()。
schedule():進(jìn)程調(diào)度函數(shù),由它來(lái)完成進(jìn)程的選擇(調(diào)度);
do_timer():暫且稱之為時(shí)鐘函數(shù),該函數(shù)在時(shí)鐘中斷服務(wù)程序中被調(diào)用,是時(shí)鐘中斷服務(wù)程序的主要組成部分,該函數(shù)被調(diào)用的頻率就是時(shí)鐘中斷的頻率即每秒鐘100次(簡(jiǎn)稱100赫茲或100Hz);
ret_from_sys_call():系統(tǒng)調(diào)用返回函數(shù)。
當(dāng)一個(gè)系統(tǒng)調(diào)用或中斷完成時(shí),該函數(shù)被調(diào)用,用于處理一些收尾工作,例如信號(hào)處理、核心任務(wù)等等。
推薦學(xué)習(xí):Linux視頻教程