單核CPU調度

CPU MLFQ 調度

MLFQ即多級反饋隊列調度。在給定時間片中,任務存在不同優先隊列之中等待被執行,MLFQ根據優先級去決定哪個任務在該時間片執行

Round Robin

Round Robin即RR,是基于時間片的輪詢調度算法。給每個任務分配一個時間片,當任務時間片用完之后,會中斷當前任務,切換到下一個

改變優先級的第一次嘗試

初始規則如下

  1. 若任務A優先級高于任務B,則調度A
  2. 若任務A、B優先級一致,則根據RR調度A、B

根據上述兩條規則,若存在任務C優先級低于A和B,那么C就會一直不被執行,導致饑餓。因此引入第三條規則

第四條規則則是考慮到對于需要高響應的任務多是短執行的,所以會頻繁讓出CPU,因此為了保證響應時間,就保持現有優先級

而對于CPU密集型,則不太需要高響應,所以可以降低優先級

  1. 當新任務到達之后放置最高優先級隊列

  2. 如果任務A運行了一個時間片都沒有主動讓出CPU(比如I/O操作),則優先級降低一級

    如果任務A在時間片用完之前,有主動讓出CPU,則優先級保持不變

在上面的嘗試中仍然存在以下問題

  • 仍然存在饑餓問題。若存在大量短執行任務,就會導致長執行任務無法得到執行
  • 被利用導致某些任務一直處于高優先級。

公平還是公平

為了解決饑餓問題,可以引入一個很簡單的規則

  1. 系統運行S時長后,將所有任務放到最高優先級

這就確保所有的任務都會最終處于一個優先級中,那么所有任務即使是最低優先級的都有可能被調用,所以至少此時,眾生平等

不要被利用

在解決了饑餓問題之后,惡意利用還是存在。

這樣必須對規則4進行改變

  1. 給每個優先級分配一個時間片,當任務用完該優先級的時間片后,優先級降一級

最終塵埃落定

最終規則如下

  1. 若任務A優先級高于任務B,則調度A
  2. 若任務A、B優先級一致,則根據RR調度A、B
  3. 當新任務到達之后放置最高優先級隊列
  4. 給每個優先級分配一個時間片,當任務用完該優先級的時間片后,優先級降一級
  5. 系統運行S時長后,將所有任務放到最高優先級

流程如下

  1. 新進程插入到最高優先隊列尾

  2. 一段時間后,進程到達隊列頭并分配CPU

  3. 如果進程在給定時間片內完成,將離開調度系統

    如果進程自愿放棄CPU執行,則會在再次就緒時,插入原放棄隊列尾部

    如果進程使用所有配額CPU時間,則會被搶占并插入到下一個較低隊列尾部

    低級別隊列CPU配額比高級別隊列低

調度器總是從高級別隊列頭開始選擇進程進行分配,在高級別隊列為空之后,才會接管低級別隊列。

進程在隊列的遷移總是插入到目標隊列尾部,并且進程在給定隊列級別只有一次完成任務的機會,然后就會被下放到較低級別的隊列

Linux CFS調度

CFS代表完全公平的調度器。CFS的設計理念是在真實硬件上實現理想的、精確的多任務CPU。CFS調度器和以往的調度器不同之處在于沒有時間片的概念,而是分配cpu使用時間的比例。例如:2個相同優先級的進程在一個cpu上運行,那么每個進程都將會分配50%的cpu運行時間。這就是要實現的公平

調度類

調度類是表示一種特定的調度策略和算法,定義了如何選擇下一個要運行的任務,如何將任務插入到運行隊列中,以及如何處理任務的喚醒和睡眠等

在Linux內核中有以下調度類

  • CFS調度類(SCHED_NORMAL): 默認的調度類,用于大多數普通的非實時任務。它使用完全公平調度器(CFS)算法,以實現公平和高效的CPU調度
  • 實時調度類: 用于實時任務
    • SCHED_FIFO: 先進先出。
    • SCHED_RR: 處于runqueue中的線程輪流獲取時間片
  • Deadline調度類(SCHED_DEADLINE): 針對有明確截止時間要求的實時任務的調度類。它使用EDF(最早截止時間優先)算法和CBS(恒定帶寬服務器)算法,以確保所有的實時任務都能在截止時間之前完成
  • Idle調度類(SCHED_IDLE): 優先級最低的調度類,只有當系統中沒有其他任何任務需要運行時,才會運行屬于這個調度類的任務。

核心結構

  • vruntime: 表示進程在所有CPU的總執行時間

    v r u n t i m e + = 實際運行時間 ? 1024 / 進程權重 vruntime += 實際運行時間*1024/進程權重 vruntime+=實際運行時間?1024/進程權重

  • runqueue: 每個CPU上的可運行進程隊列

  • 基于時序的紅黑樹: 每個CPU上根據vruntime組織所有進程

CFS調度策略

常規調度分為

  • SCHED_NORMAL: 用于常規任務的調度策略
  • SCHED_BATCH: 運行長,能更好利用緩存,但損失響應性
  • SCHED_IDLE: 并不是一個真正的空閑定時器調度器,以避免優先級反轉問題,防止機器死鎖。

其中CFS屬于SCHED_NORMAL

CFS調度利用紅黑樹優先調度執行總時間更低的,在每次時間片執行完會對執行的進程累加執行時間,并重新選擇最低執行時間的進程進行執行

這也就意味著執行越久,執行優先級越低。那么計算密集型執行優先級低,IO密集型執行優先級高

當然這樣的調度也會使得同一個進程連續執行多次,不過這也不是壞事,畢竟之前用的上下文還能接著用

SCHED_RR與SCHED_NORMAL對比

sched_RRSched_normal
調度進程類型實時進程普通進程
時間片靜態動態。根據系統進程數量變化
下一個進程的選擇從runqueue選擇下一個從紅黑樹選擇vruntime最小的

CPU限額問題

配額機制限制了每個容器的攤銷CPU使用率,但它沒有限制任務在任何給定時刻可以使用多少個內核。相反,如果一個任務“想”在一個配額的時間片上使用更多的內核,它就會在短時間內使用多于配額的內核,然后進入節流狀態,也就是說基本上進入睡眠狀態,以保持它的攤銷內核使用量低于配額,這對于尾延遲來說是災難性的

比如垃圾回收器,可能在一次GC期間,所有這些GC線程將同時運行,迅速耗盡cpu配額,從而導致節流。由此產生的效果是,次秒級的GC暫停可能需要數秒的時間才能完成。

Ref

  1. https://pages.cs.wisc.edu/~remzi/OSTEP/cpu-sched-mlfq.pdf
  2. https://en.wikipedia.org/wiki/Multilevel_feedback_queue
  3. https://github.com/torvalds/linux/blob/v5.10/Documentation/scheduler/sched-design-CFS.rst
  4. https://arthurchiao.art/blog/linux-cfs-design-and-implementation-zh/
  5. https://danluu.com/cgroup-throttling/

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

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

相關文章

pixhawk無人機飛控解鎖

飛控解鎖 GitBook 左手油門的遙控解鎖是油門右下角撥,右手油門是油門最低,方向最右。 飛控如何加鎖? 左手油門:油門左下角 右手油門:油門最低,方向最左 飛控解鎖成功后,不推油門的情況下,…

基于SSM+Vue的物流管理系統

運行截圖 獲取方式 Gitee倉庫

大眾點評全國店鋪基礎信息采集-學習培訓店鋪-2024年5月

2024年5月最新采集大眾點評全國(內地)-學習培訓大類-店鋪基礎信息,93余萬家 學習培訓類店鋪示例: 店鋪id k40VtNBN3bixFJIU 店鋪名稱 夢想鋼琴成人鋼琴(珠江新城總部) 十分制效果評分 9.4 十分制服務評分 9.4 十分制環境評分 9.4 人均價格 1233 …

為什么數據庫字符編碼不一致會導致索引失效

引言 數據庫字符編碼不一致是數據庫管理和優化過程中經常遇到的問題之一,尤其在涉及多語言環境和多應用時更為顯著。本文旨在深入探討字符編碼不匹配如何影響SQL查詢性能,導致索引失效,以及其背后的原理。 1. 字符編碼與索引基礎 字符編碼…

【TypeScript模塊簡介以及使用方法】

TypeScript模塊簡介 TypeScript中的模塊(Modules)是代碼的封裝體,它們可以包含變量、函數、類和接口等。在TypeScript中,模塊可以被其他模塊引用和使用,從而實現代碼的復用和模塊化開發。 TypeScript支持兩種模塊系統…

LORA學習筆記2——訓練集處理

前言 對于ai訓練來說,處理訓練集是模型訓練的重要環節。訓練集的質量對最終模型的質量影響巨大。這里以二次元角色為例,記錄下訓練集處理的流程和一些心得。 素材準備 素材準備有以下幾個需要注意的點: 通常訓練二次元角色需要30張以上的…

14:HAL---CRC校驗

103系列只有一個CRC 前言: CRC(Cyclic Redundancy Check),即循環冗余校驗,是一種根據網絡數據包或電腦文件等數據產生簡短固定位數校核碼的快速算法,主要用來檢測或校核數據傳輸或者保存后可能出現的錯誤。…

QX---mini51單片機學習---(8)8*8點陣屏

目錄 1LED點陣屏簡紹 2 8*8點陣屏電路圖74 3 74HC595芯片 4實踐編程 1LED點陣屏簡紹 2 8*8點陣屏電路圖74 怎么點亮,正極給高負極給低 不能同時靜態顯示,跟數碼管動態顯示一樣,反復橫跳,利用視覺效果 3 74HC595芯片 …

斐波那契數

509. 斐波那契數 斐波那契數 (通常用 F(n) 表示)形成的序列稱為 斐波那契數列 。該數列由 0 和 1 開始,后面的每一項數字都是前面兩項數字的和。也就是: F(0) 0,F(1) 1 F(n) F(n - 1) F(n - 2),其中 …

第四屆上海理工大學程序設計全國挑戰賽---昨日方舟

知識點:模擬 題目描述 《昨日方舟》是一款塔防類游戲。在游戲中,我們要通過部署角色來抵御怪物的入侵。在這款游戲中,有一名角色名字為 “今”,他的能力為能夠在地圖上部署小蛇,小蛇在某些條件下可以與其他小蛇合體…

關于 IIS 開啟匿名訪問網站仍要賬號密碼登錄網站的解決方法

歡迎關注公總號【云邊小網安】 問題提出:發現雖然勾選了允許匿名訪問網站,但在訪問某一網站的時候仍然需要登錄賬號密碼 解決方法一:登錄管理員賬號密碼解決方法二:添加訪問網站文件夾的用戶 訪問某一網站本質上來講&#xff0…

C++入門必讀-Qt的安裝與配置

QT簡介 Qt是一個跨平臺的C圖形用戶界面應用程序框架。它為應用程序開發者提供建立圖形界面所需的所有功能。它是完全面向對象的,很容易擴展,并且允許真正的組件編程。 QT下載 訪問下載網站: Index of /archive/qt 安裝編譯器 QT安裝 建議安裝之前將網絡斷…

1064 朋友數

solution 給出n個整數&#xff0c;統計可能的位數和&#xff0c;并按升序輸出&#xff08;考慮用set實現&#xff09; #include<iostream> #include<set> using namespace std; int main(){set<int> st;int n, x, sum;scanf("%d", &n);while…

前端Vue架構

1 理解&#xff1a; 創建視圖的函數&#xff08;render&#xff09;和數據之間的關聯&#xff1b; 當數據發生變化的時候&#xff0c;希望render重新執行&#xff1b; 監聽數據的讀取和修改&#xff1b; defineProperty&#xff1a;監聽范圍比較窄&#xff0c;只能通過屬性描…

Docker 直接運行一個 Alpine 鏡像

由于鏡像很小&#xff0c;下載時間往往很短&#xff0c;讀者可以直接使用 docker run 指令直接運行一個 Alpine 容器&#xff0c;并指定運行的 Linux 指令&#xff0c;例如&#xff1a; PS C:\Users\yhu> docker run alpine echo 123 Unable to find image alpine:latest lo…

Commit failed (details follow):is out of date

Commit failed (details follow):is out of date 關于SVN提交時報out-of-date錯誤的解決方法 提交項目文件時&#xff0c;報如下的信息&#xff1a; Item is out-of-date svn: Commit failed (details follow): svn: Item ‘/xxx/xxx/xxx/xxx/xxx/xxx’ is out of date 原因&…

手寫Spring5【筆記】

Spring5【筆記】 前言前言推薦Spring5【筆記】1介紹2手寫 最后 前言 這是陳舊已久的草稿2022-12-01 23:32:59 這個是刷B站的時候&#xff0c;看到一個手寫Spring的課程。 最后我自己好像運行不了&#xff0c;就沒寫。 現在2024-5-12 22:22:46&#xff0c;發布到[筆記]專欄中…

隊列(詳解)

一.隊列的概念 隊列&#xff08;Queue&#xff09;是一種常見的數據結構&#xff0c;它按照先進先出的原則管理數據。這意味著最先進入隊列的元素將被最先移出隊列&#xff0c;類似于現實生活中排隊的場景。 在隊列中&#xff0c;數據項被添加到隊列的一端&#xff0c;稱為隊尾…

cmu15445 2023fall project3 詳細過程(下)QUERY EXECUTION

QUERY EXECUTION task3/task4 Task #3 - HashJoin Executor and Optimization1、HashJoin1.1 思路1.2 代碼 2 NestedLoopJoin優化為HashJoin2.1 思路2.2 代碼 Task #4 Sort Limit Executors Top-N Optimization Window Functions1、Sort1.1 思路1.2 代碼 2、Limit Executors2…

數據可視化第五天(讀取文件獲得男生女生身高信息,并且可視化在一個圖像)

文件 需要學生文件的可以私信我 過程 利用numpy的loadtxt文件讀取學號&#xff0c;性別&#xff0c;和身高。 import numpy as np import matplotlib.pyplot as pltfilename/Users/oommnn/Desktop/python學習/數據分析/網課資料/第04天/student-data.txtuser_infonp.dtype(…