【Linux進程】進程狀態(運行阻塞掛起)

?

目錄

?

前言

?1. 進程狀態

?2. 運行狀態

?3. 阻塞狀態

?4. 掛起狀態

5. Linux中具體的狀態

總結


前言

? ? ? ? ?在Linux操作系統中,進程狀態非常重要,它可以幫助我們了解進程在系統中的運行情況,從而更好地管理和優化系統資源,在Linux系統中,進程可以處于不同的狀態,本文我們來聊一聊運行、阻塞、掛起這幾狀態;

在這里插入圖片描述

?1. 進程狀態

?????????在許多教材以及資料當中有許多對進程狀態的總結與描述,資料不同它們的描述也各有略同,但總都是一些概念,Linux進程狀態具體是什么?本文我們將從底層出發,聊一聊運行、阻塞、掛起這幾狀態;

?溫馨提示:如果在本文中某些名稱或者內容不太了解,可以先閱讀這篇文章:

Linux進程的理解

?2. 運行狀態

? ? ? ?從計算機硬件出發,我們寫的代碼生成可執行文件都被存儲在磁盤當中,想要讓程序運行就必須將程序加載到內存當中;

????????每一個程序(進程)都會有一個屬于自己的PCB,通過PCB來進行排隊,等待CPU的調度;

????????為了便于調度管理,操作系統會在內存當中維護一個叫運行隊列的結構,所有就緒狀態的進程的PCB會被加入到這個隊列當中;

????????CPU在調度執行時就會通過這個運行隊列拿到進程的PCB,進而調度執行該進程;

?????????只要進程在這個運行隊列當中,它的狀態就是運行狀態;每個CPU在系統中都會維護一個運行隊列;

?3. 阻塞狀態

? ? ? ? 了解完運行狀態,我們再來聊一聊阻塞狀態,阻塞狀態是建立在進程被調度執行的基礎上;

?????????在CPU執行一個進程時,都可能會或多或少的去訪問系統的某些資源,比如:我們使用的scanf,在執行時需要調用鍵盤(本質就是從鍵盤中讀取數據);

????????我們不輸入,鍵盤的數據就是沒有就緒(進程需要訪問的數據沒有就緒),此時進程無法繼續執行,需要等待數據;

狀態又是如何轉變的呢?

?????????操作系統和驅動程序它們對硬件進行管理,每個硬件都會有一個屬于自己的結構描述,通過指針鏈接,操作系統通過鏈表(dev_list)達到對硬件設施的管理;

????????當進程正在等待某個硬件的資源時,把進程的PCB加入到硬件設備結構描述的等待隊列當中,并把PBC的狀態設置為阻塞狀態;當PCB在這個等待隊列中等待數據資源時,這個狀態就叫做阻塞狀態;

?????????系統資源等待結束之后,操作系統會再次將等待隊列中的PCB移入到運行隊列當中,并把狀態修改為運行狀態,等待CPU的執行調度;

?4. 掛起狀態

?了解完阻塞狀態,我們來聊一聊掛起狀態;掛起全稱:阻塞掛起;

掛起是基于阻塞的一種狀態;

????????進程處于阻塞狀態時,并且內存不足的情況下就會出現;

? ? ? ? ?針對于這種情況,操作系統會將阻塞進程的代碼和數據置換到外設,此時該進程的狀態就被稱為掛起狀態;

? ? ? ? ?阻塞進程的代碼和數據一般會存放在磁盤的swap分區,當進程被操作系統調度時,被置換到外設的代碼和數據又會重新加載到內存;

?拓展補充

? ? ? ? ?一般情況下,swap分區的大小不會太大,大概等于內存的大小,過大的swap分區會導致操作系統過于依賴swap分區,導致效率變低;

5. Linux中具體的狀態

?說了這么多理論,那么在Linux中進程的狀態又是怎樣的?

static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};

這是Linux內核源碼對進程狀態的定義;它其實并沒有像阻塞掛起這樣的狀態;

我們也可以寫一個程序來測試一下:

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

在Linux環境下編譯運行,然后使用監控進行觀察:

while :; do ps ajx | head -1 && ps ajx | grep myprocess | grep -v grep; sleep 1; done
//myprocess是可執行文件的名稱

?觀察到的情況分為兩種,大多數是S+,極少數是R+:

????????主要是因為調用的printf,在輸出時需要調用顯示器,大多數的時間都是在等待顯示器;我們也可以寫一個空的死循環執行來觀察;

R狀態我們都知道是運行狀態,S狀態是什么?

? ? ? ? ?S(sleeping)休眠狀態,這里的睡眠是淺度睡眠,可以對發送的信號做出響應;

?這里的 “+” 號是什么意思?

? ? ? ? 進程被分為前臺進程和后臺進程,帶+號就表示是前臺進程;

  • 前臺進程:正常使用 ./可執行程序,這種執行方式運行起來就是前臺進程,前臺進程運行時,無論我們怎么輸入指令都無法被執行(Ctrl +c可終止進程)
  • 后臺進程:./ 可執行程序 &?這種執行方式運行起來就是后臺進程,后臺進程運行時,我們輸入的指令依然可以執行(Ctrl +c 無法終止進程,使用kill + 9 +進程pid 殺死進程)

?這里的S狀態其實就是上述阻塞狀態;

?D狀態

? ? ? ? ?D(disk sleep)也是休眠狀態,它是深度休眠,專門針對磁盤設計的;

?當進程需要將較大的數據寫入到磁盤當中,在等待磁盤寫入時進程的狀態就是休眠狀態;如果是S狀態:

????????在內存嚴重不足的情況下,操作系統沒辦法時會通過殺死進程的方式來節省資源;如果在等待的過程中進程被操作系統殺掉,并且磁盤寫入數據失敗,那么就會導致數據無法再加載(數據丟失);為了避免這種情況,就可以把等待數據寫入的進程狀態設為D狀態;

D狀態無法被殺掉(OS也不行),只能等待執行完畢后狀態轉換;

?注意:

如果用戶看到了D狀態,說明計算機幾乎要掛掉了

?T狀態

?T停止狀態(stopped): 可以通過發送 SIGSTOP 信號給進程來停止(T)進程。這個被暫停的進程可以通過發送 SIGCONT 信號讓進程繼續運行

kill -SIGSTOP  <進程ID>

?使用kill指令可以查看發送給信號的所有類型:

kill -l

?為什么要停止?

進程在訪問資源時,可能暫時不允許進程訪問,這時OS就會將進程的狀態設置為stop(T狀態)

?t狀態

t狀態也是停止狀態,Linux中沒有進行區分;

?主要出現在程序Debug時,在Debug的時候,遇到斷點,進程就暫停,此時就是t狀態

?在上述的D狀態、T狀態、t狀態其實都是阻塞狀態,阻塞可以等待硬件資源也可以等待軟件資源

?比如:一個進程等待另一個進程,進程的PCB里可以有PCB* wait_queue,比如gdb的進程等待Debug的進程;

?X狀態

? ? ? ? X狀態(死亡狀態),就是我們常說的終止狀態,它是一個瞬時狀態,不會在任務列表里看到這個狀態
?

?最后就是Z(zombie)僵尸狀態,僵尸狀態較為復雜,Linux系統中的僵尸進程狀態也是一種特殊的進程狀態,通常是指一個子進程已經結束運行,但其父進程還未對其進行善后處理(如調用wait()函數)。如果不及時清理僵尸進程,會導致系統資源泄漏,影響系統性能甚至造成系統崩潰;

?


總結

? ? ? ? ?本文主要從底層出發向大家介紹了運行、阻塞、掛起這幾種常見的狀態,并且將Linux中具體的狀態進行了一系列介紹,可以劃分為這幾種狀態;最后是僵尸狀態,僵尸狀態的情況較為特殊,如果不及時處理也會造成比較嚴重的后果,我們下期再來進行詳細的介紹,以上便是本文的全部內容,希望可以對你有所幫助,感謝閱讀!

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

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

相關文章

【Python筆記-設計模式】迭代器模式

一、說明 迭代器模式是一種行為設計模式&#xff0c;讓你能在不暴露集合底層表現形式&#xff08;列表、棧和樹等&#xff09;的情況下遍歷集合中所有的元素。 (一) 解決問題 遍歷聚合對象中的元素&#xff0c;而不需要暴露該對象的內部表示 (二) 使用場景 需要對聚合對象…

SpringBoot實現短鏈跳轉

目錄 1.背景介紹 2.短鏈跳轉的意義 3.SpringBoot中的代碼實現 1.建議短鏈-長鏈的數據庫表&#xff1a;t_url_map: 2.映射實體 3.Dao層實現 4.Service層實現 5.Controller層實現 3.結果測試 4.問題 1.背景介紹 短鏈跳轉是一種通過將長鏈接轉換為短鏈接的方式&…

南方電網的能源棋局上,蔚來換電扮演什么角色?

2 月 26 日&#xff0c;南網儲能科技與蔚來能源簽署協議&#xff0c;將充換電站、儲能站、可調負載等聚合資源連接到虛擬電廠平臺&#xff0c;推動換電站作為分布式儲能在虛擬電廠項目上的應用。 蔚來換電站是國內首個智慧微電網型分布式換電設施&#xff0c;可透過換電訂單預…

軟考-系統集成項目管理中級-信息系統建設與設計

本章重點考點 1.信息系統的生命周期 信息系統建設的內容主要包括設備采購、系統集成、軟件開發和運維服務等。信息系統的生命周期可以分為四個階段:立項、開發、運維和消亡。 2.信息系統開發方法 信息系統常用的開發方法有結構化方法、原型法、面向對象方法等 1)結構化方法 …

AI智能分析網關V4:抽煙/打電話/玩手機行為AI算法及場景應用

抽煙、打電話、玩手機是人們在日常生活中常見的行為&#xff0c;但這些行為在某些場合下可能會帶來安全風險。因此&#xff0c;對于這些行為的檢測技術及應用就變得尤為重要。今天來給大家介紹一下TSINGSEE青犀AI智能分析網關V4抽煙/打電話/玩手機檢測算法及其應用場景。 將監控…

java項目打包運行報異常:xxxxx-1.0-SNAPSHOT.jar中沒有主清單屬性

pom.xml中加入這段話即可 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.4.4</version><executions><execution><…

安泰ATA-7050高壓放大器在微流控細胞分選中的應用

微流控細胞分選是一種用于分離和鑒定生物樣本中特定類型細胞的技術&#xff0c;其原理基于將生物細胞通過微通道進行操縱和區分。微流控細胞分選的原理主要基于流體力學、電氣學、光學和熱力學等多學科的交叉應用。通過設計具有特定尺寸和性質的微通道網絡&#xff0c;可實現對…

RV1126芯片概述

RV1126芯片概述 前言1 主要特性2 詳細參數 前言 1 主要特性 四核 ARM Cortex-A7 and RISC-V MCU250ms快速開機2.0Tops NPU14M ISP with 3幀 HDR支持3個攝像頭同時輸入4K H.264/H.265 視頻編碼和解碼 2 詳細參數

萬人在線直播:構建高效穩定的音視頻架構

萬人在線大型直播音視頻架構解析 隨著網絡技術的發展,大型直播已成為人們生活中不可或缺的一部分。萬人在線直播音視頻架構是實現高清、流暢直播的關鍵。本文將深入探討這一架構的核心組成部分及其運作機制。 直播客戶端作為架構的基石,負責音視頻數據的采集、編碼、推流、…

永磁同步電機無感FOC(龍伯格觀測器)算法技術總結-仿真篇

文章目錄 1、觀測器的引入2、β軸向下的電機觀測器數學模型3、β軸向下的轉子點角度及速度觀測4、Simulink仿真模型搭建4.1模型總覽4.2 Luenberger觀測器模塊4.2.1 I_alpha觀測4.2.2 I_beta觀測4.2.3 e_alpha、e_beta觀測4.2.4 鎖相環 4.3 速度設定4.4 速度觀測結果4.5 電角度觀…

express+mysql+vue,從零搭建一個商城管理系統6--數據校驗和登錄

提示&#xff1a;學習express&#xff0c;搭建管理系統 文章目錄 前言一、修改models/user.js二、修改routes下的user.js三、Api新建user/login接口四、刪除數據庫原有數據&#xff0c;添加新驗證規則的用戶四、用戶登錄總結 前言 需求&#xff1a;主要學習express&#xff0c;…

SQL數學函數--pow(),abs() 函數 全面且詳細

一、冪運算函數: pow 語法: pow(double a, double p) 返回值: double 說明:返回a的p次冪 舉例&#xff1a; hive> select pow(2,4) ; 16.0 ???????二、絕對值函數: abs 語法: abs(double a) abs(int a) 返回值: double int 說明:返回數值a的絕對值 …

MacBook將iPad和iPhone備份到移動硬盤

#創作靈感# 一個是ICloud不夠用&#xff0c;想備份到本地&#xff1b;然而本地存儲不夠用&#xff0c;增加容量巨貴&#xff0c;舍不得這個錢&#xff0c;所以就想著能不能備份到移動硬盤。剛好有個移動固態&#xff0c;所以就試了一下&#xff0c;還真可以。 #正文# 說一下邏…

《PyTorch深度學習實踐》第八講加載數據集

一、 1、DataSet 是抽象類&#xff0c;不能實例化對象&#xff0c;主要是用于構造我們的數據集 2、DataLoader 需要獲取DataSet提供的索引[i]和len;用來幫助我們加載數據&#xff0c;比如說做shuffle(提高數據集的隨機性)&#xff0c;batch_size,能拿出Mini-Batch進行訓練。它…

Windows10環境下MongoDB安裝配置

1. 下載對應MongoDB安裝包 進入官網&#xff1a;MongoDB官網 如果不連接外網則在官網下載較慢&#xff0c;這里給出下載好的安裝包&#xff0c;版本為4.2.25&#xff1a;百度網盤 選擇你需要的版本&#xff0c;推薦選擇Package的格式為zip&#xff08;解壓即可&#xff09; Pa…

[VNCTF2024]-PWN:preinit解析(逆向花指令,繞過strcmp,函數修改,機器碼)

查看保護&#xff1a; 查看ida&#xff1a; 這邊其實看反匯編沒啥大作用&#xff0c;需要自己動調。 但是前面的繞過strcmp還是要看一下的。 解題&#xff1a; 這里是用linux自帶的產生隨機數的文件urandom來產生一個隨機密碼&#xff0c;然后讓我們輸入密碼&#xff0c;用st…

k8s 存儲卷詳解與動靜部署詳解

目錄 一、Volume 卷 1.1 卷類型 emptyDir &#xff1a; hostPath&#xff1a; persistentVolumeClaim (PVC)&#xff1a; configMap 和 secret&#xff1a; 二、 emptyDir存儲卷 2.1 特點 2.2 用途&#xff1a; 2.3 示例 三、 hostPath存儲卷 3.1 特點 3.2 用途 …

前端mock數據 —— 使用Apifox mock頁面所需數據

前端mock數據 —— 使用Apifox 一、使用教程二、本地請求Apifox所mock的接口 一、使用教程 在首頁進行新建項目&#xff1a; 新建項目名稱&#xff1a; 新建接口&#xff1a; 創建json&#xff1a; 請求方法&#xff1a; GET。URL&#xff1a; api/basis。響應類型&#xff1…

可以用numpy為for加速

Numpy除了用于科學計算&#xff0c;還有一個功能是可以代替某些for循環&#xff0c;進行同樣的功能實現&#xff0c;有于是向量矩陣運算&#xff0c;碰到復雜的for時&#xff0c;計算速度可以提高&#xff0c;從而提高程序性能。以下是一些常用的NumPy函數和操作&#xff0c;可…

Socket網絡編程(六)——簡易聊天室案例

目錄 聊天室數據傳輸設計客戶端、服務器數據交互數據傳輸協議服務器、多客戶端模型客戶端如何發送消息到另外一個客戶端2個以上設備如何交互數據&#xff1f; 聊天室消息接收實現代碼結構client客戶端重構server服務端重構自身描述信息的構建重構TCPServer.java基于synchronize…