linux:進程詳解(1)

目錄

?編輯

1.進程基本概念與基本操作

1.1 概念

1.2 描述進程-PCB

1.2.1PCB的基本概念

1.2.2 task_ struct

1.2.3 查看進程

2.進程狀態

2.1 Linux內核源碼展示

2.2 進程狀態查看

?編輯

2.3?Z(zombie)-僵?進程

2.4 僵尸進程的危害

2.5 孤兒進程

3.進程優先級

3.1 基本概念

3.2 查看進程

3.3?PRI andNI

3.4?PRI vs NI

3.5?查看進程優先級的命令

3.6 四個重要概念

4.進程切換

5.內核進程O(1)調度隊列

5.1??個CPU擁有?個runqueue

5.2 優先級

5.3 活動隊列

5.4 過期隊列

5.5?active指針和expired指針

6.環境變量

6.1 基本概念

6.2?常見環境變量

6.3查看環境變量方法

6.4?和環境變量相關的命令

6.5?環境變量的組織方式

6.6?通過代碼如何獲取環境變量

6.7?環境變量通常是具有全局屬性的


1.進程基本概念與基本操作

1.1 概念

課本概念:程序的一個執行實例,對應正在運行的程序等。

內核觀點:作為分配系統資源(CPU時間、內存等)的實體。

1.2 描述進程-PCB

1.2.1PCB的基本概念

? 進程信息存儲在進程控制塊(Process Control Block,簡稱PCB)這一數據結構中,它本質上是一個包含進程所有屬性的集合。

? 教材中將其稱為PCB(Process Control Block),在Linux操作系統中,PCB的具體實現是task_struct結構體。

注意:task_struct是進程控制塊(PCB)的一種實現形式

? Linux系統使用task_struct結構體來描述進程

? task_struct是Linux內核的關鍵數據結構,它被加載到內存中并保存進程的所有相關信息

1.2.2 task_ struct

進程信息分類

? 進程標識符(PID):系統內唯一標識進程的編號,用于進程區分和管理

? 運行狀態:記錄進程當前狀態(運行/等待等)、退出狀態碼及終止信號

? 優先級:決定進程調度順序的優先級數值

? 程序計數器(PC):存儲下一條待執行指令的內存地址

? 內存指針:包含指向程序代碼、進程數據以及共享內存區域的指針集合

? 上下文數據:保存進程運行時CPU寄存器的狀態信息

? I/O狀態:記錄進程I/O請求、分配設備及打開文件列表

? 統計信息:累計CPU使用時間、時鐘周期、時間配額等資源使用記錄

1.2.3 查看進程

(1)進程信息可通過 /proc 系統目錄查看。

(2)大多數進程信息也可以通過用戶級工具(如top和ps)獲取。

ps:

注意:

查看特定進程信息時,可將ps與grep命令結合使用。

2.進程狀態

2.1 Linux內核源碼展示

? 要理解正在運行的進程的概念,需要了解進程的不同狀態。在Linux內核中,進程有時也被稱為任務。

以下狀態定義于內核源代碼中:

? 運行狀態(Running):該狀態并不意味著進程一定正在執行,而是表示進程要么正在運行,要么處于運行隊列中等待調度。

? 睡眠狀態(Sleeping):表示進程正在等待某個事件完成(這種睡眠狀態有時也稱為可中斷睡眠(Interruptible Sleep))。

? 磁盤休眠狀態(Disk Sleep):也稱為不可中斷睡眠狀態(Uninterruptible Sleep),處于該狀態的進程通常正在等待I/O操作完成。

? 停止狀態(Stopped):可以通過發送SIGSTOP信號使進程進入停止狀態(T)。被暫停的進程可以通過發送SIGCONT信號恢復運行。

? 死亡狀態(Dead):該狀態僅表示進程已終止,不會在任務列表中顯示。

2.2 進程狀態查看

  1. ps aux / ps axj 命令
  2. a:顯示當前終端的所有進程,包括其他用戶的進程
  3. x:顯示沒有控制終端的進程,例如后臺運行的守護進程
  4. j:顯示進程所屬的進程組ID、會話ID、父進程ID,以及與作業控制相關的信息
  5. u:以用戶為中心的格式顯示進程信息,包括用戶、CPU和內存使用情況等詳細信息

2.3?Z(zombie)-僵?進程

  • **僵尸狀態(Zombies)**是進程的一種特殊狀態
  • 當子進程終止后,若其父進程未通過wait()系統調用讀取子進程的退出狀態碼,則該子進程會轉變為僵尸進程
  • 僵尸進程會保留在進程表中并維持終止狀態,持續等待父進程獲取其退出狀態信息
  • 只要滿足以下條件,子進程就會進入Z狀態:
    • 子進程已終止
    • 父進程仍在運行
    • 父進程未獲取子進程的終止狀態

2.4 僵尸進程的危害

? 進程退出狀態必須被保留,因為它需要向關注它的進程(父進程)匯報任務執行情況。如果父進程遲遲不讀取狀態,子進程就會一直保持Z狀態。

? 保存退出狀態需要用數據記錄,這屬于進程的基本信息,因此存儲在task_struct(PCB)中。這意味著只要Z狀態持續存在,PCB就必須一直維護這些信息。

? 如果一個父進程創建大量子進程卻不回收,確實會造成內存資源浪費。因為每個數據結構對象都會占用內存空間,就像C語言中定義的結構體變量需要分配內存一樣。

? 這確實會導致內存泄漏問題。

2.5 孤兒進程

  • 當父進程先退出時,子進程會變成"孤兒進程"
  • 孤兒進程將由1號init進程接管
  • 最終由init進程負責回收這些孤兒進程

3.進程優先級

3.1 基本概念

  • CPU資源分配的順序取決于進程優先級(priority)。優先級高的進程享有優先執行權。在多任務環境下,合理配置進程優先級可以有效提升Linux系統性能。
  • 系統還支持將進程綁定到特定CPU運行。通過將非關鍵進程分配到指定CPU,可以顯著優化整體系統性能。

3.2 查看進程

以下信息值得重點關注:
? UID:執行者身份標識
? PID:進程唯一標識符
? PPID:父進程標識符(即衍生該進程的上級進程)
? PRI:進程優先級(數值越小優先級越高)
? NI:進程的nice值

3.3?PRI andNI

? PRI(進程優先級)表示程序被CPU執行的先后順序,數值越小優先級越高
? NI(nice值)是進程優先級的修正數值,用于調整PRI
? 調整后的優先級計算公式為:PRI(new) = PRI(old) + nice
? nice值為負數時,PRI會降低,從而提高進程優先級,使其更快被執行
? 在Linux系統中,調整進程優先級實際上就是修改nice值
? nice值的有效范圍是-20到19,共40個優先級級別

?在Linux操作系統當中,PRI(old)默認為80,即PRI = 80 + NI。

3.4?PRI vs NI

? 需要明確的是,進程的nice值并非進程優先級本身,二者屬于不同概念。但nice值會影響進程優先級的調整。
? 簡單來說,nice值是對進程優先級進行修正的參數。

3.5?查看進程優先級的命令

使用 top 命令調整已運行進程的 nice 值:

  1. 運行 top 命令
  2. 在 top 界面按下 r 鍵
  3. 輸入目標進程的 PID
  4. 輸入新的 nice 值

注意事項:

  • 也可以使用 nice 和 renice 命令來調整優先級
  • 相關系統調用函數

3.6 四個重要概念

? 競爭性:系統運行多個進程,但CPU資源有限(可能僅有一個),因此進程間存在資源競爭。為優化資源分配和任務執行效率,引入了優先級機制。

? 獨立性:多進程運行時各自擁有獨立資源,彼此互不干擾。

? 并行:當存在多個CPU時,多個進程可以同時在不同的CPU上運行,實現真正的并行處理。

? 并發:在單個CPU環境下,通過快速切換進程的方式,在特定時間段內讓多個進程交替執行,實現并發效果。

4.進程切換

CPU上下文切換是指任務切換或CPU寄存器切換的過程。當多任務內核需要切換運行任務時,會先保存當前任務的運行狀態(即CPU寄存器中的所有內容),將其存入該任務的堆棧中。隨后,內核會從待運行任務的堆棧中恢復其狀態至CPU寄存器,并開始執行該任務。這一完整的任務切換過程稱為context switch。

5.內核進程O(1)調度隊列

5.1??個CPU擁有?個runqueue

若存在多個CPU,需考慮進程數量的負載均衡問題。

5.2 優先級

? 普通優先級:100~139(對應nice值的常規優先級范圍)
? 實時優先級:0~99(無需關注)

5.3 活動隊列

? 所有未用完時間片的進程按優先級存入該隊列
? nr_active:記錄當前處于運行狀態的進程總數
? queue[140]:每個元素代表一個進程隊列,同優先級進程遵循FIFO調度規則,數組下標直接對應進程優先級
? 進程選擇流程:

  1. 從下標0開始遍歷queue[140]
  2. 首個非空隊列即為最高優先級隊列
  3. 取該隊列首進程運行,完成調度
  4. 雖然遍歷時間復雜度為O(1),但效率仍不理想
    ? bitmap[5]:通過5×32位比特位(共140位)標記隊列空狀態,顯著提升非空隊列查找效率

5.4 過期隊列

? 過期隊列與活動隊列具有相同的結構
? 處于過期隊列的進程均為時間片已耗盡的進程
? 一旦活動隊列中的所有進程處理完畢,系統將重新計算過期隊列中進程的時間片

5.5?active指針和expired指針

? active指針始終指向當前活動隊列
? expired指針始終指向過期隊列
? 隨著進程時間片到期,活動隊列中的進程逐漸減少,過期隊列中的進程持續增加
? 這種狀態無需擔心,只需在適當時機交換activeexpired指針的內容,就能立即獲得一批新的活動進程

重點:

系統查找合適調度進程的時間復雜度為常量,進程數量的增加不會影響時間成本,這就是著名的O(1)進程調度算法!

6.環境變量

6.1 基本概念

? 環境變量(Environment Variables)是操作系統中用于配置運行環境的關鍵參數
? 以C/C++開發為例:編譯鏈接時無需手動指定庫文件路徑仍能成功生成可執行程序,正是依靠環境變量指引編譯器自動查找所需庫文件
? 環境變量具有兩大典型特征:

  • 承載特定的系統功能
  • 通常具備全局生效的特性

6.2?常見環境變量

? PATH: 定義系統查找命令的可執行文件路徑
? HOME: 設置用戶的主工作目錄(即用戶登錄Linux系統時的默認目錄)
? SHELL: 指定當前使用的Shell程序,通常為/bin/bash

6.3查看環境變量方法

To check the value of an environment variable, use:

echo $NAME  # Replace NAME with your environment variable

//NAME:你的環境變量名稱

測試PATH

將我們的程序所在路徑加?環境變量PATH當中, 對?測試 export PATH=$PATH:hello 程序所在路徑

直接執行./hello與執行hello的區別

為什么某些命令可以直接執行而不需要指定路徑,而我們的二進制程序需要帶上路徑才能運行?

答案:

系統通過PATH環境變量來查找可執行程序。PATH包含一系列目錄路徑,當輸入命令時,系統會按照以下順序查找:

  1. 首先檢查是否是內置命令(如cd、echo等shell內置命令)
  2. 如果不是內置命令,則按PATH變量中列出的目錄順序搜索
  3. 在找到的第一個匹配的可執行文件處停止

6.4?和環境變量相關的命令

  1. echo: 顯示指定環境變量的值
  2. export: 設置新的環境變量
  3. env: 顯示所有環境變量
  4. unset: 刪除指定的環境變量
  5. set: 顯示當前 shell 的所有本地變量和環境變量

6.5?環境變量的組織方式

每個程序都會收到?張環境表,環境表是?個字符指針數組,每個指針指向?個以’\0’結尾的環境 字符串

6.6?通過代碼如何獲取環境變量

?

# 命令行第三個參數

借助第三方變量 environ 進行獲取

注意:

libc 中定義的全局變量 environ 指向環境變量表。該變量未被包含在任何頭文件中,因此使用時需要顯式聲明為 extern

6.7?環境變量通常是具有全局屬性的

環境變量通常具有全局性特征,可被子進程繼承使用。

直接查看,發現沒有結果,說明該環境變量根本不存在

  • 執行 export MYENV="hello world" 設置環境變量
  • 重新運行程序后生效,證明環境變量成功傳遞給了子進程

(說明:環境變量具有繼承性,父進程設置的變量會自動傳遞給子進程)

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

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

相關文章

碳中和目標下的全球產業鏈重構:深度解析與未來路徑

引言:氣候臨界點與產業鏈的系統性風險2023年,全球平均氣溫較工業化前上升1.2℃,南極冰蓋年消融量達1500億噸,極端天氣事件導致的經濟損失占全球GDP的2.3%。這一系列數據背后,暴露出傳統產業鏈的致命缺陷——其設計邏輯…

FPGA實現SDI轉LVDS視頻發送,基于GTX+OSERDES2原語架構,提供2套工程源碼和技術支持

目錄 1、前言工程概述免責聲明 2、相關方案推薦我已有的所有工程源碼總目錄----方便你快速找到自己喜歡的項目本博已有的 SDI 編解碼方案FPGA實現LVDS視頻收發方案 3、工程詳細設計方案工程設計原理框圖SDI 輸入設備Gv8601a 均衡器GTX 解串SMPTE SD/HD/3G SDI IP核BT1120轉RGB奇…

新手向:使用Python構建高效的日志處理系統

本文將詳細講解如何使用Python開發一個專業的日志分析工具,能夠自動化處理、分析和可視化各類日志文件,大幅提升運維效率。環境準備開發本工具需要以下環境配置:Python環境:建議Python 3.8或更高版本必要庫:pandas&…

大模型-量化技術

簡介 模型量化是一種重要的模型壓縮技術。其核心目標是在可控精度損失下,將大模型中浮點型權重(通常為 float32 等高精度格式)近似轉換為低精度離散值表示(通常為 int8)。 具體而言,該技術通過將模型的權重…

【C語言網絡編程】HTTP 客戶端請求(域名解析過程)

在做 C 語言網絡編程或模擬 HTTP 客戶端時,第一步就離不開“把域名解析為 IP 地址”這一步。很多人可能直接復制粘貼一段 gethostbyname 的代碼,但未必真正理解它的原理。 本篇博客將圍繞一個經典函數: char *host_to_ip(const char *hostna…

Node.js特訓專欄-實戰進階:16. RBAC權限模型設計

?? 歡迎來到 Node.js 實戰專欄!在這里,每一行代碼都是解鎖高性能應用的鑰匙,讓我們一起開啟 Node.js 的奇妙開發之旅! Node.js 特訓專欄主頁 專欄內容規劃詳情 我將從RBAC權限模型的基礎概念、核心組件講起,詳細闡述其設計原則、數據庫模型設計,還會結合代碼示例展示在…

mac上BRPC的CMakeLists.txt優化:解決Protobuf路徑問題

問題背景與挑戰 在構建高性能RPC框架BRPC時,?Protobuf依賴路徑的配置往往是開發者面臨的主要挑戰之一。原始CMake配置在尋找Protobuf庫時存在以下痛點: ?路徑搜索不精確?:默認find_library無法定位自定義安裝路徑下的Protobuf?版本兼容…

Go 性能分析利器:pprof 工具實戰指南

在 Go 語言開發中,性能問題往往是項目上線后最棘手的挑戰之一。無論是 CPU 占用過高、內存泄漏,還是 goroutine 失控,都可能導致服務響應緩慢甚至崩潰。而pprof作為 Go 官方提供的性能分析工具,就像一把精準的手術刀,能…

fio測試SSD直接I/O(Direct IO)性能僅有100MB/s的問題解決

針對您使用fio測試SSD直接I/O(Direct IO)性能僅有100MB/s的問題,結合SSD特性和fio測試原理 fio測試SSD直接I/O(Direct IO)性能僅有100MB/s的問題 - LinuxGuideLinuxGuide 以下是可能的原因及優化方案: &a…

EVO-0:具有隱空間理解的視覺-語言-動作模型

25年6月來自上海交大、EvoMind Tech 和上海算法創新研究院(IAAR-Shanghai)的論文“EVO-0: Vision-Language-Action Model with Implicit Spatial Understanding”。 視覺-語言-動作 (VLA) 模型已成為一種有前途的框架,可使通用機器人能夠在現…

文心大模型4.5開源測評:輕量化部署實踐與多維度能力驗證

前言:開源浪潮下的輕量化革命 2025年百度文心大模型4.5系列的開源,標志著國產大模型從“參數競賽”轉向“實用落地”的關鍵轉折。當行業仍在追逐千億參數模型時,文心4.5以0.3B輕量級模型撕開一條新賽道——單卡部署、低成本運維、中文場景高…

LeetCode 2401.最長優雅子數組

給你一個由 正 整數組成的數組 nums 。 如果 nums 的子數組中位于 不同 位置的每對元素按位 與(AND)運算的結果等于 0 ,則稱該子數組為 優雅 子數組。 返回 最長 的優雅子數組的長度。 子數組 是數組中的一個 連續 部分。 注意:長…

中華心法問答系統的解讀(1)

中華心法問答系統一、研究背景1. 研究意義2. 研究目的3. 信息檢索技術二、主要研究內容三、相關技術介紹1. Flask框架技術2. BERT模型(1)基本概念(2)BERT解決的問題(3)BERT的核心結構a. 模型結構b. 預訓練任…

Java 大視界 -- Java 大數據在智能安防視頻監控系統中的視頻摘要快速生成與檢索優化(345)

Java 大視界 -- Java 大數據在智能安防視頻監控系統中的視頻摘要快速生成與檢索優化(345)引言:正文:一、Java 構建的全場景視頻處理系統(含校園 / 工廠 / 礦區適配)1.1 校園宿舍區夜間檢索方案(…

信號量機制,互斥的避免自旋鎖的實現方法(操作系統)

這次的比喻場景要升級了,因為它既能解決互斥問題,也能解決同步問題。我們用一個更綜合的場景:一個擁有多輛共享單車的站點。共享單車 (資源):站點里有多輛共享單車,數量是有限的。你 (進程):想借一輛車去辦…

零基礎 “入坑” Java--- 十、繼承

文章目錄一、何為繼承二、繼承語法三、父類成員訪問1.成員變量2.成員方法四、super關鍵字五、子類構造方法六、super和this辨析七、再談初始化八、protected關鍵字九、繼承方式十、final關鍵字十一、繼承與組合根據我們學過的類的知識,我們來定義兩個類:…

JS進階-day1 作用域解構箭頭函數

作用域全局作用域——>盡量少使用,避免變量污染局部作用域——>函數作用域、塊級作用域作用域鏈——>底層變量查找機制(先在當前函數作用域查找,如果找不到,就沿著作用域鏈向上級作用域查找,直到全局作用域&a…

Arduino 無線通信實戰:使用 RadioHead實現 315MHz 433M模塊數據傳輸

本文將介紹如何使用 Arduino 和 RadioHead 庫實現 315MHz(或 433MHz)ASK 無線通信。通過兩個 Arduino 控制板,一個作為發射端,一個作為接收端,實現“按鍵控制 → 無線發送 → LED 控制”的基礎通信功能,非常…

012_PDF處理與文檔分析

PDF處理與文檔分析 目錄 PDF支持概述支持的功能文檔限制上傳方式分析能力應用場景最佳實踐 PDF支持概述 核心能力 Claude現在可以直接處理PDF文檔,提供全面的文檔分析能力。這項功能支持: 文本內容分析:提取和理解PDF中的文本圖像識別&…

系規備考論文:論IT服務知識管理

論IT服務知識管理 摘要 2022年7月,我公司中標某市化工廠網絡視頻監控管理系統綜合平臺運維服務項目,并任命我為系統規劃與管理師。該項目組織結構為項目型,合同金額為115.5萬元(含稅),工期為1年。本運維服務項目的主要工作包括系統軟件和網絡設備的日常監控與維護,定期…