Linux進程管理:(二)進程調度原語

文章說明:

  • Linux內核版本:5.0

  • 架構:ARM64

  • 參考資料及圖片來源:《奔跑吧Linux內核》

  • Linux 5.0內核源碼注釋倉庫地址:

    zhangzihengya/LinuxSourceCode_v5.0_study (github.com)

進程調度的概念比較簡單,假設在一個單核處理器的系統中,同一時刻只有一個進程可以擁有處理器資源,那么其他的進程只能在就緒隊列(runqueue)中等待,等到處理器空閑了之后才有機會獲取處理器資源來運行。在這種場景下,操作系統就需要從眾多的就緒進程中選擇—個最合適的進程來運行,這個就是進程調度器(scheduler)要做的事情。調度器產生的最主要原因是提高處理器的利用率(CPUutilization)

1. 進程優先級和權重

Linux操作系統最早采用nice值來調整進程的優先級。nice值的思想是要對其他進程友好,降低優先級來支持其他進程消耗更多的處理器時間,它的范圍是-20~+19,默認值是0。nice值越大,優先級反而越低; nice值越低,優先級越高。nice值-20表示這個進程是非常重要的,優先級最高;而nice值19則表示允許其他進程比這個線程優先享有寶貴的CPU時間,這也是nice值的由來。

內核使用0~139的數值表示進程的優先級,數值越小,優先級越高。優先級0-99給實時進程使用, 100-139給普通進程使用。另外,在用戶空間中有一個傳統的變量nice,它用于映射普通進程的優先級,即100-139。

優先級在Linux內核中的劃分方式如下:

  • 普通進程的優先級:100~139
  • 實時進程的優先級:0~99
  • deadline進程的優先級:-1

task_struct 數據結構中使用4個成員描述進程的優先級:

struct task_struct {...// 動態優先級,是調度類考慮的優先級// 0~139,值越小優先級越高int				prio;// 靜態優先級,在進程啟動時分配。內核不存儲 nice 值,取而代之的是 static_prio// NICE_TO_PRIO 宏可以把nice值轉換成 static_prio// static_prio 不會隨著時間而改變,用戶可以通過 nice 或 sched_setscheduler 等系統調用來修改該值// 100~139,值越小優先級越高int				static_prio;// 基于 static_prio 和調度策略計算出來的優先級,在創建進程時會繼承父進程的 normal_prio// 對于普通進程,normal_prio 等同于 static_prio// 對于實時進程,會根據 rt_priority 重新計算 normal_prio,詳見 effective_prio 函數// 0~139,值越小優先級越高int				normal_prio;// 實時進程的優先級// 0~99,值越大越高unsigned int			rt_priority;...
}

在Linux內核中除了使用優先級來表示進程的輕重緩急之外,在實際調度器里還使用權重的概念來表示進程的優先級。為了計算方便,內核約定nice值為0的進程的權重值為1024,其他nice值對應的進程的權重值可以通過查表的方式來獲取,內核預先計算好了一個表 sched_prio_to_weight[40],表中下標對應nice值[-20~19]。

const int sched_prio_to_weight[40] = {/* -20 */     88761,     71755,     56483,     46273,     36291,/* -15 */     29154,     23254,     18705,     14949,     11916,/* -10 */      9548,      7620,      6100,      4904,      3906,/*  -5 */      3121,      2501,      1991,      1586,      1277,/*   0 */      1024,       820,       655,       526,       423,/*   5 */       335,       272,       215,       172,       137,/*  10 */       110,        87,        70,        56,        45,/*  15 */        36,        29,        23,        18,        15,
};

2. 調度策略

進程調度依賴于調度策略(schedule policy),Linux內核把相同類型的調度策略抽象成調度類 (schedule class)。不同類型的進程采用不同的調度策略,目前Linux內核中默認實現了5種調度類,分別是stop、deadline、realtime、CFS和idle,它們分別使用sched_class來定義,并且通過next指針串聯在—起,如下圖所示:

在這里插入圖片描述

Linux內核支持的5個調度類的異同如下表所示:

在這里插入圖片描述

相應的源碼定義如下:

// 調度策略
// 分時調度策略,非實時進程的默認調度策略,Linux內核沒有實現這類調度策略
#define SCHED_NORMAL		0
// 先進先出調度策略
#define SCHED_FIFO		1
// 循環調度策略,表示優先級相同的進程以循環分享時間的方式來運行
#define SCHED_RR		2
// 批處理調度,這個調度策略表示讓調度器認為該進程是 CPU 消耗型的,因此,調度器對這類進程的喚醒懲罰比較小。
// 在 Linux 內核里,該類調度策略表示使用 CFS
#define SCHED_BATCH		3
/* SCHED_ISO: reserved but not implemented yet */
// 空閑調度策略,用于運行低優先級的任務
#define SCHED_IDLE		5
// 用于調度有嚴格時間要求的實時進程
#define SCHED_DEADLINE		6

3. 調度算法

調度算法時間復雜度算法思想缺點
基于優先級的調度算法O(n)分配給進程時間片,時間片表示進程調度進來與調度出去之間所能持續運行的時間長度分配多長的時間片是一個需要考慮的問題,時間片過長的話會導致交互型的進程得 不到及時響應,時間片過短的話會增大進程切換帶來的處理器消耗
多級反饋隊列算法O(1)把進程按照優先級分成多個隊列,相同優先級的進程在同一個隊列中參數如何確定和優化。如系統需要設計多少個優先級隊列? 時間片應該設置成多少?
基于多級反饋隊列的調度算法O(1)每個CPU各自維護一個屬于自己的就緒隊列,這樣減少了鎖的爭用。就緒隊列由兩個優先級數組組成,即活躍(active)優先級數組和過期(expired)優先級數組,每個優先級數組包含MAX_PRIO(140)個優先級隊列,也就是每個優先級對應一個隊列,活躍優先級數組中所有進程用完了時間片之后,活躍優先級數組和過期優先級數組會進行互換
CFSO(1)CFS拋棄以前固定時間片和固定調度周期的算法,而采用進程權重值的比例來量化和計算實際運行時間。引入虛擬時間(vmntime)的概念,每個進程的虛擬時間是實際運行時間相對于nice值為0的進程的權重的比值。CFS總是選擇虛擬時間最短的進程

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

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

相關文章

Java學習筆記NO.17

T1&#xff1a;合并兩個排序好的整數數組 import java.util.Arrays;public class MergeSortedArrays {public static int[] mergeArrays(int[] arr1, int[] arr2) {int[] result new int[arr1.length arr2.length];int i 0, j 0, k 0;while (i < arr1.length &&am…

一個簡單的iOS天氣應用程序源碼

創建一個簡單的iOS天氣應用程序涉及到多個步驟&#xff0c;包括設置項目、編寫代碼和使用外部API。由于篇幅限制&#xff0c;我將提供一個基礎的示例&#xff0c;這個例子會展示如何創建一個簡單的UI&#xff0c;獲取用戶的當前位置&#xff0c;并從OpenWeatherMap API獲取天氣…

QPS 提升 10 倍!滴滴借助 StarRocks 物化視圖實現低成本精確去重

作者&#xff1a;滴滴 OLAP 開發工程師 劉雨飛 小編導讀&#xff1a; 滴滴于 2022 年引入了 StarRocks。經過一年多的努力&#xff0c;StarRocks 逐漸替代了原有技術棧&#xff0c;成為滴滴內部主要的 OLAP 引擎。截至 2023 年 12 月&#xff0c;滴滴已經成功建立了超過 40 個 …

Cesium插件系列——3dtiles壓平

本系列為自己基于cesium寫的一套插件具體實現。 這里是根據Cesium提供的CustomShader來實現的。 在CustomShader的vertexShaderText里&#xff0c;需要定義vertexMain函數&#xff0c;例如下&#xff1a; struct VertexInput {Attributes attributes;FeatureIds featureIds;…

LVGL常用部件使用總結之圖片部件

圖片部件可用于顯示圖片&#xff0c;圖片源可以是 C 語言數組格式的文件、二進制的.bin 文件以及圖標字體。值得注意的是&#xff0c;圖片部件要顯示 BMP、JPEG 等格式的圖片&#xff0c;則必須經過解碼。 圖片部件的組成部分僅有一個&#xff1a;主體&#xff08;LV_PART_MAIN…

URI到底是個啥

URI是統一資源標識符&#xff08;Uniform Resource Identifier&#xff09;&#xff0c;URL是統一資源定位符&#xff08;Uniform Resource Locator&#xff09;。 具體如何標記和區分服務器上的資源用的其實就是URI&#xff0c;因為其經常出現在瀏覽器的地址欄里&#xff0c;…

Verilog(未完待續)

Verilog教程 這個教程寫的很好&#xff0c;可以多看看。本篇還沒整理完。 一、Verilog簡介 什么是FPGA&#xff1f;一種可通過編程來修改其邏輯功能的數字集成電路&#xff08;芯片&#xff09; 與單片機的區別&#xff1f;對單片機編程并不改變其地電路的內部結構&#xff0…

Parallel Computing - 一文講懂并行計算

目錄 Throughput/LatencySerial ComputingParallel ComputingTypes of parallel computersSimple 4-width SIMDAmdahls lawTypes of parallelism**Data Parallel Model**Task parallel PartitioningDomain DecompositionFunctional Decomposition CommunicationsExample that d…

java調用chatgpt接口,實現專屬于自己的人工智能助手

文章目錄 前言導包基本說明請求參數響應參數創建請求和響應的VO類 代碼編寫使用最后說明 前言 今天突然突發奇想&#xff0c;就想要用java來調用chatget的接口&#xff0c;實現自己的聊天機器人&#xff0c;但是網上找文章&#xff0c;屬實是少的可憐(可能是不讓發吧)。找到了…

ESP32 web 對接華為云平臺--MQTT協議

文章目錄 前言一、MQTT協議二、如何使用MQTT協議對接華為云1.注冊華為云賬號2.設備接入中創建資源空間3.如何連接4.通過MQTT.fx工具做初步對接4.1 設置連接信息4.2 連接平臺 5.查看平臺設備信息 三. 設備測對接平臺1.ESP測引入MQTT庫2.編碼2.1前端編碼修改2.2 后端接口修改 3.M…

element-plus+vue3表單含圖片(可預覽)(線上圖片)

一、要實現的效果&#xff1a; 二、如果期間出現這樣的效果&#xff08;表格穿透過來了&#xff09;&#xff0c;加上了這行代碼就可以了&#xff1a; preview-teleported“true” 如果僅測試用&#xff0c;建議使用線上圖片鏈接的形式&#xff0c;免得本地地址不生效&#xf…

SSH 的兩種認證方式

SSH&#xff08;Secure Shell&#xff09;提供了幾種不同的認證方式&#xff0c;其中兩種最常見的方式是密碼認證和密鑰認證。以下是它們的詳細介紹&#xff1a; 密碼認證&#xff1a; 原理&#xff1a;用戶在連接時輸入用戶名和密碼&#xff0c;然后將密碼傳輸到遠程服務器進行…

數學實驗-Matlab使用(1)

使用方法以及筆記均在文件中 class1_func1.m function f class1_func1(x) % f為輸出&#xff0c;輸出有多個時需要用中括號以矩陣的方式包起來 % x為輸入f sin(x)class1_func2.m function [a,b,u,v] class1_func2(x,y)[a,b] eig(x)[u,v] eig(y)class1.m % 當語句后有…

yolov9從頭開始訓練

yolov9從頭開始訓練 一、準備數據集 數據集相關文件存放布局如下 yolov9-datasets ├── train │ ├── images │ │ ├── image.jpg │ │ ├── │ └── labels │ ├── image.txt │ ├── ├── valid │ ├── images │ │ ├── image.jpg │ │ ├─…

吳恩達deeplearning.ai:模型選擇交叉驗證測試集的訓練方法

以下內容有任何不理解可以翻看我之前的博客哦&#xff1a;吳恩達deeplearning.ai專欄 在上一節中&#xff0c;我們了解了如何利用測試集來評估模型性能。今天我們來進一步完善這個想法&#xff0c;讓你使用該技術自動選擇一個更好的模型。 文章目錄 模型選擇交叉驗證 Cross Va…

SpringBoot 框架(上)

SpringBoot SpringBoot概述依賴管理自動配置SpringBoot 注解使用ConfigurationImport(value {Cat.class,Dog.class})ImportResource(locations "classpath:beans.xml") yaml 標記語言概述基本語法數據類型字面量對象數組 使用細節 Rest 風格請求處理概述注意事項 接…

vue2 開發記錄

el-select 如何修改選擇項的樣式/el-select-dropdown__item 文字上下顯示 測試代碼 <div stylemargin-left: 100px><!-- 測試代碼--><el-select filterablesizemini><div classxxx-el-select><el-optionv-foritem in [{key:1,des:2,…

AVT Prosilica GC Vision Cameras 相機視覺說明使用安裝。具體詳情內容可參看PDF目錄內容。

AVT Prosilica GC Vision Cameras 相機視覺說明使用安裝。具體詳情內容可參看PDF目錄內容。

TikTok矩陣系統功能怎么寫?常用源代碼是什么?

TikTok矩陣系統的功能是如何編寫的?又有哪些常用的源代碼支撐這些功能呢?本文將通過五段源代碼的分享&#xff0c;為大家揭開TikTok矩陣系統的神秘面紗。 一、TikTok矩陣系統的核心功能 TikTok的矩陣系統涵蓋了多個核心功能&#xff0c;包括但不限于用戶管理、內容分發、推…

【接口測試】HTTP協議介紹

目錄 介紹 HTTP狀態碼 HTTP報文 請求方法 HTTP版本 HTTP標頭 通用標頭 請求標頭 響應標頭 get 編碼 post 編碼 RESTful風格 HTTPS 絕大多數的Web服務接口都是基于HTTP協議進行通信的&#xff0c;包括RESTful API和SOAP等。了解HTTP協議可以幫助測試人員理解接口的…