91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

深入Linux內(nèi)核:進(jìn)程調(diào)度的核心邏輯與實(shí)現(xiàn)細(xì)節(jié)

jf_44130326 ? 來源:Linux1024 ? 作者:Linux1024 ? 2025-12-24 07:05 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Linux系統(tǒng)中,進(jìn)程調(diào)度就像一位精明的“CPU管理員”——它決定著哪個(gè)進(jìn)程能優(yōu)先使用CPU,多久切換一次進(jìn)程,如何平衡系統(tǒng)響應(yīng)速度與資源利用率。小到桌面應(yīng)用的流暢點(diǎn)擊,大到服務(wù)器的多任務(wù)并發(fā),背后都離不開內(nèi)核調(diào)度算法的精準(zhǔn)操控。今天,我們就從優(yōu)先級、調(diào)度算法、時(shí)間片分配到底層實(shí)現(xiàn),全方位拆解Linux內(nèi)核進(jìn)程調(diào)度的核心邏輯。

一、進(jìn)程調(diào)度的“身份標(biāo)識”:優(yōu)先級與分類

要理解調(diào)度邏輯,首先得搞懂:進(jìn)程憑什么“插隊(duì)”?答案是——優(yōu)先級。而進(jìn)程的“性格”(CPU消耗型/I/O消耗型),也會(huì)影響調(diào)度器的決策。

1.進(jìn)程的兩種“性格”

從CPU使用習(xí)慣來看,進(jìn)程分為兩類:

?CPU消耗型進(jìn)程:像大型計(jì)算、程序編譯這類任務(wù),一旦運(yùn)行就想長時(shí)間霸占CPU,對時(shí)間片的需求是“越長越好”。

?I/O消耗型進(jìn)程:像鍵盤輸入、網(wǎng)絡(luò)請求、磁盤讀寫這類任務(wù),大部分時(shí)間在等待I/O設(shè)備響應(yīng),實(shí)際占用CPU的時(shí)間很短,不需要長時(shí)時(shí)間片,反而需要調(diào)度器快速響應(yīng),讓它“隨叫隨到”。

Linux調(diào)度器的核心目標(biāo)之一,就是平衡這兩類進(jìn)程的需求——既保證CPU消耗型進(jìn)程的計(jì)算效率,又不犧牲I/O消耗型進(jìn)程的響應(yīng)速度。

2.優(yōu)先級的“雙重表達(dá)”:nice值與內(nèi)核優(yōu)先級

進(jìn)程的優(yōu)先級有兩種常用表述,我們可以理解為“用戶視角”和“內(nèi)核視角”:

?用戶視角:nice值:這是用戶能直接操作的優(yōu)先級指標(biāo),取值范圍是-20~19。核心規(guī)則很簡單:nice值越小,優(yōu)先級越高(比如nice=-20是最高用戶優(yōu)先級,nice=19是最低),默認(rèn)值為0。

?內(nèi)核視角:內(nèi)核優(yōu)先級:內(nèi)核內(nèi)部用0~139的數(shù)值表示優(yōu)先級,規(guī)則和nice值一致——數(shù)值越低,優(yōu)先級越高。這個(gè)范圍被劃分為兩部分:

?0~99:實(shí)時(shí)進(jìn)程專用(比如工業(yè)控制、音頻處理等需要毫秒級響應(yīng)的任務(wù));

?100~139:普通進(jìn)程專用(我們?nèi)粘J褂玫臑g覽器、編輯器等都屬于這類);

?特殊情況:Deadline進(jìn)程優(yōu)先級為-1,擁有比實(shí)時(shí)進(jìn)程更高的調(diào)度優(yōu)先級。

3.進(jìn)程PCB中的“優(yōu)先級檔案”

每個(gè)進(jìn)程在Linux內(nèi)核中都有一個(gè)“身份檔案”——struct task_struct(進(jìn)程控制塊PCB),其中4個(gè)成員專門記錄優(yōu)先級信息:

成員名 作用說明
static_prio 靜態(tài)優(yōu)先級,由nice值轉(zhuǎn)換而來,一旦設(shè)定不會(huì)輕易改變
prio 動(dòng)態(tài)優(yōu)先級,內(nèi)核根據(jù)進(jìn)程運(yùn)行狀態(tài)動(dòng)態(tài)調(diào)整(比如長時(shí)間等待的進(jìn)程可能臨時(shí)提權(quán))
normal_prio 普通優(yōu)先級:普通進(jìn)程的normal_prio等于static_prio,實(shí)時(shí)進(jìn)程會(huì)根據(jù)rt_priority重新計(jì)算
rt_priority 實(shí)時(shí)進(jìn)程的優(yōu)先級,專門用于實(shí)時(shí)進(jìn)程的調(diào)度排序

二、經(jīng)典與現(xiàn)代:兩大核心調(diào)度算法

調(diào)度算法是進(jìn)程調(diào)度的“大腦”,Linux內(nèi)核先后采用過兩種關(guān)鍵算法:MLFQ(多級反饋隊(duì)列)和CFS(完全公平調(diào)度器),后者更是當(dāng)前Linux系統(tǒng)的主流。

1.經(jīng)典方案:MLFQ多級反饋隊(duì)列算法

核心思想

把進(jìn)程按優(yōu)先級分成多個(gè)隊(duì)列,高優(yōu)先級隊(duì)列的進(jìn)程先被調(diào)度,同優(yōu)先級隊(duì)列內(nèi)按“先進(jìn)先出”(FIFO)規(guī)則執(zhí)行。比如設(shè)置5個(gè)隊(duì)列(隊(duì)列5最高,隊(duì)列1最低):

?高優(yōu)先級進(jìn)程(如I/O消耗型)進(jìn)入隊(duì)列5,優(yōu)先占用CPU;

?低優(yōu)先級進(jìn)程(如CPU消耗型)進(jìn)入隊(duì)列1,等所有高優(yōu)先級隊(duì)列空閑后才執(zhí)行;

?若高優(yōu)先級隊(duì)列的進(jìn)程執(zhí)行超時(shí),會(huì)被“降級”到低一級隊(duì)列,避免獨(dú)占CPU。

調(diào)度流程(流程圖見下文)

1.進(jìn)程創(chuàng)建后,根據(jù)優(yōu)先級進(jìn)入對應(yīng)隊(duì)列;

2.調(diào)度器優(yōu)先從最高優(yōu)先級隊(duì)列取進(jìn)程執(zhí)行;

3.同優(yōu)先級隊(duì)列內(nèi)的進(jìn)程依次執(zhí)行,直到時(shí)間片耗盡;

4.超時(shí)進(jìn)程降級到低一級隊(duì)列,空閑隊(duì)列的進(jìn)程可能被提權(quán);

5.低優(yōu)先級隊(duì)列進(jìn)程只有在高優(yōu)先級隊(duì)列無任務(wù)時(shí)才執(zhí)行。

2.現(xiàn)代方案:CFS完全公平調(diào)度器

MLFQ依賴固定時(shí)間片和隊(duì)列分級,難以實(shí)現(xiàn)絕對公平。CFS徹底拋棄了“固定時(shí)間片”和“固定調(diào)度周期”,核心是“按權(quán)重分配CPU時(shí)間”,讓每個(gè)進(jìn)程都能獲得“公平的運(yùn)行機(jī)會(huì)”。

核心邏輯

?權(quán)重量化:每個(gè)進(jìn)程的權(quán)重由nice值轉(zhuǎn)換而來(nice值越小,權(quán)重越大);

?時(shí)間分配:CPU總時(shí)間按“進(jìn)程權(quán)重/所有進(jìn)程總權(quán)重”的比例分配給每個(gè)進(jìn)程;

?舉例:如果進(jìn)程A權(quán)重是2,進(jìn)程B權(quán)重是1,總權(quán)重是3,那么A獲得2/3的CPU時(shí)間,B獲得1/3,實(shí)現(xiàn)“按貢獻(xiàn)分配”的公平性。

優(yōu)勢

?無需固定時(shí)間片:I/O消耗型進(jìn)程權(quán)重高,能快速獲得CPU響應(yīng);CPU消耗型進(jìn)程權(quán)重低,但能獲得持續(xù)的CPU時(shí)間,不會(huì)頻繁被搶占;

?動(dòng)態(tài)適應(yīng):進(jìn)程權(quán)重隨nice值調(diào)整,用戶可以通過系統(tǒng)調(diào)用靈活控制進(jìn)程優(yōu)先級。

三、時(shí)間片與進(jìn)程切換:CPU時(shí)間的“分配藝術(shù)”

1.時(shí)間片的本質(zhì)

時(shí)間片是進(jìn)程在被搶占前能持續(xù)運(yùn)行的最大時(shí)間。傳統(tǒng)調(diào)度器采用“固定時(shí)間片”,但存在明顯缺陷:

?I/O消耗型進(jìn)程用不完時(shí)間片,造成資源浪費(fèi);

?CPU消耗型進(jìn)程覺得時(shí)間片太短,頻繁切換導(dǎo)致開銷增加。

2. CFS的“無時(shí)間片”革命

CFS不再使用固定時(shí)間片,而是通過“權(quán)重占比”動(dòng)態(tài)分配CPU時(shí)間:

?權(quán)重高的進(jìn)程(如nice值-20)獲得更長的運(yùn)行時(shí)間;

?權(quán)重低的進(jìn)程(如nice值19)獲得較短的運(yùn)行時(shí)間;

?所有進(jìn)程的運(yùn)行時(shí)間占比與權(quán)重占比一致,實(shí)現(xiàn)“公平調(diào)度”。

3.進(jìn)程切換的觸發(fā)

當(dāng)進(jìn)程滿足以下條件時(shí),調(diào)度器會(huì)觸發(fā)切換:

?進(jìn)程運(yùn)行時(shí)間達(dá)到分配的“公平時(shí)間”;

?進(jìn)程主動(dòng)放棄CPU(如等待I/O);

?有更高優(yōu)先級進(jìn)程被喚醒(搶占當(dāng)前進(jìn)程)。

四、底層實(shí)現(xiàn):系統(tǒng)調(diào)用如何操控調(diào)度?

用戶和內(nèi)核通過系統(tǒng)調(diào)用來交互,調(diào)整進(jìn)程優(yōu)先級的核心函數(shù)是nice(),而內(nèi)核通過task_nice()函數(shù)獲取進(jìn)程的nice值。

1.核心函數(shù)實(shí)現(xiàn)

C

2.關(guān)鍵邏輯

?nice(int inc):用戶通過這個(gè)系統(tǒng)調(diào)用調(diào)整進(jìn)程優(yōu)先級,inc是nice值的變化量(比如inc=-5表示優(yōu)先級提高);

?task_nice():內(nèi)核通過這個(gè)函數(shù)讀取進(jìn)程的nice值,底層通過PRIO_TO_NICE宏將內(nèi)核的static_prio(靜態(tài)優(yōu)先級)轉(zhuǎn)換為用戶可見的nice值;

?轉(zhuǎn)換規(guī)則:static_prio范圍100~139(普通進(jìn)程),對應(yīng)nice值-20~19(比如static_prio=100對應(yīng)nice=-20,static_prio=139對應(yīng)nice=19)。

五、總結(jié):Linux進(jìn)程調(diào)度的核心目標(biāo)

Linux內(nèi)核進(jìn)程調(diào)度的本質(zhì),是在“公平性”和“響應(yīng)性”之間尋找平衡:

?對普通用戶:保證桌面應(yīng)用、輸入法等I/O消耗型進(jìn)程快速響應(yīng),體感流暢;

?對服務(wù)器:保證多進(jìn)程并發(fā)時(shí)的資源利用率,讓CPU消耗型進(jìn)程高效運(yùn)行;

?對開發(fā)者:提供靈活的優(yōu)先級調(diào)整接口(nice值),滿足不同場景的調(diào)度需求。

從MLFQ的“分級調(diào)度”到CFS的“公平調(diào)度”,Linux內(nèi)核的調(diào)度算法一直在進(jìn)化,而核心邏輯始終圍繞“讓CPU資源得到最優(yōu)分配”。理解這些底層細(xì)節(jié),不僅能幫助我們排查系統(tǒng)性能問題,更能讓我們在編寫程序時(shí),通過合理設(shè)置進(jìn)程優(yōu)先級,讓應(yīng)用運(yùn)行得更高效。

附:Linux進(jìn)程調(diào)度整體流程圖

wKgZPGlLIUuAc6q9AAHObOXga5s998.png

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11760

    瀏覽量

    219016
  • LINUX內(nèi)核
    +關(guān)注

    關(guān)注

    1

    文章

    321

    瀏覽量

    23206
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    Linux內(nèi)核的“心跳”:jiffies如何為系統(tǒng)計(jì)時(shí)?

    Linux 內(nèi)核的世界里,有一個(gè)默默工作的 "計(jì)時(shí)器"——jiffies。它不像我們手機(jī)上的時(shí)鐘那樣顯示年月日,卻掌控著內(nèi)核中絕大多數(shù)時(shí)間相關(guān)的操作:從進(jìn)程
    的頭像 發(fā)表于 02-04 16:27 ?817次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>內(nèi)核</b>的“心跳”:jiffies如何為系統(tǒng)計(jì)時(shí)?

    深入RK3588內(nèi)核:rockchip_linux_defconfig的作用與調(diào)試價(jià)值

    在 RK3588 芯片的 Linux 開發(fā)中,有一個(gè)文件始終是開發(fā)者繞不開的核心 ——kernel/arch/arm64/configs/rockchip_linux_defconfig。無論是首次
    的頭像 發(fā)表于 02-03 15:56 ?1156次閱讀
    <b class='flag-5'>深入</b>RK3588<b class='flag-5'>內(nèi)核</b>:rockchip_<b class='flag-5'>linux</b>_defconfig的作用與調(diào)試價(jià)值

    【「Linux 設(shè)備驅(qū)動(dòng)開發(fā)(第 2 版)」閱讀體驗(yàn)】+讀深入理解Linux內(nèi)核內(nèi)存分配

    作者引入內(nèi)存相關(guān)術(shù)語,物理地址標(biāo)識物理內(nèi)存位置。由于虛擬內(nèi)存機(jī)制,用戶和內(nèi)核從不直接訪問物理地址,而是通過相應(yīng)的邏輯地址來訪問的。MMU(內(nèi)存管理單元)位于CPU核心和內(nèi)存之間,通常是物理CPU本身
    發(fā)表于 01-16 20:05

    【「Linux 設(shè)備驅(qū)動(dòng)開發(fā)(第 2 版)」閱讀體驗(yàn)】Linux內(nèi)核開發(fā)基礎(chǔ)

    ,本文介紹Linux內(nèi)核開發(fā)基礎(chǔ) 處理內(nèi)核核心輔助函數(shù) Linux內(nèi)核加鎖機(jī)制和共享資源 無論
    發(fā)表于 01-12 22:45

    【「Linux 設(shè)備驅(qū)動(dòng)開發(fā)(第 2 版)」閱讀體驗(yàn)】+讀內(nèi)核處理的核心輔助函數(shù)

    “處理內(nèi)核核心輔助函數(shù)”進(jìn)行學(xué)習(xí)。 第3章又是以5個(gè)主題展開討論學(xué)習(xí),①、Linux內(nèi)核加鎖機(jī)制和共享資源;②、處理內(nèi)核等待、睡眠和延遲機(jī)
    發(fā)表于 01-10 22:08

    深入解析RK平臺Android/Linux Bootloader核心文件:android_bootloader.c

    是對接Android啟動(dòng)邏輯核心文件——它決定了設(shè)備是進(jìn)入正常系統(tǒng)、Recovery模式還是Fastboot模式,同時(shí)承擔(dān)了AVB(Android Verified Boot)驗(yàn)證、內(nèi)核加載、命令行
    的頭像 發(fā)表于 01-09 10:58 ?1196次閱讀
    <b class='flag-5'>深入</b>解析RK平臺Android/<b class='flag-5'>Linux</b> Bootloader<b class='flag-5'>核心</b>文件:android_bootloader.c

    深入剖析ARM64異常處理:開發(fā)者必須掌握的底層核心邏輯

    在ARM64架構(gòu)的開發(fā)領(lǐng)域,異常處理絕非單純的理論知識點(diǎn),而是直接決定系統(tǒng)穩(wěn)定性、調(diào)試效率和功能實(shí)現(xiàn)的關(guān)鍵技術(shù)。無論是嵌入式開發(fā)、Linux內(nèi)核移植,還是驅(qū)動(dòng)開發(fā)與芯片調(diào)試,理解異常發(fā)生后CPU
    的頭像 發(fā)表于 12-24 07:05 ?1104次閱讀
    <b class='flag-5'>深入</b>剖析ARM64異常處理:開發(fā)者必須掌握的底層<b class='flag-5'>核心</b><b class='flag-5'>邏輯</b>

    解析Linux進(jìn)程、線程和協(xié)程

    和協(xié)程管理 進(jìn)程管理 Linux通過fork()系統(tǒng)調(diào)用創(chuàng)建新進(jìn)程,每個(gè)進(jìn)程擁有獨(dú)立的內(nèi)存空間和資源。新程序可以通過exec()來加載,從而實(shí)現(xiàn)
    發(fā)表于 12-22 11:00

    從小白到大牛:Linux嵌入式系統(tǒng)開發(fā)的完整指南

    編寫簡單的 Shell 腳本(如自動(dòng)備份文件、批量編譯程序)鞏固技能。? 二、能力進(jìn)階:攻克核心技術(shù)模塊? 入門后需聚焦嵌入式 Linux核心技術(shù)棧,分模塊突破,形成系統(tǒng)化能力:? 內(nèi)
    發(fā)表于 12-16 10:42

    Linux-RT特點(diǎn)及簡單應(yīng)用

    Linux-RT支持優(yōu)先級繼承(Priority Inheritance),避免了優(yōu)先級反轉(zhuǎn)問題,提高了實(shí)時(shí)任務(wù)的響應(yīng)性能。 標(biāo)準(zhǔn)Linux內(nèi)核調(diào)度器(也稱為CFS
    發(fā)表于 12-05 07:37

    【書籍評測活動(dòng)NO.67】成為硬核Linux開發(fā)者:《Linux 設(shè)備驅(qū)動(dòng)開發(fā)(第 2 版)》

    ,解析模塊的構(gòu)建邏輯,重點(diǎn)介紹樹外構(gòu)建與樹內(nèi)構(gòu)建,講解Linux內(nèi)核編程技巧。系統(tǒng)講解并發(fā)與同步、延遲與中斷處理等核心輔助函數(shù),包括自旋鎖與互斥鎖的區(qū)別及適用場景、等待隊(duì)列
    發(fā)表于 11-17 17:52

    從微秒級響應(yīng)到確定性延遲:深入解析米爾全志T536核心板的實(shí)時(shí)性技術(shù)突破

    紅黑樹實(shí)現(xiàn)O(log n)調(diào)度復(fù)雜度,追求整體吞吐量最大化。 實(shí)時(shí)缺陷:內(nèi)核不可搶占、自旋鎖阻塞、中斷屏蔽窗口等因素導(dǎo)致延遲不可預(yù)測。 2.2 標(biāo)準(zhǔn)內(nèi)核+軟隔離方案
    發(fā)表于 10-22 17:25

    深入解析米爾全志T536核心板的實(shí)時(shí)性技術(shù)突破

    實(shí)現(xiàn)O(log n)調(diào)度復(fù)雜度,追求整體吞吐量最大化。實(shí)時(shí)缺陷:內(nèi)核不可搶占、自旋鎖阻塞、中斷屏蔽窗口等因素導(dǎo)致延遲不可預(yù)測。2.2 標(biāo)準(zhǔn)內(nèi)核+軟隔離方案
    發(fā)表于 10-17 17:41

    嵌入式從入門到進(jìn)階,怎么學(xué)?

    、Linux 深入核心目標(biāo)突破應(yīng)用開發(fā),進(jìn)入 內(nèi)核 / 驅(qū)動(dòng) / 系統(tǒng)級開發(fā) Linux 基礎(chǔ)命令行(文件 /
    發(fā)表于 09-02 09:44

    Linux進(jìn)程狀態(tài)詳解

    進(jìn)程狀態(tài)是task_struct內(nèi)的一個(gè)整數(shù);進(jìn)行:進(jìn)程調(diào)度隊(duì)列中,進(jìn)程的狀態(tài)都是running,阻塞:等待某種設(shè)備或者資源就緒。進(jìn)程是一
    的頭像 發(fā)表于 04-01 09:46 ?1162次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>進(jìn)程</b>狀態(tài)詳解