進程狀態 —— Linux內核(Kernel)

在這里插入圖片描述


在這里插入圖片描述


🎁個人主頁:工藤新一1

🔍系列專欄:C++面向對象(類和對象篇)

🌟心中的天空之城,終會照亮我前方的路

🎉歡迎大家點贊👍評論📝收藏?文章


文章目錄

  • 進程狀態
    • 一、Linux內核源代碼
      • 1.1運行狀態
      • 1.2阻塞狀態
      • 1.3進程的掛起
      • 1.4理解Linux內核鏈表話題
    • 二、Linux的進程狀態
      • 2.1運行狀態(R/R+)
      • 2.2阻塞狀態(S)
      • 2.3暫停狀態(t && T)
      • 2.4 D狀態(深度睡眠、不可中斷睡眠)
      • 2.5死亡狀態(結束狀態)
    • 三、補充
      • 3.1內存泄漏問題
      • 3.2關于內核結構申請(slab 復用機制)
    • 總結

進程狀態

前提回顧:進程概念


? 進程狀態指的是一個進程在其生命周期中所處的階段

? 對于進程來講,進程狀態用于決定,當前進程要被調渡?運行?正在休眠?正在進行等待?在系統層面,當前進程狀態決定 OS 應該如何處理這個進程

進程狀態本質:task_struct 內部的一個整形變量(整數),后續 OS 會根據這個 “整數”(標志位) 進行判斷

在這里插入圖片描述


一、Linux內核源代碼

  • 運行 && 阻塞 && 掛起

在這里插入圖片描述


1.1運行狀態

? 一個進程在 CPU 上運行時,其就是運行狀態。在當代的計算機中,只要一個進程在調渡隊列當中,我們就稱該進程為運行狀態 [并不是一個進程持有 CPU,才能叫做運行]

運行:進程在調渡隊列中,進程的狀態都是 running!
處于 running 狀態的進程,要么正在被 CPU運行,要么已經完全準備完畢,隨時等待被調渡

在這里插入圖片描述


OS

運行隊列(Run Queue):

在這里插入圖片描述



1.2阻塞狀態

? 在學習變成語言中,我們會遭遇的阻塞經歷:cin/scanf。**傳統意義上:**我們自己寫的 C++ 代碼,編譯起來就是一個進程,當代碼從上至下執行至 cin/scanf 我們的程序就停下來了[等待用戶輸入],輸入數據后,當程序拿到了這份數據后,程序就會繼續向后運行了

? 現代計算機理解中:當我們 cin/scanf 時,其實程序并不是在等待用戶輸入,而是等待鍵盤硬件就緒。在用戶未按下鍵盤時,我們稱之為鍵盤硬件未就緒,此時 cin/scanf 也就無法讀取數據。因此,阻塞的意義:等待某種設備/資源就緒。在此期間,設備/資源未就緒,那么進程就不會被調渡


OS

設備隊列(struct_device device):*

在這里插入圖片描述


運行:進程在調渡隊列中你進程的狀態都是 running

阻塞:等待某種設備或資源就緒 [OS 會管理系統中的各種硬件資源:“先描述,在組織!”]


在這里插入圖片描述


在這里插入圖片描述


在這里插入圖片描述


在這里插入圖片描述


結論:進程狀態的變化,表現之一是,要在不同的隊列中進行流動。本質是數據結構的增刪查改!


1.3進程的掛起

1、阻塞掛起狀態

在這里插入圖片描述


問題:如果在阻塞掛起狀態,鍵盤突然就緒了呢?
因為OS是設備(軟硬件設備)的管理者,所以OS會將對應進程,曾經換入到磁盤中的歷史上的數據和代碼,重新加載到內存,重新構建指針映射,最后將這些代碼和數據換入內存后,形成完整進程,最后將進程放入運行隊列中 —— 這一過程,我們稱之為 swap 對應的 “換入和喚出” 操作

其中,
進程所對應的代碼數據被放進交換分區:進程阻塞掛起
當進程換入時,將阻塞掛起進程重新改為運行狀態,該進程就可以直接繼續被調渡

掛起:將對應進程的代碼和數據掛到外設(磁盤)上

換句話說,OS是一個非常智能的軟件,當內存資源不足時,OS需要在整個系統層面上對內存資源進行 “輾轉騰挪”


2、運行掛起狀態

OS內存資源,“相當” 吃緊,阻塞的進程資源全部掛起到外設上,內存仍然短缺,那么 OS只能打 運行隊列 中進程的主意了。OS 甚至會將處于運行隊列末端的進程,交換給 swap 中,當真正真正調渡該進程時,再把對應進程換入


掛起的本質:暫時中止進程/線程的執行,將進程數據換入/喚出到磁盤的 swap 分區中,并保存其當前狀態[PCB],以便后續恢復

在這里插入圖片描述


1.4理解Linux內核鏈表話題

如何遍歷整個進程?


數據結構中的雙鏈表:

在這里插入圖片描述


Linux 內核[kernel]中的雙鏈表結構:

在這里插入圖片描述


task_struct 內部嵌套鏈表:

在這里插入圖片描述


在這里插入圖片描述


鏈表差異:

在這里插入圖片描述


C 語言地址轉化(宏 - offset):獲取結構體中所有字段地址

在這里插入圖片描述


在這里插入圖片描述


**最終結論:**以 offset 遍歷鏈表,即可以訪問進程(PCB)中的所有結構體中的所有字段

在這里插入圖片描述


在這里插入圖片描述


在這里插入圖片描述

**結論:我們所對應的PCB在kernel中只存在一份,但同一個PCB可以同時映射于多種數據結構中。 **如此獨特的性能歸結于 kernel 中獨有的雙鏈表結構[list_head],以 list_head 為中心設計獨有的算法

kernel 中的數據結構不是單一結構,如進程[PCB]可能即屬于運行隊列,又屬于全局鏈表;還可能即被放在運行隊列中,又被放在等待隊列中,這意味著:Linux中很多數據結構是網狀的!


二、Linux的進程狀態

在這里插入圖片描述


在這里插入圖片描述


2.1運行狀態(R/R+)

“R - 0”

在這里插入圖片描述


在這里插入圖片描述


2.2阻塞狀態(S)

“S - 1”

  • Linux角度 - 休眠狀態
  • 操作系統角度 - 阻塞狀態(等待某種資源準備就緒:等待鍵盤輸入)

在《操作系統》理論中,阻塞狀態被稱為:阻塞。但在 Linux 內核中阻塞狀態我們稱之為 S

我們在用戶層直觀的看到一個程序卡住不動了,說到底就是進程不被調渡了(有可能是在等待硬件設備的輸入),因此這就是阻塞狀態

在這里插入圖片描述


在操作系統理論課程中,我們無從得知阻塞的標志位具體是什么的(0?1?…),但具體操作系統可以告訴我們 Linux的阻塞狀態是 ”S - 1“


2.3暫停狀態(t && T)

t - 追蹤狀態

在先前我們的操作系統理論中并沒有暫停狀態;但在 Linux 當中是存在暫停狀態的

在這里插入圖片描述


在這里插入圖片描述


T - 暫停狀態

  • T (Stopped):進程的執行被暫停,通常是由于收到了一個信號(例如 SIGSTOP 信號或調試器的斷點信號)
  • 可以被重新喚醒,繼續運行(例如通過發送 SIGCONT 信號)

在這里插入圖片描述


什么是暫停狀態?暫停狀態又是什么呢?暫停狀態又如何與 kernel狀態對應起來呢?

一般暫停狀態[T]與阻塞狀態[S]不一樣(**進程阻塞S:**一個進程在等待某種資源;**進程暫停T:**不具備某種條件或進程做了非法操作,那么操作系統就將對應的進程暫停了,這屬于Linux特有的一種狀態)

  • 暫停狀態(t && T):止損;操作系統懷疑進程有問題,將進程暫停[t - 斷點調試;T - Ctrl + Z]交給用戶,讓用戶裁決是否繼續進程

2.4 D狀態(深度睡眠、不可中斷睡眠)

進程在等待某個事件(如等待輸入輸出完成、等待信號量、等待網絡數據等)而暫停運行。睡眠態分為兩種:

  • 可中斷睡眠態
    • S (Interruptible Sleep):進程在等待一個事件的完成。在這種狀態下,進程可以被信號喚醒(例如用戶按了 Ctrl+C)或中斷
    • 常見例子:等待用戶鍵盤輸入、等待套接字連接
  • 不可中斷睡眠態
    • D (Uninterruptible Sleep):進程也在等待事件(通常是I/O操作),但不能被信號喚醒或中斷。這是為了保護某些關鍵的進程,確保它們在完成特定任務前不會被打斷
    • 常見例子:等待磁盤I/O操作。如果系統上有大量 D 狀態的進程,通常意味著硬件(如磁盤)可能遇到了問題

休眠狀態S,我們稱之為可 中斷睡眠(也叫淺度睡眠)[Linux中具體個性化的概念]。可終端休眠:如果一個進程處于 S狀態,我們直接殺掉這個進程,這個進程會 響應 我們殺掉它的動作[給出反應]

在這里插入圖片描述


”D“ 狀態的進程不可被 kill掉!那什么時候 ”D“狀態就結束了呢?:一旦進程處于 ”D“狀態,那就只能等待該進程自己醒來,OS 無權殺掉它!;或者重啟,甚至只能斷電!

在這里插入圖片描述


2.5死亡狀態(結束狀態)

  • X (Dead):進程已經完全死亡并被回收。這個狀態只是一個瞬間狀態,用戶無法在 pstop 等工具中看到這個狀態的進程。(注意區分 僵尸狀態死亡狀態 的時間階段:(先)僵尸狀態—>(再)死亡狀態[此時,OS瞬間將其釋放掉了 - 造就了無法觀測的情況]

三、補充

3.1內存泄漏問題

問題:進程結束,內存泄漏問題是否還存在?

如果進程直接退出了,曾經 new/malloc 的堆空間,會被系統自動回收(即內存泄漏問題是不存在的)

僵尸進程所占用的資源空間基于系統級new/malloc只是基于編程語言層面上的資源空間[但本身依舊是向 OS申請的]


常駐進程:常駐扎在內存中的進程

我們所用的大部分軟件都是啟動后,不退出的,即死循環(while(1););這就是常駐進程OS啟動后本身就是一個常駐內存的軟件,所以其內部一旦有內存泄漏問題會影響甚大

在這里插入圖片描述


3.2關于內核結構申請(slab 復用機制)

在這里插入圖片描述


總結

狀態符號含義是否消耗資源
運行/可運行R正在或即將使用CPU
可中斷睡眠S等待事件,可被信號喚醒否(等待中)
不可中斷睡眠D等待I/O,不可被信號喚醒否(等待中)
僵尸Z已終止,等待父進程回收否(但占用PID)
停止T被信號暫停執行

在這里插入圖片描述


到此,我們體會到了:《操作系統》中的理論狀態與具體的《Linux》的理論狀態在概念上是一致的;在實踐上是有個性化的一面的
《操作系統》這門學科將所有 OS 的屬性/共性抽取出來,從而提煉了一套方法論,我們用這一套方法論就可以理解所有的 OS
但沒有實踐,不了解具體的 OS,就無法理解抽象的《操作系統》學科,更不可能將知識遷移到其他的個性化的 OS上(Linux),所以我們在學校中學習的《操作系統》叫做:“計算機學科的哲學”


在這里插入圖片描述
🌟 各位看官好我是工藤新一1呀~

🌈 愿各位心中所想,終有所致!

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

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

相關文章

計算機視覺與深度學習 | 低照度圖像處理算法綜述:發展、技術與趨勢

文章目錄 一、發展歷程:從傳統模型到智能融合 (一)傳統模型構建階段(1970s-2016) (二)深度學習應用階段(2017-2020) (三)硬件-算法協同階段(2021至今) 二、技術分類與性能對比 (一)傳統方法體系 (二)深度學習方法 1. 監督學習模型 2. 無監督/自監督方法 3. 混…

責任鏈模式實踐-開放銀行數據保護及合規

責任鏈模式介紹什么是責任鏈模責任鏈模式是一種行為設計模式, 允許你將請求沿著處理者鏈進行發送。 收到請求后, 每個處理者均可對請求進行處理, 或將其傳遞給鏈上的下個處理者。責任鏈模式結構偽代碼基于責任鏈的開放銀行數據保護及合規實踐…

npm install --global @dcloudio/uni-cli 時安裝失敗

這個日志顯示在執行 npm install --global dcloudio/uni-cli 時安裝失敗,核心錯誤是 UNABLE_TO_GET_GET_ISSUER_CERT_LOCALLY(無法獲取本地頒發者證書),屬于 HTTPS 證書驗證失敗 問題。錯誤原因npm 訪問官方 registry(…

吱吱企業通訊軟件可私有化部署,構建安全可控的通訊辦公平臺

在當今激烈的市場競爭環境中,企業通訊已成為制勝的關鍵因素。吱吱作為一款專為企業管理設計的IM即時辦公通訊軟件,提供了高度安全的通訊辦公環境,確保信息在內部流通的安全性與高效性,為企業數字化轉型奠定了堅實的基礎。 一、私有…

暄桐:唯有認真思考過死亡,才足以應對日常

暄桐是一間傳統美學教育教室,創辦于2011年,林曦是創辦人和授課老師,教授以書法為主的傳統文化和技藝,皆在以書法為起點,親近中國傳統之美,以實踐和所得,滋養當下生活。初聽莊子在妻子離世后“鼓…

目標檢測領域基本概念

基于提議的方法,也常被稱為兩階段 (Two-stage) 方法,是目標檢測領域的經典范式。它們將目標檢測任務分解為兩個主要步驟:階段一:區域提議 (Region Proposal Generation) 目標: 在圖像中生成一系列可能包含物體的候選區…

【開題答辯全過程】以 基于SpringBoot的流浪貓狗領養系統為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人,語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

扣子(coze)實踐指南進階篇——創建工作流,并將工作流接入智能體

大家好,歡迎閱讀這份《智能體(AIAgent)開發指南》! 在大模型和智能體快速發展的今天,很多朋友希望學習如何從零開始搭建一個屬于自己的智能體。本教程的特點是 完全基于國產大模型與火山推理引擎實現,不用翻…

【STM32】外部中斷(上)

【STM32】外部中斷前言一、中斷系統1.1 什么是中斷1.2 中斷優先級1.3 中斷嵌套1.4 中斷執行流程二、NVIC2.1NVIC基本結構2.2 NVIC優先級分組三、EXTI3.1 EXTI 外部中斷(Extern Interrupt)3.2 EXTI基本結構3.3 AFIO復用IO口3.4 EXTI內部框圖前言 【STM32…

TimeDP Learning to Generate Multi-Domain Time Series with Domain Prompts論文閱讀筆記

TimeDP Learning to Generate Multi-Domain Time Series with Domain Prompts 摘要 在跨域時序數據生成任務中,提出使用”時間序列語義原型“模塊定義時間序列原型來表示時間序列基,每個原型向量作為“詞”表示一些基本的時間序列特征。應用原型分配模塊…

Ubuntu安裝NVIDIA顯卡驅動

清理舊驅動 sudo apt purge nvidia* libnvidia* sudo apt autoremovesudo find /etc -name *nvidia* -exec sudo rm -rf {} sudo rm -rf /usr/local/cuda*禁用 nouveau echo blacklist nouveau options nouveau modeset0 | sudo tee /etc/modprobe.d/blacklist-nouveau.conf…

硬件工程師成長之路:從入門到精通的技術旅程

文章目錄前言第一階段:基礎知識的積累理論知識儲備動手實踐第二階段:專業技能的提升PCB設計嵌入式系統開發第三階段:專業方向的選擇射頻(RF)工程電源設計高速數字電路FPGA/ASIC設計第四階段:工程管理與視野…

PyTorch 張量(Tensor)詳解:從基礎到實戰

1. 引言在深度學習和科學計算領域,張量(Tensor) 是最基礎的數據結構。PyTorch 作為當前最流行的深度學習框架之一,其核心計算單元就是張量。與 NumPy 的 ndarray 類似,PyTorch 張量支持高效的數值計算,但額…

CPTS---Hospital

端口掃描 nmap -A -p- -n -Pn -T4 10.10.11.241 22/tcp open ssh OpenSSH 9.0p1 Ubuntu 1ubuntu8.5 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 256 e1:4b:4b:3a:6d:18:66:69:39:f7:aa:74:b3:16:0a:aa (ECDSA) |_ 256 96:c1:dc:d8:97:20:95:e7:01:5…

【貪心算法】day5

📝前言說明: 本專欄主要記錄本人的貪心算法學習以及LeetCode刷題記錄,按專題劃分每題主要記錄:(1)本人解法 本人屎山代碼;(2)優質解法 優質代碼;&#xff…

軟考中級【網絡工程師】第6版教材 第4章 無線通信網 (上)

考點分析: 重要程度:??? 選擇題考查1 ~ 3分,案例分析可能考查填空和簡答 高頻考點:802.11信道與頻段、CSMA/CA、無線網絡優化、無線認證、無線配置步驟 新教材變化:新增4G/5G、刪除無線城域網 本章將詳述蜂窩移動通信系統、無線局域網以及無線個人網的體系結構和實用技…

vscode+EIDE+Clangd環境導入keil C51以及MDK工程

我最近一直在使用vscodeclangd的編譯環境替代了vscode自帶的c/c插件。感覺clangd的環境更加優秀,能夠更好找到函數、全局變量等定義調用等。如果使用keil C51以及MDK環境開發51單片機或者STM32單片機就需要使用到了EIDE這個插件這個插件現在能夠自動生成compile_com…

FTP - 學習/實踐

1.應用場景 主要用于學習和使用FTP服務,同時研究其架構實現, 以及日常開發中的使用。 FTP(文件傳輸協議)是一種用于網絡文件傳輸的標準協議,基于客戶端-服務器模型運行,通過控制通道(端口21)和…

【瑞吉外賣】手機號驗證碼登錄(用QQ郵件發送代替)

目錄 介紹 一、獲取授權碼 二、前端代碼修改 三、后端代碼修改 ①pom依賴 ②yml配置 ③控制層 ④業務層 ⑤工具類 介紹 本文介紹了QQ郵箱驗證碼登錄功能的實現步驟: 獲取QQ郵箱授權碼并配置;前端修改登錄頁面,增加驗證碼發送接口調…

為什么要用 Markdown?以及如何使用它

在處理大量文檔時,尤其是在構建知識庫、進行文檔分析或訓練大語言模型(LLM)時,將各種格式的文件(如 PDF、Word、Excel、PPT、HTML 等)轉換為統一的 Markdown 格式,能夠顯著提高處理效率和兼容性…