【Linux 學習計劃】-- 系統中進程是如何調度的(內核進程調度隊列)

目錄

回顧進程優先級與進程調度的引入

內核runqueue圖例

關于queue[140]前100個位置 | 實時進程與分時進程

遍歷需要調度的進程與bitmap的引入

active、expired指針

結語


回顧進程優先級與進程調度的引入

在我們之前的學習中,我們是有學習過進程優先級這個概念的,這里簡單回顧一下

默認優先級是80,但是還有一個nice值可以供我們修改優先級的值

這是因為:優先級 = 默認優先級 + nice值

而nice值的范圍是從-20~19,也就是說,進程優先級是有40個值的,即從60 ~ 99

但是現在進程的優先級我們知道了,而在系統之中,他是如何使用這些優先級的呢?

內核runqueue圖例

如下圖:

這個是我們內核中的runqueue,前面我們在進程狀態那篇博客中也有提到他,只要進程被鏈入runqueue之中,就代表他會被CPU調度執行,也就是就緒和運行狀態

并且,一個CPU只有一個runqueue

而今天我們將會詳細談一談runqueue里面的幾個字段,因為我們今天要講調度,那就必然和這些繞不開

首先是上圖中用藍色框框框起來的,第三個,也就是queue[140]

需要說明的是,這140個空間中,前100個是給實時進程的(后文會有所舉例),也就是0~99位置,而后面的100~139這40個位置

不對,40個位置,這和我們的nice值的范圍,也就是進程優先級的范圍不是正好吻合了嗎!

事實也的確如此,我們來看一下圖例:

我們的每一個下標,在這樣子分布的情況下,就可以和進程的優先級一一對應,而我們這時候如果有進程進來了,那么就會直接根據他的優先級進行插入到相應位置:

比如這樣,接著就能夠調度起來了

關于queue[140]前100個位置 | 實時進程與分時進程

可能很多同學對這幾個字眼比較陌生,這里舉一個例子就明白了

分時操作系統就好比我們的電腦,需要同時讓多個進程進行輪轉,同時運行

而實時操作系統則像是車子,一臺汽車里面可能有很多功能,音樂、影視等等,但是總不能說有緊急情況了,現在我要剎車,結果操作系統說:不行,我音樂還在放呢,你不能剎車,這也太扯了

以上就是關于實時操作系統和分時操作系統的講解,這里并不打算詳說,因為今天的重點是動態理解進程的調度

遍歷需要調度的進程與bitmap的引入

首先,我們并不是所有進程的優先級都是從60開始的,大部分甚至都是80

那問題來了,我們前面還有100個空間沒有使用,空著放在那里給實時進程準備著,那我們每一次要找下一個需要調度的進程的時候,都需要一個一個去找嗎?這樣的話效率太低了

所以runqueue中還有一個東西,叫做bitmap[5],也就是所謂的位圖:

至于為什么是 5 呢,因為5*32=160,而4*32=128,5 個可以剛好覆蓋,但是4個則會直接不夠

而我們有了位圖之后,效率的提升是明顯的

比如我們現在要看前32個空間有沒有進程,我們只需要這樣:

bitmap[i]==0

這樣我們一次就能知道32個位置有沒有進程,如果為0,那就下一個32,如果不為0,那再一個一個找進程

active、expired指針

active(活躍)expired(過期)

我們現在再來看回最開始那張圖片:

我們可以看到,這里面其實有兩個框,藍和紅兩個,并且,里面的內容是完全一樣的

在看到藍色框框上面的兩個變量,那是兩個指針,active 和 expired,而這兩個指針指向的就是下面的兩個框框

我們再通過畫圖來理解一下這個過程:

在最開始的時候,進程在活躍(active)指針指向的queue下面,等到調度完之后

這個進程就會被鏈入到expired所指向的queue中(下圖用藍色框框表示的就是已經調用結束的進程):

而所有的進程在被調度完之后,上面active指針所指向的queue,直接遍歷 1 次bitmap,發現全是 0,就知道全部調度完了

接下來就是:兩個指針的值直接交換(swap(*active, *expired))

這樣我們的活躍queue和過期queue就完成了交換

接下來就是繼續調度active指針指向的進程,全部執行完了之后,就再交換,過期的重新變成活躍的

如此往復

結語

這篇文章到這里就結束啦!!~( ̄▽ ̄)~*

如果覺得對你有幫助的,可以多多關注一下喔

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/908261.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/908261.shtml
英文地址,請注明出處:http://en.pswp.cn/news/908261.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Spring AI 1.0.0】Spring AI 1.0.0框架快速入門(1)——Chat Client API

Spring AI框架快速入門 一、前言二、前期準備2.1 運行環境2.2 maven配置2.3 api-key申請 三、Chat Client API3.1 導入pom依賴3.2 配置application.properties文件3.3 創建 ChatClient3.3.1 使用自動配置的 ChatClient.Builder3.3.2 使用多個聊天模型 3.4 ChatClient請求3.5 Ch…

微信小程序開發一個自定義組件的詳細教程

以下是一個微信小程序自定義組件的詳細教程,覆蓋開發文檔中的核心知識點。我們將以一個包含屬性、事件、插槽、生命周期等功能的按鈕組件為例進行說明: 一、創建組件 在 components 目錄下新建 custom-button 文件夾,包含以下文件&#xff…

模電——第四講場效應管

定義:具有正向受控作用的半導體器件 分類:MOS(絕緣柵)場效應管和結性場效應管 區別:場效應管相比于晶體管,輸入電阻很大,是單極型器件 MOS場效應管: 特性曲線 利用半導體表面的電…

[藍橋杯]堆的計數

堆的計數 題目描述 我們知道包含 NN 個元素的堆可以看成是一棵包含 NN 個節點的完全二叉樹。 每個節點有一個權值。對于小根堆來說,父節點的權值一定小于其子節點的權值。 假設 NN 個節點的權值分別是 1~NN,你能求出一共有多少種不同的小根堆嗎&…

論文閱讀:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻譯 自動駕駛技術作為推動交通和城市出行變革的催化劑,正從基于規則的系統向數據驅動策略轉變。傳統的模塊化系統受限于級聯模塊間的累積誤差和缺乏靈活性的預設規則。…

WebRTC中的幾個Rtp*Sender

一、問題: webrtc當中有幾個比較相似的類,看著都是發送RTP數據包的,分別是:RtpPacketToSend 和RtpSenderVideo還有RtpVideoSender以及RTPSender,這說明什么呢?首先,說明我會很多連詞&#xff0…

EFI(x64)簡易開發環境

文章目錄 1 必須文件2 運行環境3 構建應用 (Visual Studio)4 引用 EDK2 頭文件 1 必須文件 EDK2: 可以只拉取倉庫本身, 不拉取其子倉庫(完整構建才需要) qemu: qemu 以源碼發布, QEMU for Windows – Installers (64 bit) 這里有民間構建的安裝包 2 運行環境 創建一個 root …

八皇后問題深度解析

八皇后問題深度解析 一、八皇后問題的起源與背景1.1 問題起源1.2 歷史發展 二、問題描述與約束條件2.1 問題描述2.2 約束條件 三、算法原理:回溯算法3.1 回溯算法概述3.2 八皇后問題的回溯算法實現思路 四、八皇后問題的多語言實現4.1 Python實現4.2 C實現4.3 Java實…

Cursor 工具項目構建指南: Python 3.8 環境下的 Prompt Rules 約束

簡簡單單 Online zuozuo: 簡簡單單 Online zuozuo 簡簡單單 Online zuozuo 簡簡單單 Online zuozuo 簡簡單單 Online zuozuo :本心、輸入輸出、結果 簡簡單單 Online zuozuo : 文章目錄 Cursor 工具項目構建指南: Python 3.8 環境下的 Prompt Rules 約束前言項目簡介技術棧…

Java中的阻塞隊列

阻塞隊列是什么? 一、阻塞隊列的核心概念與特性 1.1 阻塞隊列是什么? 簡單來說,阻塞隊列是一種特殊的隊列,它具備普通隊列先進先出(FIFO)的特性,同時還支持兩個額外的重要操作: 當…

v1.0.1版本更新·2025年5月22日發布-優雅草星云物聯網AI智控系統

v1.0.1版本更新2025年5月22日發布-優雅草星云物聯網AI智控系統 開源地址 星云智控官網: 優雅草星云物聯網AI智控軟件-移動端vue: 優雅草星云物聯網AI智控軟件-移動端vue 星云智控PC端開源: 優雅草星云物聯網AI智控軟件-PC端vue: 優雅草星云物聯網AI…

Java-IO流之轉換流詳解

Java-IO流之轉換流詳解 一、轉換流概述1.1 什么是轉換流1.2 轉換流的作用1.3 轉換流的位置 二、InputStreamReader詳解2.1 基本概念2.2 構造函數2.3 核心方法2.4 使用示例:讀取不同編碼的文件 三、OutputStreamWriter詳解3.1 基本概念3.2 構造函數3.3 核心方法3.4 使…

android lifeCycleOwner生命周期

一 Fragment中 viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) 什么時候執行? 讓我分析一下相關問題: 關于 onPause 時的數據更新: viewLifecycleOwner.lifecycleScope.launch {viewLifecycleOwner.repeatOnLifecycle(Lifecycle.Sta…

Liunx進程替換

文章目錄 1.進程替換2.替換過程3.替換函數exec3.1命名解釋 4.細說6個exe函數execl函數execvexeclp、execvpexecle、execve 1.進程替換 fork()函數在創建子進程后,子進程如果想要執行一個新的程序,就可以使用進程的程序替換來完成…

【華為云Astro-服務編排】服務編排中圖元的使用與配置

目錄 子服務編排圖元 子服務編排圖元的作用 如何使用子服務編排圖元 腳本圖元 腳本圖元的作用 如何使用腳本圖元 記錄創建圖元 記錄創建圖元的作用 如何使用記錄創建圖元 記錄刪除圖元 記錄刪除圖元的作用 如何使用記錄刪除圖元 記錄查詢圖元 記錄查詢圖元的作用…

SQL Server相關的sql語句

目錄 一、數據定義語言(DDL)1. 創建數據庫2. 修改數據庫3. 刪除數據庫4. 創建表5. 修改表結構6. 刪除表 二、數據操作語言(DML)1. 插入數據2. 更新數據3. 刪除數據 三、數據查詢語言(DQL)1. 基礎查詢2. 去重…

【Hot 100】55. 跳躍游戲

目錄 引言跳躍游戲我的解題 🙋?♂? 作者:海碼007📜 專欄:算法專欄💥 標題:【Hot 100】55. 跳躍游戲?? 寄語:書到用時方恨少,事非經過不知難! 引言 跳躍游戲 &#x…

基于51單片機的車內防窒息檢測報警系統

目錄 具體實現功能 設計介紹 資料內容 全部內容 資料獲取 具體實現功能 具體實現功能: (1)檢測車內溫度及二氧化碳濃度并用lcd1602實時顯示。 (2)當人體紅外傳感器檢測到車內有人,且溫度或二氧化碳濃度…

關于智能體API參考接口

關于智能體在Flask的源碼:請求體(在payload里的是請求體)、請求頭(在headers里的i局勢請求頭)。 我的例子: 我的疑問:為什么沒按Coze官方API文檔格式,在Apifox里發POST請求卻能收到回復? 1. 你…

Excel 批量下載PDF、批量下載考勤圖片——仙盟創夢IDE

在辦公場景中,借助應用軟件實現 Excel 批量處理考勤圖片、電子文檔與 PDF,具有諸多顯著優勢。 從考勤圖片處理來看,通過 Excel 批量操作,能快速提取圖片中的考勤信息,如員工打卡時間、面部識別數據等,節省…