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

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

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

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

1.進程的兩種“性格”

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

核心思想

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

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

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

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

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

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

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

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

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

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

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

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

核心邏輯

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

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

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

優(yōu)勢

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

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

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

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

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

?I/O消耗型進程用不完時間片,造成資源浪費;

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

2. CFS的“無時間片”革命

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

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

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

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

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

當進程滿足以下條件時,調(diào)度器會觸發(fā)切換:

?進程運行時間達到分配的“公平時間”;

?進程主動放棄CPU(如等待I/O);

?有更高優(yōu)先級進程被喚醒(搶占當前進程)。

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

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

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

C

2.關(guān)鍵邏輯

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

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

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

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

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

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

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

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

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

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

wKgZPGlLIUuAc6q9AAHObOXga5s998.png

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

    關(guān)注

    88

    文章

    11756

    瀏覽量

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

    關(guān)注

    1

    文章

    321

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

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

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

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

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

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

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

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

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

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

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

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

    是對接Android啟動邏輯核心文件——它決定了設(shè)備是進入正常系統(tǒng)、Recovery模式還是Fastboot模式,同時承擔了AVB(Android Verified Boot)驗證、內(nèi)核加載、命令行
    的頭像 發(fā)表于 01-09 10:58 ?1187次閱讀
    <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)域,異常處理絕非單純的理論知識點,而是直接決定系統(tǒng)穩(wěn)定性、調(diào)試效率和功能實現(xiàn)的關(guān)鍵技術(shù)。無論是嵌入式開發(fā)、Linux內(nèi)核移植,還是驅(qū)動開發(fā)與芯片調(diào)試,理解異常發(fā)生后CPU
    的頭像 發(fā)表于 12-24 07:05 ?1101次閱讀
    <b class='flag-5'>深入</b>剖析ARM64異常處理:開發(fā)者必須掌握的底層<b class='flag-5'>核心</b><b class='flag-5'>邏輯</b>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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