【Linux】進程優先級與進程切換理解

🌟🌟作者主頁:ephemerals__

🌟🌟所屬專欄:Linux

目錄

前言

一、進程優先級

1. 什么是進程優先級

2. 為什么有進程優先級

3. 進程優先級的作用

4. Linux進程優先級的本質

5. 修改進程優先級

二、進程切換

1. 概念?

2. 進程切換的過程

3. 進程切換的意義

4. Linux的進程調度(O(1)調度算法)

總結


前言

? ? ? ? 本篇文章我們在了解了進程概念和狀態等基礎知識之上,繼續學習進程的優先級,以及進程切換相關知識。

正文開始

一、進程優先級

1. 什么是進程優先級

????????進程優先級是操作系統分配給進程的一種“權重”或“級別”,用來決定在多個進程同時競爭 CPU 資源時,哪一個進程先獲得運行的機會。優先級高的進程會被優先調度執行,低優先級的進程則可能需要等待。?

2. 為什么有進程優先級

? ? ? ? 大多數情況下,正在執行的程序數量是比較多的,而CPU資源有限為了使那些重要、急需執行的任務先執行,就有了優先級。這樣一來,資源分配會得到優化,整個系統更加合理高效。

注:現代操作系統更加考慮進程獲取資源的公平性,優先級的差距不會太大。

3. 進程優先級的作用

? ? ? ? 進程優先級可以保證關鍵任務或實時任務及時調度(如操作系統內核進程通常優先級較高),并且可以防止某個進程長期占用 CPU,改善系統性能。其次,優先級可以實現多用戶或多任務下的公平資源分配

4. Linux進程優先級的本質

? ? ? ? 在Linux下,進程優先級的本質就是一個整數,存儲在task_struct結構體當中,直接影響了進程調度的先后順序。進程優先級的值越小,優先級越高

可以使用以下命令查看到當前所有進程的優先級:

ps -al

運行結果:

PRI:進程優先級的值,默認是80

NI:也叫做nice值,是進程優先級的修正數據。其取值范圍是[-20, 19]

PRI的默認值(80) 和 NI 之和表示進程的真實優先級大小。也就是說,Linux進程優先級的范圍是[60, 99],一共40個。

注:ps -l指令還可以看到當前進程的PID,父進程ID等。其中還有一項UID,它用來標識Linux下的用戶,進行用戶區分。當用戶創建進程時,進程會記錄用戶的UID,訪問文件時(本質是進程在訪問),進程就拿這個UID與文件的擁有者或所屬組的UID進行對比。

5. 修改進程優先級

? ? ? ? 在Linux下,修改進程優先級主要是通過修改nice值來完成(注意nice值的取值范圍)。可以使用top命令修改進程優先級:

輸入top --> 按“ r ” --> 輸入進程的PID --> 輸入新的nice值

注意:普通用戶只能給自己的進程設置優先級,且只能將優先級調低(nice值調高);而root用戶可以在取值范圍內隨意調整任意進程的優先級。?

?接下來我們嘗試調整一個進程process的優先級:

process的源碼:

#include <stdio.h>
#include <unistd.h>int main()
{while(1){sleep(1);printf("hello\n");}return 0;
}

首先運行process,查看process的優先級:

可以看到process的優先級是80。接下來將nice修改為10:

這里process的PRI變成了90,而nice值為10。此時90是process的真實優先級。?

如果修改為-10:

可以看到,普通用戶下,將nice值調低是不被允許的。

如果改為100:

由于取值范圍的限制,nice值最高為19,輸入100只能將其改為19。

注意:如果優先級設置不合理,就會導致優先級低的進程長時間獲取不到CPU資源,導致進程饑餓。

二、進程切換

1. 概念?

? ? ? ? CPU在執行一個進程時,由于還有其他進程的存在,它不會一次將所有代碼全部跑完,而是跑一會后,轉而去執行其他進程,再來執行當前進程......這樣才可以在一段時間之內使得多個進程都有所推進。CPU從執行當前進程變為執行其他進程的過程叫做進程切換

當代操作系統都是分時的,每個進程都有它相應的時間片(本質就是一個計時器)。當前進程的時間片用完后,就會切換到其他進程。

2. 進程切換的過程

????????一個進程在CPU上運行到時間片結束之后,首先存儲自己執行位置的上下文數據到自己的TSS(任務狀態段,存儲在task_struct當中)當中,然后將進程重新放入調度隊列隊尾。進程發生切換時,將新的進程的TSS中的數據拷貝(恢復)到CPU的對應寄存器中,繼續執行。?

進程的上下文數據指的是進程在運行時,需要保存和恢復的所有關鍵信息(例如發生切換時CPU寄存器中的數據),這樣就可以保證進程發生一系列切換后,重新執行該進程時,能從原來的狀態繼續執行。

3. 進程切換的意義

????????進程切換讓操作系統能管理多個進程,保證各進程能按照優先級獲得CPU使用權,是實現多任務的基礎。多個進程可以“輪流”運行,系統利用率和響應速度得以提高。

4. Linux的進程調度(O(1)調度算法)

????????高效的進程切換不僅保證了多任務系統的流暢運行,還直接影響著系統的響應速度與整體性能。為了實現快速、合理的進程調度,Linux內核采用了多種調度算法,其中O(1)調度器就是在2.6版本中所引入的一種重要算法。接下來,我們將深入了解O(1)調度算法,看看它是如何實現對大量進程的高效管理的。

? ? ? ? 在之前的文章中,我們提到過一個CPU維護一個進程調度隊列,該隊列中存放著一個個PCB,等待CPU對它們進行調度。實際上這個“進程調度隊列”遠遠比傳統的隊列復雜。在Linux中,進程調度隊列叫做runqueue,它的結構如圖所示:

一個CPU維護一個運行隊列runqueue,其中數組prio_array_t中的queue是存放進程PCB的關鍵。

queue本質是一個鏈地址法的哈希表,其中有140個哈希桶(前100個哈希桶表示實時優先級,剩余40個剛好對應40種優先級,所以哈希桶的下標 - 40就是進程優先級),相同優先級的進程task_struct存放在同一個哈希桶中,這樣,當需要調度時,按照下標小到大的順序掃描每一個哈希桶,先訪問到的進程就是優先級高的(因為優先級的值越小,優先級越高),然后拿出桶中的task_struct進行調度。

考慮到每次都要遍歷140個哈希桶,效率較低,所以有一個位圖bitmap,位圖中有5個32位的整形變量,加起來一共160位,其中的140位表示對應的哈希桶中是否有task_struct,所以可以直接判斷哪一位是“1”,就表示哪一個桶需要被訪問。除此之外,還有一個變量nr_active,表示整個哈希表中的元素個數,對應正在運行時的進程個數。

queuebitmapnr_active共同構成一個結構體,叫做rqueue_elem。

如此,訪問位圖,按順序找到存在元素的哈希桶,進行調度,整個調度過程效率就能達到O(1)。?

但是圖中的prio_array_t數組有兩個元素,也就是說有兩張哈希表,這是為什么呢?這就要從進程切換的角度開始談起了。

試想,如果只有一張哈希表,那么發生進程切換時會怎么樣?

假設第100個哈希桶當中有3個進程,第一個進程的時間片耗盡后,會發生進程切換,此時按照優先級,只能將它重新插入在當前哈希桶的鏈表尾部,當然,其他兩個進程也是如此。這樣雖然能夠完成這3個進程的輪流調度,但是更低優先級(也就是下標更大的哈希桶)的進程呢?當前哈希桶中只要有元素,CPU就會一直輪流調度當前哈希桶中的進程,而會忽略優先級更低的進程,導致進程饑餓。要調度優先級更低的進程,就必須等待當前優先級的進程全部調度完畢,顯然是不合理的,極大地損失了公平性

因此,前輩們想到了一個巧妙的方法:再創建一個相同的結構體rqueue_elem,其中也包含一個queuebitmapnr_active,兩個rqueue_elem構成一個數組prio_array_t[2]

然后創建兩個指針nativeexpired,分別指向prio_array_t[0]和prio_array_t[1],native指向的表示“活躍隊列”;expired指向的表示“過期隊列”。當發生進程切換時,被調度結束的進程會插入到“過期隊列”的對應優先級的哈希桶中,然后繼續訪問“活躍隊列”中的哈希桶,一個個地調度。這樣,當前“活躍隊列”哈希桶中的元素就會越來越少,直到為0,就可以訪問優先級更低的哈希桶......最后所有進程都會被調度,而不是高優先級進程運行完畢后才能調度低優先級進程。

當“活躍隊列”整個哈希表內的進程都被調度過后(此時這些進程應全都位于“過期隊列”對應的哈希桶中),交換native和expired兩個指針的指向,這樣“過期隊列”就變成了“活躍隊列”,就可以開始下一輪的調度了。

如果有新進程出現,會直接插入“過期隊列”當中。此時新進程處于“就緒狀態”,等待一輪的調度結束后,新進程就可以被調度。

總結

? ? ? ? 本篇文章,我們系統地了解了進程優先級的定義、意義以及在Linux下的調整方法,也梳理了進程切換的基本流程與核心作用。從進程優先級到切換機制,再到Linux的O(1)調度算法,這些知識共同揭示了操作系統在多任務管理中的高效與精妙。掌握這些原理,有助于更深入理解和優化 Linux 系統的性能,為后續程序地址空間進程控制的學習打下堅實基礎。如果你覺得博主講的還不錯,就請留下一個小小的贊在走哦,感謝大家的支持???

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

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

相關文章

【Hive入門】Hive高級特性:事務表與ACID特性詳解

目錄 1 Hive事務概述 2 ACID特性詳解 3 Hive事務表的配置與啟用 3.1 啟用Hive事務支持 3.2 創建事務表 4 Hive事務操作流程 5 并發控制與隔離級別 5.1 Hive的鎖機制 5.2 隔離級別 6 Hive事務的限制與優化 6.1 主要限制 6.2 性能優化建議 7 事務表操作示例 7.1 基本…

二叉樹算法精解(Java 實現):從遍歷到高階應用

引言 二叉樹&#xff08;Binary Tree&#xff09;作為算法領域的核心數據結構&#xff0c;在搜索、排序、數據庫索引、編譯器語法樹構建等眾多場景中都有著廣泛應用。無論是初學者夯實算法基礎&#xff0c;還是求職者備戰技術面試&#xff0c;掌握二叉樹相關算法都是不可或缺的…

ES6入門---第二單元 模塊二:關于數組新增

一、擴展運算符。。。 1、可以把ul li轉變為數組 <script>window.onloadfunction (){let aLi document.querySelectorAll(ul li);let arrLi [...aLi];arrLi.pop();arrLi.push(asfasdf);console.log(arrLi);};</script> </head> <body><ul><…

Nature正刊:新型折紙啟發手性超材料,實現多模式獨立驅動,變形超50%!

機械超材料是一種結構化的宏觀結構&#xff0c;其幾何排列方式具有獨特的幾何結構&#xff0c;從而具有獨特的力學性能和變形模式。超材料的宏觀特性取決于中觀尺度晶胞的具體形狀、尺寸和幾何取向。經典的結構化晶胞&#xff0c;例如以拉伸為主的八面體桁架單元和以彎曲為主的…

Servlet(二)

軟件架構 1. C/S 客戶端/服務器端 2. B/S 瀏覽器/服務器端&#xff1a; 客戶端零維護&#xff0c;開發快 資源分類 1. 靜態資源 所有用戶看到相同的部分&#xff0c;如&#xff1a;html,css,js 2. 動態資源 用戶訪問相同資源后得到的結果可能不一致&#xff0c;如&#xff1a;s…

循環緩沖區

# 循環緩沖區 說明 所謂消費&#xff0c;就是數據讀取并刪除。 循環緩沖區這個數據結構與生產者-消費者問題高度適配。 生產者-產生數據&#xff0c;消費者-處理數據&#xff0c;二者速度不一致&#xff0c;因此需要循環緩沖區。 顯然&#xff0c;產生的數據要追加到循環緩…

嵌入式硬件篇---STM32 系列單片機型號命名規則

文章目錄 前言一、STM32 型號命名規則二、具體型號解析1. STM32F103C8T6F103:C:8:T6:典型應用2. STM32F103RCT6F103:R:C:T6:典型應用三、命名規則擴展1. 引腳數與封裝代碼2. Flash 容量代碼3. 溫度范圍代碼四、快速識別技巧性能定位:F1/F4后綴差異硬件設計參考:引腳數…

MySQL 中日期相減的完整指南

MySQL 中日期相減的完整指南 在 MySQL 中&#xff0c;日期相減有幾種不同的方法&#xff0c;具體取決于你想要得到的結果類型&#xff08;天數差、時間差等&#xff09;。 1. 使用 DATEDIFF() 函數&#xff08;返回天數差&#xff09; SELECT DATEDIFF(2023-05-15, 2023-05-…

傳奇各版本迭代時間及內容變化,屠龍/嗜魂法杖/逍遙扇第一次出現的時間和版本

?【早期經典版本】 1.10 三英雄傳說&#xff1a;2001 年 9 月 28 日熱血傳奇正式開啟公測&#xff0c;這是傳奇的第一個版本。游戲中白天與黑夜和現實同步&#xff0c;升級慢&#xff0c;怪物爆率低&#xff0c;玩家需要靠撿垃圾賣金幣維持游戲開銷&#xff0c;遇到高級別法師…

重塑數學邊界:人工智能如何引領數學研究的新紀元

目錄 一、人工智能如何重新定義數學研究的邊界 &#xff08;一&#xff09;數學與AI的關系&#xff1a;從基礎理論到創新思維的回饋 &#xff08;二&#xff09;AI的創造力&#xff1a;突破傳統推理的局限 &#xff08;三&#xff09;AI對數學研究的潛在貢獻&#xff1a;創…

IP偽裝、代理池與分布式爬蟲

一、動態代理IP應用&#xff1a;代理池的獲取、選擇與使用 代理池技術的核心是通過動態切換IP地址&#xff0c;讓爬蟲看起來像不同用戶在訪問網站&#xff0c;從而規避封禁。 &#xff08;一&#xff09;代理池的獲取途徑 1. 免費代理&#xff1a;低成本但高風險 免費代理可…

自然語言處理實戰:用CRF打造高精度命名實體識別系統

## 一、從標簽游戲到智能系統:命名實體識別的前世今生 在信息爆炸的互聯網時代,我們每天面對的海量文本中隱藏著無數有價值的信息。想象一下,當你在瀏覽新聞時,系統能自動標紅所有人名、地點和機構名稱——這就是命名實體識別(NER)技術的魔力。從早期的規則匹配到如今的…

Space Engineers 太空工程師 [DLC 解鎖] [Steam] [Windows]

Space Engineers 太空工程師 [DLC 解鎖] [Steam] [Windows] 需要有游戲正版基礎本體&#xff0c;安裝路徑不能帶有中文&#xff0c;或其它非常規拉丁字符&#xff1b; DLC 版本 至最新全部 DLC 后續可能無法及時更新文章&#xff0c;具體最新版本見下載文件說明 DLC 解鎖列表&…

JVM——JVM 是如何執行方法調用的?

JVM 是如何執行方法調用的&#xff1f; 在 Java 世界的底層運作中&#xff0c;方法調用機制是理解 Java 虛擬機&#xff08;JVM&#xff09;行為的關鍵之一。JVM 作為 Java 程序運行的核心&#xff0c;承擔著執行字節碼、管理內存、調度線程等多項職責。而方法調用作為程序邏輯…

MySQL 數據類型詳解:字符串、數字、日期

MySQL 數據類型詳解&#xff1a;字符串、數字、日期 在 MySQL 中&#xff0c;選擇合適的數據類型對于數據庫的存儲效率和查詢性能至關重要。MySQL 提供了**字符串&#xff08;String&#xff09;、數字&#xff08;Numeric&#xff09;和日期&#xff08;Date & Time&…

題解:P2485 [SDOI2011] 計算器

### 思路 本題是一個比較模板化的題目。 #### 一操作 考慮使用快速冪。 快速冪&#xff0c;只需要把 $k$ 變成二進制即可實現 $\Theta(\log k)$ 的時間復雜度。 實現方法&#xff1a; cpp long long qmi(long long a,long long k,long long p){ long long res 1; …

重新構想E-E-A-T:提升銷售與搜索可見性的SEO策略

在2025年的數字營銷環境中&#xff0c;谷歌的E-E-A-T&#xff08;經驗、專業性、權威性、可信度&#xff09;已成為SEO和內容營銷的核心支柱。傳統的E-E-A-T優化方法通常聚焦于展示作者資質或獲取反向鏈接&#xff0c;但這些策略可能不足以應對AI驅動的搜索和日益挑剔的用戶需求…

JVM 一文詳解

目錄 JVM 簡介 JVM 中的內存區域劃分 1. 堆&#xff08;一個進程只有一份 ------ 線程共享&#xff09; 2. 棧&#xff08;一個進程可以有 N 份 ------ 線程私有&#xff09; Java 虛擬機棧&#xff1a; 本機方法棧&#xff1a; 3. 程序計數器&#xff08;一個線程可以…

小程序與快應用:中國移動互聯網的漸進式革命——卓伊凡的技術演進觀

小程序與快應用&#xff1a;中國移動互聯網的漸進式革命——卓伊凡的技術演進觀 在知乎看到很多&#xff1a;“懂王”發布的要把內行笑瘋了的評論&#xff0c;卓伊凡必須懟一下&#xff0c;真印證那句話&#xff0c;無知者無畏 一、Web與小程序的技術本質差異 1.1 瀏覽器渲染…

[SC]SystemC在GPU/CPU SoC驗證中的應用案例

SystemC在GPU/CPU SoC驗證中的應用案例 摘要:SystemC 是一種基于 C++ 的系統級建模語言,廣泛用于 SoC (System on Chip) 設計的建模和驗證,尤其在 GPU SoC 驗證中,SystemC 可用于模擬硬件模塊、系統行為和性能評估。SystemC 的主要優勢在于支持系統級抽象建模、時序…