內(nèi)核的主要職責(zé)是進(jìn)程調(diào)度,比如當(dāng)一個(gè)進(jìn)程阻塞時(shí),它會(huì)調(diào)度另外一個(gè)進(jìn)程來(lái)執(zhí)行。 那當(dāng)沒(méi)有進(jìn)程可以調(diào)度時(shí),內(nèi)核在做什么呢? 此時(shí),內(nèi)核會(huì)進(jìn)入到idle狀態(tài),其大致邏輯是:
while(1) { while(!need_resched()) {// 判斷是否有其他進(jìn)程可執(zhí)行 asm("hlt");// 如果沒(méi)有,則執(zhí)行hlt指令 } schedule_idle();// 如果有,則轉(zhuǎn)而執(zhí)行其他進(jìn)程 }由上可見(jiàn),當(dāng)沒(méi)有其他進(jìn)程可執(zhí)行時(shí),idle循環(huán)里會(huì)一直執(zhí)行hlt匯編指令,該指令的作用是暫停cpu的執(zhí)行,直到有中斷等情況發(fā)生時(shí)。
當(dāng)有中斷發(fā)生時(shí),比如內(nèi)核接收到了新的tcp包,此時(shí)某個(gè)進(jìn)程會(huì)從阻塞狀態(tài)轉(zhuǎn)變?yōu)榭蓤?zhí)行狀態(tài)。
當(dāng)中斷邏輯執(zhí)行完畢后,上面的idle循環(huán)也會(huì)從halt狀態(tài)退出,繼續(xù)循環(huán)執(zhí)行need_resched()函數(shù),此時(shí)該函數(shù)返回true,表示有其他進(jìn)程可執(zhí)行,這樣該邏輯會(huì)退出hlt循環(huán),繼續(xù)執(zhí)行schedule_idle()函數(shù),schedule_idle()函數(shù)的作用是從idle進(jìn)程切換到目標(biāo)進(jìn)程,進(jìn)而執(zhí)行其對(duì)應(yīng)的代碼。
這樣,內(nèi)核就從idle狀態(tài),退回到了正常的進(jìn)程調(diào)度狀態(tài)。
當(dāng)其他所有進(jìn)程又都執(zhí)行完畢,又都進(jìn)入到了阻塞狀態(tài),導(dǎo)致內(nèi)核沒(méi)有進(jìn)程可調(diào)度時(shí),內(nèi)核邏輯又會(huì)切換到上述idle循環(huán)代碼,從schedule_idle()函數(shù)后繼續(xù)執(zhí)行,即進(jìn)入下一次循環(huán)。
上面的idle循環(huán)在內(nèi)核中也是以一個(gè)進(jìn)程來(lái)表示的,它的pid是0,它的名字是swapper。
審核編輯:劉清
-
PID
+關(guān)注
關(guān)注
35文章
1473瀏覽量
85825 -
中斷
+關(guān)注
關(guān)注
5文章
900瀏覽量
41755 -
TCP通信
+關(guān)注
關(guān)注
0文章
146瀏覽量
4292
原文標(biāo)題:當(dāng)沒(méi)有進(jìn)程可調(diào)度時(shí),內(nèi)核在做什么呢?
文章出處:【微信號(hào):良許Linux,微信公眾號(hào):良許Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
Linux內(nèi)核進(jìn)程管理與調(diào)度:策略優(yōu)化與實(shí)踐分析
![Linux<b class='flag-5'>內(nèi)核</b><b class='flag-5'>進(jìn)程</b>管理與<b class='flag-5'>調(diào)度</b>:策略優(yōu)化與實(shí)踐分析](https://file1.elecfans.com/web2/M00/82/8B/wKgaomRYU8uARetaAAAaY9wHsB8889.jpg)
深入探討Linux的進(jìn)程調(diào)度器
![深入探討Linux的<b class='flag-5'>進(jìn)程</b><b class='flag-5'>調(diào)度</b>器](https://file1.elecfans.com/web2/M00/03/3A/wKgaoma679SAK08_AALRmJd5TD4803.png)
labview的工程師在做什么呢?
干貨分享:基于嵌入式Linux中進(jìn)程調(diào)度實(shí)現(xiàn)方法
【HarmonyOS】鴻蒙內(nèi)核源碼分析(調(diào)度機(jī)制篇)
鴻蒙內(nèi)核源碼分析(調(diào)度機(jī)制篇):Task是如何被調(diào)度執(zhí)行的
鴻蒙內(nèi)核源碼分析(調(diào)度隊(duì)列篇):進(jìn)程和Task的就緒隊(duì)列對(duì)調(diào)度的作用
Linux進(jìn)程調(diào)度的原理解析
uClinux進(jìn)程調(diào)度器的實(shí)現(xiàn)分析
Linux 進(jìn)程調(diào)度淺析
linux進(jìn)程調(diào)度淺析
鴻蒙內(nèi)核源碼分析:task是內(nèi)核調(diào)度的單元
![鴻蒙<b class='flag-5'>內(nèi)核</b>源碼分析:task是<b class='flag-5'>內(nèi)核</b><b class='flag-5'>調(diào)度</b>的單元](https://file.elecfans.com/web1/M00/D0/C8/pIYBAF-7Z_eAKw9iAABqmsljMWw560.png)
鴻蒙內(nèi)核源碼分析:進(jìn)程和Task的就緒隊(duì)列對(duì)調(diào)度的作用
![鴻蒙<b class='flag-5'>內(nèi)核</b>源碼分析:<b class='flag-5'>進(jìn)程</b>和Task的就緒隊(duì)列對(duì)<b class='flag-5'>調(diào)度</b>的作用](https://file.elecfans.com/web1/M00/D0/C8/pIYBAF-7ZyWAcOUoAABRK-7Fsdk048.png)
評(píng)論