環境變量-進程概念(7)

文章目錄

  • Linux 真實調度算法
    • 1. queue[140]
    • 2. bitmap[5] 位圖
    • 3. nr_active
    • 4. 活躍進程與過期進程
  • 環境變量
    • 1. 基本概念
    • 2. 命令行參數
    • 3. PATH 環境變量
    • 4. 環境變量具體操作

Linux 真實調度算法

下圖是Linux2.6內核中進程隊列的數據結構,也有Linux2.6內核進程O(1)調度算法,可單單看一副圖片,也不知所以然

在這里插入圖片描述

1. queue[140]

首先就是這個queue[140]queue它就是個哈希表,優先級就是哈希槽(slot),x-60 + (140 - 40)就是哈希轉換算法

Linux操作系統的優先級其實總共是140個,那之前不是實驗出優先級的范圍是[60, 99],總共40個嗎?這里為啥是140個呢

因為Linux的優先級有實時優先級和分時優先級,它既是一個實時操作系統,又是一個分時操作系統,而[0, 99]是實時優先級(并不考慮),[100, 139]是分時優先級的范圍,是咱們所要去關注的

x的取值范圍是[60, 99],將其代入到哈希轉換算法中,得出的取值范圍不就是[100, 139]。那此時就會存在疑問,既然這個實時優先級不考慮,為啥還要將它設計出來呢?

實時優先級適用于實時操作系統,Linux最初確實是作為分時操作系統設計的,主要應用于服務器領域。但它的調度算法之所以要加入實時操作系統特性,最根本的原因在于:任何操作系統開發者都希望擴大用戶群體

雖然Linux在后端服務器領域應用最為廣泛,但這并不意味著它只能用于服務器場景。實際上,Linux同樣適用于工業控制和制造等實時性要求較高的領域。因此,現代操作系統通常都會同時支持分時和實時兩種調度模式

2. bitmap[5] 位圖

bitmap它首先是個位圖,unsigned int bitmap[5]總共有160個比特位(32*5),比特位前140個的位置就逐一對應著queue[140]的slot,比特位中的內容:1/0,1表示該slot指向的進程不為空,0則為空

在這里插入圖片描述

這里運行隊列咱們只考慮從100開始,上面只是做個形象的展示。進程調度,宏觀上先看優先級,優先級相同的先進先出(FIFO算法),比如圖中2號優先級的第一個進程先調度

比如0000100,優先級為3的進程不為空。為啥位圖的元素個數是5,因為4是128,6是192,只有5是最接近140的

調度器快速地挑選一個進程要分成兩步,第一步就是挑隊列,而挑隊列再也不用去遍歷queue這個指針數組了,直接查看對應的位圖bitmap

第二步:再到隊列中去挑特定的進程→這樣挑選一個進程基本上做到了幾乎為O(1)的時間復雜度,將這個調度算法稱為Linux內核進程調度算法之大O(1)調度算法

3. nr_active

nr_active就表示整個隊列中一共有多少個進程。所以進程調度時先查nr_activebitmap(確認下標)→queue,找到目標隊列,從目標隊列頭部提取內容,頭部移除(Pop_from),將當前結點的PCB放入到struct task_struct* current指針里,執行切換算法,將current指針指向的進程放到CPU上就能運行了

如果這樣調度的話,假如今天有一個60號進程,它是一個死循環,也有一個99號進程。60進程時間片到了,運行完畢后,切換下去,它未來還要被調度的,所以就將它重新放到了這個隊列(60優先級指向的隊列)的最后面進行排隊

此時你就會發現存在什么樣的問題,CPU在調度時,只有將60優先級隊列中的所有進程全部跑完,才會跑后面優先級隊列的進程,跑完前面所有進程,才會跑99號進程,可是60號進程是個死循環,那99號進程就永遠無法被調度,就會造成進程饑餓問題

4. 活躍進程與過期進程

那為了解決上面進程饑餓問題,就存在著活躍進程與過期進程之分,活躍進程指向藍色框,過期進程指向紅色框,框中內容是相同的

在這里插入圖片描述

挑選活躍進程中60號進程,它要被CPU調度,等時間片到了之后,它要從CPU上剖離下來,那此時這個進程它不能再放回到active指針所指向的活躍進程中的60號隊列當中,得鏈入到expired指針所指向的過期進程中的60號隊列當中,CPU它調度完成的進程都是要放入到過期進程的對應位置

這樣active queue進程會越來越少,expired queue進程會越來越多。直至active queue中的進程全部為0,即nr_active = 0,最后直接swap(&active, &expired),交換它兩指向的內容,重新進行調度

上面才算是真正的Linux內核進程調度算法之大O(1)調度算法。這里還要提到的一點就是:當新進程到來時,如果將新進程放到過期進程當中,目前這個進程就處于就緒狀態

很多分時操作系統是支持內核優先級搶占的,比如當前正在運行的是80號進程,新來了一個65號進程,新進程就要給特權,讓它盡快運行,那就只能讓它插隊,那總不能讓它插到過期進程的隊列當中吧,就直接讓它鏈入到活躍進程的65號隊列當中,就開始了優先級的搶占

環境變量

1. 基本概念

  • 環境變量(environmentvariables)一般是指在操作系統中用來指定操作系統運行環境的一些參數
  • 比如:我們在編寫C/C++代碼的時候,在鏈接的時候,從來不知道我們所鏈接的動態靜態庫在哪里,但是照樣可以鏈接成功,生成可執行程序,原因就是有相關環境變量幫助編譯器進行查找
  • 環境變量通常具有某些特殊用途,還有在系統當中通常具有全局特性
  • 常見環境變量
    • PATH:指定命令的搜索路徑
    • HOME:指定用戶的主工作目錄(即用戶登陸到Linux系統中時,默認的目錄)
    • SHELL:它的值通常是/bin/bash

2. 命令行參數

main函數有參數嗎?有,argv相當于一張命令行參數表,而argc表示argv指針數組元素的個數

#include<stdio.h>int main(int argc, char* argv[])
{for (int i = 0; i < argc; i++){printf("argv[%d]: %s\n", i, argv[i]);}return 0;
}

在這里插入圖片描述

再寫一段代碼,來幫助理解程序如何利用argv命令行參數表實現選項功能

int main(int argc, char* argv[])
{if (argc != 2){printf("Usage: %s [-a|-b|-c]\n", argv[0]);return 0;}const char* arg = argv[1];if (strcmp(arg, "-a") == 0)printf("這是功能1\n");else if (strcmp(arg, "-b") == 0)printf("這是功能2\n");else if (strcmp(arg, "-c") == 0)printf("這是功能3\n");else printf("Usage: %s [-a|-b|-c]\n", argv[0]);return 0;
}

在這里插入圖片描述

3. PATH 環境變量

可是執行我們自己的命令需要帶./,執行系統的命令卻不需要,這是為什么呢?

首先你寫的二進制指令與系統的指令并沒有本質區別,咱們所用的指令本質上在系統里提前預裝的二進制程序,你寫的二進制程序同樣如此,它們兩個并沒有本質區別。 那為啥一個帶路徑,一個不帶路徑呢?

你要知道,要去執行一個程序,那必須先找到它。./code在當前路徑下執行可執行程序, 系統指令卻不需要帶路徑的原因是因為系統中存在環境變量

在這里插入圖片描述

特別不建議將你自己寫的二進制程序拷貝到/usr/bin目錄下,因為你的二進制文件并沒有經過測試,可能會存在bug,可能會污染系統原本的指令池

在這里插入圖片描述

那系統憑啥就知道執行命令時就去/usr/bin目錄下去找呢?因為系統中存在環境變量PATH,這個環境變量在系統中默認是存在的,用來標識一串路徑,告訴系統,要去哪些路徑下去找二進制可執行文件(系統中搜索指令的默認搜索路徑)

4. 環境變量具體操作

介紹兩個指令,env:查看系統中所有的環境變量,echo $環境變量名稱:具體查看一個環境變量的內容

在這里插入圖片描述

對于PATH這個環境變量,執行ls指令時,以冒號作為分隔符,從第一個路徑去找可執行文件,沒找到再依次去后面的路徑找

如果想要去修改一個環境變量的內容,直接環境變量名稱=具體修改內容,比如PATH=/home/xiao,就直接進行路徑覆蓋

在這里插入圖片描述

如果想要在PATH這個環境變量中去新增一個路徑,可以PATH=$PATH:絕對路徑。那我修改了咋改回來呢?關掉xshell,再重新登錄即可(恢復默認的環境變量)

在這里插入圖片描述

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

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

相關文章

為什么數組可以做到時間復雜度為O(1)的隨機訪問

這個問題涉及數組底層結構與內存尋址機制 一、數組元素在內存中連續存儲 數組在內存中會開辟一塊連續地址空間。假設數組A為int類型&#xff0c;共有n個元素&#xff0c;每個元素大小為4字節&#xff0c;那么他們在內存中的存儲結構可能如下&#xff1a;內存地址數組元素A0x100…

《使用Qt Quick從零構建AI螺絲瑕疵檢測系統》——5. 集成OpenCV:讓程序擁有“視力”

目錄一、概述1.1 背景介紹&#xff1a;賦予應用“視力”1.2 學習目標二、集成OpenCV2.1 安裝OpenCV2.2 在Qt項目中配置CMake三、項目數據集介紹與準備四、圖像的橋梁&#xff1a;ImageProvider與格式轉換五、加載、轉換并顯示圖像六、總結與展望一、概述 1.1 背景介紹&#xf…

智慧駕駛疲勞檢測算法的實時性優化

智慧駕駛疲勞檢測&#xff1a;從技術突破到場景革命全球每年因疲勞駕駛引發的交通事故占比超20%&#xff0c;夜間及長途駕駛場景中這一比例更高。當駕駛員出現疲勞甚至暈倒等危險駕駛行為時&#xff0c;傳統檢測手段因依賴單一傳感器或受環境干擾&#xff0c;存在誤報率高、響應…

USRP X440

產品概述 USRP X440 是 Ettus Research 推出的高性能、多通道、寬帶軟件定義無線電&#xff08;SDR&#xff09;系統。基于 Xilinx Zynq UltraScale RFSoC 架構&#xff0c;它提供高密度、相干性的信號收發能力&#xff0c;幫助您快速構建雷達、電子戰&#xff08;EW&#xff0…

[特殊字符] GitHub 2025年7月月度精選項目 Top5

&#x1f680; GitHub 2025年7月月度精選項目 Top5 本月GitHub有哪些值得關注的優質開源項目&#xff1f;我從數千個新項目中&#xff0c;精選了5個有趣 實用 可演示的倉庫 無論你是開發者、AI愛好者、工具控&#xff0c;還是正在做副業產品&#xff0c;這篇文章都值得收藏&a…

微服務架構下的自動化測試策略調優經驗分享

微服務架構下,自動化測試策略需針對分布式特性、服務自治性和高耦合風險進行針對性調整的關鍵調整方向及實施方法: 一、??測試策略重構:分層與契約驅動?? 1. ??測試金字塔升級為鉆石模型?? ??調整邏輯??:傳統金字塔中UI測試占比過高,而微服務需強化契約測試與…

圖論:并查集

入門 久聞并查集的大名&#xff0c;今天來一探究竟&#xff0c;到底什么是并查集&#xff0c;并查集有什么用&#xff1f; 并查集(Disjoint Set Union, DSU)是一種處理不相交集合的合并及查詢問題的數據結構。 其實并查集的作用主要就有兩個&#xff1a; 1、將兩個元素添加到…

告別靜態文檔!Oracle交互式技術架構圖讓數據庫學習“活“起來

&#x1f5fa;? 當數據庫架構圖學會"互動" 想象一下&#xff0c;你正在學習Oracle數據庫架構&#xff0c;面對密密麻麻的靜態文檔和復雜的組件關系圖&#xff0c;是不是常常感到&#xff1a; 像在迷宮里找路&#xff0c;不知道組件間如何協作&#xff1f;想深入了…

day62-可觀測性建設-全鏈路監控zabbix+grafana

&#x1f31f;監控api接口 &#x1f50d;監控zabbix-api接口 生成API tokens命令行測試 curl -s -X POST -H "Content-Type: application/json-rpc" -d {"jsonrpc": "2.0","method": "host.get","params": {&quo…

通過Deepseek找工作

推送的結果如下,對應的AI提示詞在底部: 計算機方向遠程工作職位匯總 整合全球遠程技術崗位 | 支持全地域遠程辦公 | 涵蓋開發、安全、云計算等方向 覆蓋方向:8+個技術領域 薪資范圍:10K-40K/月 工作模式:100%遠程 遠程技術職位列表 職位名稱 技能要求 經驗要求 薪資…

vscode文件顏色,只顯示自己更改的文件顏色、剛git下來的庫,vscode打開后,顯示所有文件都被修改了

問題&#xff1a;git新的庫&#xff0c;然后我用vscode打開&#xff0c;默認顯示所有的文件都更改了&#xff0c;但是我打開他們修改的對比&#xff0c;沒有顯示任何有被修改的地方&#xff0c;是怎么回事 linux/wsl下這么設置就可以了&#xff1a;git config core.autocrlf in…

基于ENMeval包的MaxEnt模型參數優化總結

MaxEnt模型參數優化1. MaxEnt模型優化&#xff1a;增加RM&#xff0c;降低模型過擬合風險&#xff0c;簡易模型&#xff0c;平滑響應曲線&#xff0c;增強模型可解釋性和轉移性&#xff08;生物入侵&#xff09;2. 默認參數&#xff1a;FCLQHP&#xff0c;RM12.1. 基于優化的 M…

Docker實踐:使用Docker部署blog輕量級博客系統

Docker實踐&#xff1a;使用Docker部署blog輕量級博客系統一、blog系統介紹1.1 blog介紹1.2 個人博客系統介紹1.3 個人博客使用場景二、本地環境介紹2.1 本地環境規劃2.2 本次實踐介紹三、本地環境檢查3.1 檢查Docker服務狀態3.2 檢查Docker版本3.3 檢查docker compose 版本四、…

專題:2025電商增長新勢力洞察報告:區域裂變、平臺壟斷與銀發平權|附260+報告PDF、原數據表匯總下載

原文鏈接&#xff1a;https://tecdat.cn/?p43416 當茂名果農對著鏡頭用方言喊出“荔枝現摘現發”&#xff0c;2小時賣出83萬元&#xff1b;當65歲的上海阿姨通過“子女代付”買到人生第一臺智能冰箱——2025年的電商戰場&#xff0c;正在上演三重革命&#xff1a;新興市場的增…

數字化轉型-AI落地金字塔法則

前言 人工智能必須要跟傳統產業結合&#xff0c;融入傳統產業&#xff0c;才能落地&#xff0c;才能產生巨大的倍增個幾何級效果&#xff01;&#xff01; AI不應該停留在工具層面&#xff0c;AI不僅僅是工具&#xff0c;不僅僅是硬件和軟件&#xff0c;而是軟硬結合。人工智能…

SQL Server 字段類型選型指南:什么數據用什么字段

目錄 一、數值型數據 二、日期與時間數據 三、字符串與文本數據 四、布爾值與狀態碼 五、二進制與文件數據 六、唯一標識符&#xff08;GUID&#xff09; 七、枚舉與代碼表設計 八、存儲優化小結 九、總結 在數據庫設計中&#xff0c;字段類型&#xff08;數據類型&am…

酷暑來襲,科技如何讓城市清涼又潔凈?

烈日下的身影&#xff0c;不該被“炙烤”的擔當又是一年盛夏&#xff0c;城市的血管在高溫下脈動&#xff0c;柏油馬路仿佛要融化&#xff0c;空氣中彌漫著灼熱的氣息。此刻&#xff0c;你是否曾留意過那些身影&#xff1f;在烈日下&#xff0c;他們依舊堅守崗位&#xff0c;用…

傳統框架與減震樓蓋框架地震動力響應分析與有限元模擬

傳統框架與減震樓蓋框架地震動力響應分析與有限元模擬 前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家,覺得好請收藏。點擊跳轉到網站。 摘要 本文針對傳統鋼框架和減震樓蓋鋼框架兩種結構體系,建立了水平地震作用下的動力學模型,推…

Java集合去重

? 方式一&#xff1a;TreeSet Comparator最優雅的一種&#xff0c;適用于對象中某個字段唯一的去重&#xff08;如 partyAId&#xff09;List<PartyACompanyVO> result contractDOS.stream().map(contract -> {PartyACompanyVO vo new PartyACompanyVO();vo.setPa…

Qt字符串處理與正則表達式應用

一、Qt字符串處理基礎 在Qt應用程序開發中&#xff0c;字符串處理是一項常見且重要的任務。Qt提供了強大而靈活的字符串處理功能&#xff0c;能夠滿足各種復雜的文本處理需求。 1.1 QString類概述 QString是Qt中處理字符串的核心類&#xff0c;它基于Unicode編碼&#xff0c…