国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

深入Linux內核:進程調度的核心邏輯與實現細節

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

掃碼添加小助手

加入工程師交流群

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

一、進程調度的“身份標識”:優先級與分類

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

1.進程的兩種“性格”

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

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

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

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

2.優先級的“雙重表達”:nice值與內核優先級

進程的優先級有兩種常用表述,我們可以理解為“用戶視角”和“內核視角”:

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

?內核視角:內核優先級:內核內部用0~139的數值表示優先級,規則和nice值一致——數值越低,優先級越高。這個范圍被劃分為兩部分:

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

?100~139:普通進程專用(我們日常使用的瀏覽器、編輯器等都屬于這類);

?特殊情況:Deadline進程優先級為-1,擁有比實時進程更高的調度優先級。

3.進程PCB中的“優先級檔案”

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

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

二、經典與現代:兩大核心調度算法

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

1.經典方案:MLFQ多級反饋隊列算法

核心思想

把進程按優先級分成多個隊列,高優先級隊列的進程先被調度,同優先級隊列內按“先進先出”(FIFO)規則執行。比如設置5個隊列(隊列5最高,隊列1最低):

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

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

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

調度流程(流程圖見下文)

1.進程創建后,根據優先級進入對應隊列;

2.調度器優先從最高優先級隊列取進程執行;

3.同優先級隊列內的進程依次執行,直到時間片耗盡;

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

5.低優先級隊列進程只有在高優先級隊列無任務時才執行。

2.現代方案:CFS完全公平調度器

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

核心邏輯

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

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

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

優勢

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

?動態適應:進程權重隨nice值調整,用戶可以通過系統調用靈活控制進程優先級。

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

1.時間片的本質

時間片是進程在被搶占前能持續運行的最大時間。傳統調度器采用“固定時間片”,但存在明顯缺陷:

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

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

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

CFS不再使用固定時間片,而是通過“權重占比”動態分配CPU時間:

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

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

?所有進程的運行時間占比與權重占比一致,實現“公平調度”。

3.進程切換的觸發

當進程滿足以下條件時,調度器會觸發切換:

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

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

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

四、底層實現:系統調用如何操控調度?

用戶和內核通過系統調用來交互,調整進程優先級的核心函數是nice(),而內核通過task_nice()函數獲取進程的nice值。

1.核心函數實現

C

2.關鍵邏輯

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

?task_nice():內核通過這個函數讀取進程的nice值,底層通過PRIO_TO_NICE宏將內核的static_prio(靜態優先級)轉換為用戶可見的nice值;

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

五、總結:Linux進程調度的核心目標

Linux內核進程調度的本質,是在“公平性”和“響應性”之間尋找平衡:

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

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

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

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

附:Linux進程調度整體流程圖

wKgZPGlLIUuAc6q9AAHObOXga5s998.png

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    88

    文章

    11758

    瀏覽量

    219001
  • LINUX內核
    +關注

    關注

    1

    文章

    321

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Linux內核的“心跳”:jiffies如何為系統計時?

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

    深入RK3588內核:rockchip_linux_defconfig的作用與調試價值

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

    【「Linux 設備驅動開發(第 2 版)」閱讀體驗】+讀深入理解Linux內核內存分配

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

    【「Linux 設備驅動開發(第 2 版)」閱讀體驗】Linux內核開發基礎

    ,本文介紹Linux內核開發基礎 處理內核核心輔助函數 Linux內核加鎖機制和共享資源 無論
    發表于 01-12 22:45

    【「Linux 設備驅動開發(第 2 版)」閱讀體驗】+讀內核處理的核心輔助函數

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

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

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

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

    在ARM64架構的開發領域,異常處理絕非單純的理論知識點,而是直接決定系統穩定性、調試效率和功能實現的關鍵技術。無論是嵌入式開發、Linux內核移植,還是驅動開發與芯片調試,理解異常發生后CPU
    的頭像 發表于 12-24 07:05 ?1103次閱讀
    <b class='flag-5'>深入</b>剖析ARM64異常處理:開發者必須掌握的底層<b class='flag-5'>核心</b><b class='flag-5'>邏輯</b>

    解析Linux進程、線程和協程

    和協程管理 進程管理 Linux通過fork()系統調用創建新進程,每個進程擁有獨立的內存空間和資源。新程序可以通過exec()來加載,從而實現
    發表于 12-22 11:00

    從小白到大牛:Linux嵌入式系統開發的完整指南

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

    Linux-RT特點及簡單應用

    Linux-RT支持優先級繼承(Priority Inheritance),避免了優先級反轉問題,提高了實時任務的響應性能。 標準Linux內核調度器(也稱為CFS
    發表于 12-05 07:37

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

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

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

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

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

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

    嵌入式從入門到進階,怎么學?

    Linux 深入核心目標突破應用開發,進入 內核 / 驅動 / 系統級開發 Linux 基礎命令行(文件 /
    發表于 09-02 09:44

    Linux進程狀態詳解

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