Linux --進程優先級

概念

? 什么是進程優先級,為什么需要進程優先級,怎么做到進程優先級這是本文需要解釋清楚的。

? 優先級的本質其實就是排隊,為了去爭奪有限的資源,比如cpu的調度。cpu資源分配的先后性就是指進程的優先級。優先級高的進程有優先執行的,配置進程優先級對多任務環境的Linux很有用,可以改善系統的性能。在Linux中進程的PCB也就是task_struct中優先級屬性是有幾個int類型的數字來表示的,數字越小優先級越高。這里我們可以查看一個進程的優先級和修改。我們用ps -l指令可以看到以下幾個數據

UID : 代表執?者的?份
PID : 代表這個進程的代號
PPID :代表這個進程是由哪個進程發展衍??來的,亦即?進程的代號
PRI :代表這個進程可被執?的優先級,其值越?越早被執?
NI :代表這個進程的nice值
??
? PRI也還是?較好理解的,即進程的優先級,或者通俗點說就是程序被CPU執?的先后順序,此
值越?進程的優先級別越? 。 那NI呢?就是我們所要說的nice值了,其表?進程可被執?的優先級的修正數值 PRI值越?越快被執?,那么加?nice值后,將會使得PRI變為:PRI(new)=PRI(old)+nice 這樣,當nice值為負值的時候,那么該程序將會優先級值將變?,即其優先級會變?,則其越快被執?所以,調整進程優先級,在Linux下,就是調整進程nice值 nice其取值范圍是-20?19,?共40個級別。這里的PRY(old)其實是默認初始PRI的意思。
? ?top命令更改已存在進程的nice: top,進?top后按“r”?>輸?進程PID?>輸?nice值

??

? 這里可以看到,PRI為39 NI值為19,這是我修改以后的數值,原本是PRI 20 NI 0,即使我輸入修改100但是最后值修改了19,說明修改NI值是有范圍的?,這是為了進程調度盡量公平,不會出現個別極端進程,為什么是在這40的范圍內后續我們會講到。

進程切換

? 有了優先級就是為了在進程切換的時候進行排序,那么什么是進程切換?進程切換的核心其實就是保存上下文數據恢復上下文數據,那么什么是上下文數據,容我慢慢敘說。一個進程被被cpu調度的時候,此時它的PCB就是現在調度隊列的當前節點,在CPU內部有一套寄存器來儲存代碼和數據,其中的eip來儲存當前執行指令的下一地址,ir存儲的是當前需要執行的指令,控制器先ir讀指令執行,執行完畢又會反饋給eip寄存器。此時儲存在寄存器中的代碼和數據就是上下文數據。當前進程的時間片到了即將被切換的時候,它會將上下文數據儲存到PCB中的一個tss_struct結構體中,方便下次切換回來的時候能夠知道上一次運行到了哪里,恢復寄存器中的數據,每個程序在進程切換的時候都需要做這個事情,因為寄存器只有一套,這種行為是對進程代碼數據運行的一種保護,如果不做保護就無法進行調度與切換。

? 這里可以參考Linux0.11的內核代碼發現上下文數據確實是保存在tss之中,但是在現在的內核中由于保護算法已經過于復雜了,沒有十章八章難以敘述,所以而且不方便觀察

Linux真實調度算法

? 說了這么多優先級的本質還是為了更好的了解Lniux調度算法。這個算法并不是簡單的FIFO調度,cpu在調度進程時會在一個runqueue結構體中選擇需要調度的進程,這個runqueue主要由一個有兩個元素queue結構體數組,兩個指向queue結構體數組的指針,*active和*expored即活躍的和過期的,以下用示意圖說明。

??

? 我們可以看到這這兩個數組的元素的結構體時由一個int 類型的nr_active,和一個有五個元素int類型的bitmap數組組成的。*active和*expored指針分別指向這兩個數組元素,cpu調度時只會從活躍指針這個結構體中的queue隊列來調度進程,這個隊列通常前一百位是不用的,而后四十位就是對應我們上面所提到的優先級范圍,40這個范圍就是因為隊列中只有四十個位置是儲存進程的。這個隊列每個元素下又掛著一個哈希桶,所以每個相同優先級的進程都會被掛在同一個桶中,調度的時候按照隊列先進先出的規則被調度,當這個優先級桶的元素空了cpu才會調度下一個優先級的進程。其中這里的nr_active是一個計數器,記錄當前隊列中還有多少個進程,bitmap是為了提高cpu調度效率而存在的,它用5*32個比特位來表示當前調度queue隊列中哪個優先級有進程再去這個地方調度進程,而不是進行遍歷隊列查找再調度。過期隊列上放置的進程,都是時間?耗盡的進程和新插入的進程,當活動隊列上的進程都被處理完畢之后,對過期隊列的進程進?時間?重新計算。active指針永遠指向活動隊列,?expired指針永遠指向過期隊列, 可是活動隊列上的進程會越來越少,過期隊列上的進程會越來越多,因為進程時間?到期時?直都存在的,所以在合適的時候交換active指針和expired指針的內容,就相當于有具有了?批新的活動進程。這個合適的時候就是當活躍進程nr_active計數器為0的時候,此時兩個兩個隊列就會被調換開始新一輪的調度。注意結束的進程是不會進入過期隊列的,而是會被父進程接管并釋放。

? ?在系統當中查找?個最合適調度的進程的時間復雜度是?個常數,不隨著進程增多?導致時間成 本增加,我們稱之為進程調度O(1)算法!Linux中的內核調度算法就是進程調度O(1)算法。

? 順便提到一點Linux中的task_struct中的鏈式結構并不是和普通雙鏈表那樣將節點和屬性放在一起,它的鏈表節點中只有next節點和prev節點,然后在task_struct中和其他屬性一起儲存。這樣做的好處是能夠讓一個task_struct在多個隊列(調度和阻塞)中存在,而不需要將相同的進程屬性放在不同的鏈表之中再鏈接。如圖所示

?

補充?

? 那么有的同學會問了只有鏈表節點如何訪問數據,每個數據類型的偏移量相對于結構體指針是固定的,我們可以通過鏈表節點的地址和偏移量來找到當前結構體指針再訪問其他的數據。我們可以通過offseto這個宏來獲得該成員相對于0地址的偏移。

#define offsetof(type, member) ((size_t)&(((type *)0)->member))

這里有一個代碼可以方便大家理解具體過程

#include <iostream>#define offsetof(type, member) ((size_t)&(((type *)0)->member))
using namespace std;int main()
{struct A{int a;int b;float c;double d;};A instanceA; // Renamed variable to avoid conflict with struct namecout << " 結構體A的地址 : " << &instanceA << endl;cout << " 成員a的地址  :" << &instanceA.a << " 偏移量 :" << offsetof(A, a) << endl;cout << " 成員b的地址  :" << &instanceA.b << " 偏移量 :" << offsetof(A, b) << endl;cout << " 成員c的地址  :" << &instanceA.c << " 偏移量 :" << offsetof(A, c) << endl;cout << " 成員d的地址  :" << &instanceA.d << " 偏移量 :" << offsetof(A, d) << endl;return 0;
}

? 我們可以看到兩次運行的各個成員地址都不一樣,但是偏移量都是相同的?

? 然后我們就可以通過這樣的方法來找到對象本身從而訪問其他的數據

int main() {A instanceA;int* pB = &instanceA.b;A* pStruct = (A*)((char*)pB - offsetof(A, b));cout << "instanceA 地址: " << &instanceA << endl;cout << "通過成員b地址和偏移量得到的結構體地址: " << pStruct << endl;return 0;
}

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

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

相關文章

React 性能監控與錯誤上報

核心問題與技術挑戰 現代 React 應用隨著業務復雜度增加&#xff0c;性能問題和運行時錯誤日益成為影響用戶體驗的關鍵因素。沒有可靠的監控與錯誤上報機制&#xff0c;我們將陷入被動修復而非主動預防的困境。 性能指標體系與錯誤分類 關鍵性能指標定義 // performance-me…

芒果深度學習檢測:開啟農業新視界(貓臉碼客第230期)

芒果深度學習檢測&#xff1a;開啟農業新視界 一、引言 芒果作為熱帶水果中的“明星”&#xff0c;在全球水果市場占據著重要地位&#xff0c;擁有廣泛的市場需求和可觀的經濟價值。伴隨人們生活品質的提升&#xff0c;對芒果品質的要求也愈發嚴苛。芒果產業規模持續擴張&#…

PDF文件轉換之輸出指定頁到新的 PDF 文件

背景 一份 PDF 學習資料需要打印其中某幾頁&#xff0c;文件有幾百兆&#xff0c;看到 WPS 有PDF拆分功能&#xff0c;但是需要會員&#xff0c;開了一個月會員后完成了轉換。突然想到&#xff0c;會員到期后如果還要拆解的話&#xff0c;怎么辦呢&#xff1f;PDF 文件拆解功能…

【計網】SW、GBN、SR、TCP

目錄 三種可靠傳輸機制&#xff08;數據鏈路層&#xff09; 停止-等待&#xff08;Stop and Wait&#xff0c;SW&#xff09;協議 回退N幀&#xff08;Go-back-N&#xff0c;GBN&#xff09;協議 選擇重傳&#xff08;Selective Repeat&#xff0c;SR&#xff09;協議 傳輸…

Go的隱式接口機制

正確使用Interface 不要照使用C/Java等OOP語言中接口的方式去使用interface。 Go的Interface的抽象不僅可以用于dynamic-dispatch 在工程上、它最大的作用是&#xff1a;隔離實現和抽象、實現完全的dependency inversion 以及interface segregation(SOLID principle中的I和D)。…

Async-profiler 內存采樣機制解析:從原理到實現

引言 在 Java 性能調優的工具箱中&#xff0c;async-profiler 是一款備受青睞的低開銷采樣分析器。它不僅能分析 CPU 熱點&#xff0c;還能精確追蹤內存分配情況。本文將深入探討 async-profiler 實現內存采樣的多種機制&#xff0c;結合代碼示例解析其工作原理。 為什么需要內…

Android 顏色百分比對照

本文就是簡單寫個demo,打印下顏色百分比的數值.方便以后使用. 1: 獲取透明色 具體的代碼如下: /*** 獲取透明色* param percent* param red* param green* param blue* return*/public static int getTransparentColor(int percent, int red, int green, int blue) {int alp…

MPLS-EVPN筆記詳述

目錄 EVPN簡介: EVPN路由: 基本四種EVPN路由 擴展: EVPN工作流程: 1.啟動階段: 2.流量轉發: 路由次序整理: 總結: EVPN基本術語: EVPN表項: EVPN支持的多種服務模式: 簡介: 1.Port Based: 簡介: 配置實現: 2.VLAN Based: 簡介: 配置實現: 3.VLAN Bundle: 簡…

SpringBoot自定義線程池詳細教程

文章目錄 1. 線程池基礎概念1.1 什么是線程池1.2 Java線程池核心參數1.3 線程池執行流程 2. SpringBoot中的線程池2.1 SpringBoot默認線程池2.2 SpringBoot異步任務基礎 3. 自定義線程池配置3.1 配置文件方式3.2 Java配置方式3.3 線程池工廠配置 4. 異步任務實際應用4.1 業務服…

智能快遞地址解析接口如何用PHP調用?

一、什么是智能快遞地址解析接口 隨著互聯網技術的普及和電子商務的迅猛發展&#xff0c;網購已成為現代人日常生活的重要組成部分。然而&#xff0c;在這個便捷的背后&#xff0c;一個看似不起眼卻影響深遠的問題正悄然浮現——用戶填寫的快遞地址格式混亂、信息不全甚至錯漏…

概率分布,支撐AI算法的數學基石

概率分布,是現代人工智能(AI)算法不可或缺的數學語言。它不僅描述了數據中的不確定性,更揭示了機器學習模型背后的本質運作機制。本文將帶你深入了解概率分布的數學本質,以及它在監督學習、深度學習、生成模型等核心AI領域的關鍵作用,揭秘概率論如何成為AI理論和實踐的強…

2025年Splunk的替代方案:更智能的安全選擇

在安全信息和事件管理&#xff08;SIEM&#xff09;領域&#xff0c;2025年的競爭愈發激烈。Splunk憑借其強大的功能和穩定性長期占據市場主導地位&#xff0c;但其高昂的成本、復雜性和擴展性挑戰促使許多企業轉向其他解決方案。無論是初創公司、快速發展的中型企業&#xff0…

(10)Fiddler抓包-Fiddler如何設置捕獲Firefox瀏覽器的Https會話

1.簡介 經過上一篇對Fiddler的配置后&#xff0c;絕大多數的Https的會話&#xff0c;我們可以成功捕獲抓取到&#xff0c;但是有些版本的Firefox瀏覽器仍然是捕獲不到其的Https會話&#xff0c;需要我們更進一步的配置才能捕獲到會話進行抓包。 2.環境 1.環境是Windows 10版…

simulink mask的使用技巧

1.mask界面布局 1.1如何調整控件的位置和控件大小&#xff1f; 反正2020a是調不了&#xff0c; 找了好久&#xff0c;只能是調布局&#xff0c;例如你要調成下面這樣&#xff1a; 第一個控件的iTem location屬性選擇New row 后面跟著的幾個和第一個同一行的空間屬性選擇Cu…

Go中MAP底層原理分析

MAP底層原理分析 參考 https://golang.design/go-questions/map/principalmap | Golang 中文學習文檔 先來看一下map結構體&#xff0c;&#xff08;runtime.hmap結構體就是代表著 go 中的map&#xff0c;與切片一樣map的內部實現也是結構體&#xff09; type hmap struct {/…

#開發環境篇:postMan可以正常調通,但是瀏覽器里面一直報403

本地header代理下面內容即可 headers: { // 添加必要的請求頭 ‘Host’: ‘服務端域名’, ‘Origin’: https://服務端域名, ‘Referer’: https://服務端域名 }, devServer: {// 本地開發代理API地址proxy: {^/file: {target: https://服務端域名,changeOrigin: true, // 是否…

【論文閱讀 | PR 2024 |ICAFusion:迭代交叉注意力引導的多光譜目標檢測特征融合】

論文閱讀 | PR 2024 |ICAFusion&#xff1a;迭代交叉注意力引導的多光譜目標檢測特征融合 1.摘要&&引言2.方法2.1 架構2.2 雙模態特征融合&#xff08;DMFF&#xff09;2.2.1 跨模態特征增強&#xff08;CFE&#xff09;2.2.2 空間特征壓縮&#xff08;SFS&#xff09;…

效率、便捷、安全:智慧充電樁一站式解決方案如何重塑新能源充電體驗?

在新能源浪潮席卷全球的背景下&#xff0c;電動汽車的普及對充電基礎設施提出了更高要求。傳統充電模式因效率低、操作繁瑣、安全隱患等問題&#xff0c;難以滿足用戶需求。智慧充電樁一站式解決方案應運而生&#xff0c;通過技術創新將效率、便捷與安全融為一體&#xff0c;徹…

杰發科技AC7840——Timer修改重裝載值

需要在運行過程中修改定時器的中斷時間 int main(void) {SystemClock_Config(); /*時鐘初始化*/GPIO_LedInit(); /*GPIO初始化*/TIMER_Init(); /*定時器初始化*/InitDebug(); …

https和http有什么區別-http各個版本有什么區別

http和 https的區別 HTTP&#xff08;超文本傳輸協議&#xff09;和 HTTPS&#xff08;安全超文本傳輸協議&#xff09;是兩種用于在網絡上傳輸數據的協議&#xff0c;它們的主要區別在于安全性&#xff1a; HTTP&#xff08;Hypertext Transfer Protocol&#xff09;&#x…