實操(進程狀態,R/S/D/T/t/X/Z)Linux

1 R 狀態并不直接代表進程在運行,而是該進程在運行隊列中進行排隊,由操作系統在內存維護的隊列

#include <stdio.h>
#include <unistd.h>int main()
{while(1){printf("我在運行嗎\n");sleep(1);}return 0;
}

?查看狀態(ps ajx | grep mytest | grep -v grep)

  • 這里printf本質是向外設打印消息,你在頻繁打印時,外設可能沒就緒,當前進程不在cpu排隊,只在外設中排隊,等設備就緒了,才把數據寫到外設中
  • S狀態是阻塞狀態的一種,以休眠的狀態進行阻塞,并沒有一直在cpu運行隊列中,是因為printf而導致等待某中資源
#include <stdio.h>
#include <unistd.h>int main()
{while(1){//printf("我在運行嗎\n");//sleep(1);}return 0;
}

?查看狀態(ps ajx | grep mytest | grep -v grep)

  • 注釋掉就變成R了,代碼中沒有任何訪問資源的代碼,whike循環判斷就是一種計算,當前的代碼就是純計算代碼,在進程調度的生命周期里,只會用cpu資源,只要被調度一定是R狀態
  • 本質就是因為cpu太快了,訪問外設,操作系統頻繁的將進程從外設隊列拿到cpu運行隊列,或者cpu運行隊列拿到外設隊列

?2 ?S 休眠狀態,可中斷休眠,本質就是一種阻塞狀態

#include <stdio.h>
#include <unistd.h>int main()
{while(1){int a = 0;scanf("%d", &a);printf("%d", a);}return 0;
}

?查看狀態(ps ajx | grep mytest | grep -v grep)

  • scanf在等你從鍵盤里輸入,進程沒有被調度,它當前所等的資源沒有就緒,它不會在運行隊列中等,而是在鍵盤中等,等鍵盤有數據了,在把當前進程pcb放到運行隊列里調度,讀取數據;它在等鍵盤資源,這種狀態就叫做阻塞,換句話說就是卡住了,如果不想等了,ctrl+c可以中斷此進程

3 D 休眠狀態,不可中斷休眠

場景:進程想往磁盤中寫入100MB的數據


進程:“磁盤你出來,我現在有數據要交給你,幫我存一下”
磁盤:“你想存多少數據存到哪里?”
進程:“磁盤的角落,我需要把數據保存一下,我一定要寫完數據之后CPU才讓我去跑”
磁盤:“我這個外設太慢了,所以寫100 MB要等等我哦”
這個進程把自己設置成阻塞狀態S,自己就在磁盤的內核數據結構當中進行排隊,cpu就先執行其他人的代碼了,在磁盤進行拷貝的時候,操作系統路過,他作為一個內存的管理者,發現現在內存資源特別緊張
操作系統:“你這個進程在干什么呢?怎么什么都不干在這里等?你沒看系統忙成什么樣子了,內存已經嚴重不足了,我要把你殺掉”(如果你的系統資源嚴重不足,操作系統會干掉一些不怎么正常工作的進程)
干掉的同時磁盤在寫數據,寫的時候發現好像不行了,因為磁盤空間不足了,反正就是因為一些原因,我寫失敗了,這個時候他就去找進程
磁盤:“你這個數據寫入失敗了”
他突然發現人不見了,這個時候就只剩磁盤拿著100 MB的數據在風中流浪,磁盤想著把這個數據丟了,但是萬一這個數據是銀行的轉賬信息呢,保留吧又不知道保存在哪,保存在我的位置,可是對應的進程又不知道我存在什么地方,下次你找我要的時候我忘了怎么辦;反正磁盤就是個辦事的,讓它存哪就存了,但是現在進程沒了,這份數據萬一被搞丟了,到底是這三個人(操作系統、進程、磁盤),其中哪一個人的鍋呢?

問題的根就在于誰叫你操作系統能殺掉進程呢?源碼的設計者突然發現,我們只要保證這個進程不能被殺死不就行了嗎?所以我們就有了一種狀態,休眠狀態D;在linux當中如果一個進程屬于D狀態,該進程無法被殺死,即便是操作系統,也無法殺死D狀態進程,如果這個進程刀槍不入,剛剛的問題就不會產生了,只有當這個D狀態,自己醒來才可以殺掉它,其實還有另一個辦法就是關機重啟,但有時候如果有D狀態,可能都無法正常關機,只要你查到了D狀態,基本上你這個機器已經快宕機了,這個時候只能是拔電源,此時數據丟失的損失就需要你自己承擔了,不過99%的情況不會出現D狀態,哪怕出現一個,當前的系統也已經快要掛了,因為這個D狀態應該一瞬間就完成,主要原因是當前你的磁盤已經非常卡了,壓力很大,來不及給你進行數據寫入,再有兩三個D狀態,再來一些I/O,機器就直接掛掉了,出現宕機;這個D狀態如果做應用開發不用關心,一般是做運維的要關心

?4?T 暫停狀態

  • 比如說有一個進程,操作系統不允許你往顯示器上打印消息,但這個用戶就是往顯示器上打印消息,此時為了攔截這個進程的非法行為,操作系統可能把這個進程暫停;休眠和暫停有什么區別,休眠通常是等待某種資源,是真正的阻塞狀態,而是操作系統是在不殺掉這個進程的情況下,停止這個進程的某些行為,比如你想訪問網卡操作系統,發現不能讓你訪問,但這個用戶想要訪問網卡代碼,操作系統就有可能暫停他了,就是你訪問一些你沒有權利訪問的資源操作系統,有時候不想殺掉進程,他就會把你暫停
#include <stdio.h>
#include <unistd.h>int main()
{int count = 0;while(1){printf("我在運行嗎?%d\n", count++);sleep(1);}return 0;
}

?查看狀態(ps ajx | grep mytest | grep -v grep)?

? 暫停進程(kill -19),查看狀態(ps ajx | grep mytest | grep -v grep)

讓進程繼續(kill -18),?查看狀態(ps ajx | grep mytest | grep -v grep)?

現在有兩個現象,ctrl+c終止不了進程,S+狀態變成了S,查進程的時候狀態,如果帶了+號,證明該進程是在前臺運行的,前臺運行可以ctrl+c終止它,但如果沒有+號,意味著這個進程是在后臺運行的,你可以繼續執行你的shell指令,但它在后臺還會繼續執行自己的代碼,可以用9號信號干掉它,(kill -9)

5 追蹤式的暫停

  • 關于暫停有一種場景,大家是可以理解的,在調試的時候你不打斷點,你直接運行進程就跑完了,但如果你打了個斷點,你發現當你而運行,他會在斷點處停下來斷點處停下來的本質就是讓進程暫停這就是為什么有時候執行的bug的時候調試某些代碼的時候,我調到一部分想讓他暫停遇到斷點,他會停下來,讓我去查看他的上下文,就是把這個進程暫停了,我們證明一下

makefile(第2行加一個 -g)

  1 mytest:test.c2     gcc -o $@ $^ -g                                                                3 .PHONY:clean4 clean:5     rm -f mytest

開始調試(gdb ./mytest)

查看狀態(ps ajx | grep mytest | grep -v grep)?

  • ?查到的t是被追蹤狀態,我啟動的mytest進程,r的時候開始跑,遇到斷點處就停下來了,表示追蹤式的暫停,也是暫停的一種,為什么我們在打斷點他就停下來了,根本原因是gdb遇到斷點處,它會向你的進程發送暫停信號讓你停下來

?6 X && Z

我們為什么創建進程?因為我們要讓進程幫我們辦事,有時候我們會關心結果,有時候不關心結果,當我們想關心結果的時候,我們可以查看進程退出碼,?比如我們的預期結果是100,返回1表示代碼有問題,結果不對

#include <stdio.h>
#include <unistd.h>int main()
{int x = 10;if (x == 100) return 0;else return 1;
}

查看退出碼(echo $?)

X 死亡狀態,發生在一瞬間,幾乎查不到,如果一個進程退出了,立馬X狀態,立馬退出,退出之后進程的所有歷史痕跡,全部被操作系統殺掉,你作為父進程有沒有機會拿到退出結果呢?在Linux中,當進程退出的時候,一般進程不會立即徹底退出,而是要維持一個狀態Z,叫做僵尸狀態,方便后續父進程或者是操作系統讀取該子進程退出的退出結果

比如有一天你去一個地方跑步,跑著跑著,突然看到前面有一個人倒在地板上一動不動,這個時候你撥打了110、120,就在旁邊等著救護人員的到來,警察來之后,第一件事情是封鎖現場,讓法醫先確認這個人的死因是什么,確認這個人是自然死亡的,警察就會通知家屬,讓他們去處理,拉到火葬場等等,剛剛這個場景,人倒在地上沒有被立即銷毀,當警察檢查這個人的狀態時,這個人的狀態就叫做僵尸狀態,為什么要讓他處于僵尸狀態?方便別人來甄別他退出的原因是什么,所以進程要維持短暫的僵尸狀態,關于如何處理,我們下一篇再來談回收,今天重點談狀態

如何讓我們看到僵尸的狀態呢?子進程退出,但是不要回收子進程(目前還沒了解到),換句話說,只要我們寫出來一個父子進程,先讓子進程退出,父進程先不退,子進程一退所處的狀態就是僵尸狀態

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>int main()
{pid_t ret = fork();if (ret == 0){//子進程while(1){printf("我是子進程,pid:%d, ppid:%d\n", getpid(), getppid());sleep(1);}}else{//父進程while(1){printf("我是父進程,pid:%d,ppid:%d\n", getpid(), getppid());sleep(1);}}return 0;
}

運行顯示 (./mytest)

?查看狀態(ps ajx | grep mytest | grep -v grep)?

?殺掉子進程(kill -9 [PID]),查看狀態(ps ajx | grep mytest | grep -v grep)

?

雖然我們還沒談到回收,我們可以先來了解,如果不回收會造成什么問題呢?如果我們不釋放操作系統,它就要維持這個進程的狀態、相關的數據結構,也就是pcb,如果不釋放,它曾經申請占用的資源就會一直被占用,創建進程就是申請內存 申請了內存但是長時間不歸還,導致系統能用的資源越來越少,這叫做內存泄露問題,一旦我們回收了進程,就會從Z狀態瞬間變成X狀態,進而操作系統才會真正釋放進程的所有資源,如何回收我們下一個篇章再進行談論

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

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

相關文章

React 文件上傳新玩法:Aliyun OSS 加持的智能上傳組件

文件上傳是前端開發中的“老朋友”&#xff0c;但如何讓它既簡單又強大&#xff0c;還能無縫對接云端存儲&#xff1f;今天&#xff0c;我要帶你認識一個超酷的 React 組件 AliUploader&#xff0c;它不僅支持拖拽上傳、批量編輯和文件排序&#xff0c;還直接把文件傳到 Aliyun…

LabVIEW多線程

在 LabVIEW 中&#xff0c;多線程編程是提升程序執行效率的關鍵手段&#xff0c;尤其是在需要并行處理數據采集、控制執行和用戶界面交互的場景下。LabVIEW 本身是基于數據流&#xff08;Dataflow&#xff09;的編程語言&#xff0c;天然支持多線程&#xff0c;但要高效利用多線…

圖解AUTOSAR_SWS_LINStateManager

AUTOSAR LIN狀態管理器(LinSM)詳細設計 文檔摘要 本文檔提供了AUTOSAR LIN狀態管理器(LinSM)模塊的詳細設計解析,包括架構、狀態機、睡眠喚醒流程以及配置結構。通過圖形化方式展現LinSM在AUTOSAR通信棧中的作用及其與其他模塊的交互關系。 目錄 AUTOSAR LIN狀態管理器(Lin…

python+form+opengl顯示動態圖形數據

說明&#xff1a; pythonformopengl顯示動態圖形數據 我希望做一款動態opengl圖形數據 1.用python腳本&#xff0c;輸入指定參數 2.生成一組數據&#xff0c; 3.將數據保持成本地文件 4.在c#中調用此文件&#xff0c;解析 5.將數據用opengl展示 效果圖: step1:添加依賴 C:\U…

Android Gradle、Android Gradle Plugin、BuildTool關系

1. Gradle 的定位&#xff1a;通用構建工具 Gradle 是一個通用的跨平臺構建工具&#xff0c;支持多種語言&#xff08;如 Java、Kotlin、C&#xff09;和項目類型 它的核心功能包括&#xff1a; ?任務自動化&#xff1a;通過 Groovy/Kotlin DSL 腳本定義編譯、測試、打包等…

DHCP之報文格式

字段說明&#xff1a; op (op code): 表示報文的類型&#xff0c;取值為 1 或 2&#xff0c;含義如下 1:客戶端請求報 2:服務器響應報文 Secs (seconds):由客戶端填充&#xff0c;表示從客戶端開始獲得 IP 地址或 IP 地址續借后所使用了的秒數&#xff0c;缺省值為 3600s。 F…

觀察者模式在Java微服務間的使用

一.、使用RabbitMQ來實現 (1) 生產者&#xff08;訂單微服務&#xff09; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.stereotype.Service;Service public class OrderService {private final RabbitTemplate rabbitTemplate;…

OSPF五種數據包詳解

一、OSPF頭部封裝 OSPF是跨四層封裝協議&#xff0c;直接封裝在網絡層之上&#xff0c;需要IP協議使用一個協議號來標定——89。 OSPF頭部結構&#xff1a; 版本&#xff1a;標識OSPF的版本&#xff0c;OSPFv2&#xff08;2&#xff09;、OSPFv3&#xff08;3&#xff09;&am…

NO.64十六屆藍橋杯備戰|基礎算法-簡單貪心|貨倉選址|最大子段和|紀念品分組|排座椅|矩陣消除(C++)

貪?算法是兩極分化很嚴重的算法。簡單的問題會讓你覺得理所應當&#xff0c;難?點的問題會讓你懷疑?? 什么是貪?算法&#xff1f; 貪?算法&#xff0c;或者說是貪?策略&#xff1a;企圖?局部最優找出全局最優。 把解決問題的過程分成若?步&#xff1b;解決每?步時…

Linux(十二)信號

今天我們就要來一起學習信號啦&#xff01;&#xff01;&#xff01;還記得小編在之前的文章中說過的ctrlc嗎&#xff1f;之前小編沒有詳細介紹過&#xff0c;現在我們就要來學習啦&#xff01;&#xff01;&#xff01; 一、信號的基本介紹 首先&#xff0c;小編帶領大家先一…

Dify開發實戰-自制插件 和安裝python3最新版本 記錄版本 后續會持續更新

自定義插件 Dify 插件腳手架工具Python 環境&#xff0c;版本號 ≥ 3.12 安裝Python 一 進入官網 https://www.python.org/downloads/windows/ 點擊下載 二、安裝python&#xff08;本文中有借鑒其他圖片 所以圖片展示python版本可能不一致 請忽略&#xff09; 1.雙擊打開py…

Docker安裝、配置Redis

1.如果沒有docker-compose.yml文件的話&#xff0c;先創建docker-compose.yml 配置文件一般長這個樣子 version: 3services:redis:image: redis:latestcontainer_name: redisports:- "6379:6379"command: redis-server --requirepass "123456"restart: a…

Parasoft C++Test軟件單元測試_操作指南

系列文章目錄 Parasoft C++Test軟件靜態分析:操作指南(編碼規范、質量度量)、常見問題及處理 Parasoft C++Test軟件單元測試:操作指南、實例講解、常見問題及處理 Parasoft C++Test軟件集成測試:操作指南、實例講解、常見問題及處理 進階擴展:自動生成靜態分析文檔、自動…

二級索引詳解

二級索引詳解 二級索引(Secondary Index)是數據庫系統中除主鍵索引外的附加索引結構,用于加速基于非主鍵列的查詢操作。以下是關于二級索引的全面解析: 一、核心概念 特性主鍵索引 (Primary Index)二級索引 (Secondary Index)唯一性必須唯一可以唯一或非唯一數量每表只有…

Python_level1_字符串_11

目錄 一、基本概念 二、字符串基本操作&#xff1a;【索引、切片、遍歷】 1.字符串與列表&#xff08;相同&#xff09; 1&#xff09;索引&#xff08;從0開始&#xff09;(可以獲取某一個/某幾個連續的字符) 2&#xff09;切片 [xx:xx] 與 列表 語法規則一樣 [起…

Axure數據可視化科技感大屏設計資料——賦能多領域,展示無限價值

可視化大屏如何高效、直觀地展示數據&#xff0c;并將其轉化為有價值的決策依據&#xff0c;成為了許多企業和組織面臨的共同挑戰。Axure大屏可視化模板&#xff0c;作為一款強大的數據展示工具&#xff0c;正在以其出色的交互性和可定制性&#xff0c;賦能多個領域&#xff0c…

MySQL 性能調優:數據庫的極限運動訓練

就像運動員需要不斷訓練才能突破極限&#xff0c;數據庫也需要各種調優才能跑得更快…讓我們一起給 MySQL 安排一套專業的"健身計劃"&#xff01; 什么是 MySQL 性能調優&#xff1f;&#x1f914; MySQL 性能調優是指通過各種配置優化、結構調整和查詢改進&#x…

4.5/Q1,GBD數據庫最新文章解讀

文章題目&#xff1a;Emerging trends and cross-country health inequalities in congenital birth defects: insights from the GBD 2021 study DOI&#xff1a;10.1186/s12939-025-02412-7 中文標題&#xff1a;先天性出生缺陷的新趨勢和跨國健康不平等&#xff1a;GBD 202…

基于DeepSeek、ChatGPT支持下的地質災害風險評估、易發性分析、信息化建庫及災后重建

前言&#xff1a; 地質災害是指全球地殼自然地質演化過程中&#xff0c;由于地球內動力、外動力或者人為地質動力作用下導致的自然地質和人類的自然災害突發事件。在降水、地震等自然誘因的作用下&#xff0c;地質災害在全球范圍內頻繁發生。我國不僅常見滑坡災害&#xff0c;還…

Linux | 安裝超級終端串口軟件連接i.MX6ULL開發板(8)

01 它的安裝步驟也非常簡單,安裝語言選擇中文簡體,點擊確定,如下圖所示。 點擊下一步,如下圖所示。 02