Linux基礎之進程-進程狀態

目錄

一、進程狀態

1.1 什么是進程狀態

1.2 運行狀態

1.2 阻塞狀態

1.3 掛起狀態

二、Linux操作系統上具體的進程狀態

2.1 狀態

2.2 R 和 S 狀態的查看

2.3 后臺進程和前臺進程

2.4 休眠狀態和深度休眠狀態


一、進程狀態

1.1 什么是進程狀態

? ? ? ?首先我們知道我們的操作系統是通過我們的PCB來管理我們的進程的,那么我們的狀態這個屬性一定在我們的PCB這個結構體里(其在PCB中是一個整形字段)。用簡單的話來說,用宏定義(也可能是其他方式)了幾個值,用這幾個值來代表我們不同的狀態。

#define NEW 1
#define RUNNING 2
#define BLOCK 3struct PCB
{...//其他屬性int status;//狀態
}//通過改變status的值來代表改變進程的狀態

根據一些教材上的描述,進程大概會有以下的一些狀態。

(圖片來源于網絡)。
? ? ? ?接下來我就來給大家好好介紹一下這些狀態(其中創建狀態、就緒狀態和運行狀態我統一歸結為運行狀態)。

1.2 運行狀態

? ? ? ?在上文回答第四個問題的時候,我有提到過一個運行隊列的概念,它提供了一種有序執行任務的機制,使得任務的執行順序可控,并能夠有效地利用系統資源。所以我們的OS會維護一個運行隊列去存放我們的進程,而我們的CPU則會去執行該隊列PCB所指的代碼。

由此,我們的出一個概念:

不管一個進程是否在被處理,只要其PCB加入了運行隊列,我們就稱其處在運行狀態。

1.2 阻塞狀態

? ? ? ?我們的代碼一定會或多或少的會訪問系統中的某些資源,比方說:鍵盤、硬盤等等,在比方說我們的scanf()和cin>> ,本質上都是從我們的鍵盤上讀取數據,那要是我們一直不輸入怎么辦,那是不是我們的程序會一直卡在那,不動了。為什么會不動呢,因為需要的數據沒有就緒,也就是我們進程要訪問的資源沒有就緒,條件不具備,我們的代碼就沒辦法往下執行。
? ? ? ?我們的OS要管理我們的進程,也同樣會去管理我們的硬件資源,也就是說我們設備的資源充不充足,有沒有就緒,OS是知道的,怎么知道的呢,通過維護我們的硬件資源的dev_list。但這個
list多個一個屬性:PCB* wait_queue。也就是說,當我們的設備資源不充足時,我們對應的PCB就會加入到該設備的這個等待隊列中,而我們把在設備的等待隊列中的PCB的狀態叫做阻塞狀態

通過這部分的講解,我們可以得到一個結論:

進程狀態變化的本質:

1.更改PCB 對應的status變量的值

2.將PCB鏈入到我們不同的隊列當中

1.3 掛起狀態

? ? ? ?如果一個進程當前被阻塞了,那就注定了這個進程在其所需要的資源沒有就緒之前是不會被調度的。那么如果這個時候我們的操作系統內的內存資源嚴重不足了該怎么辦?
? ? ? ?我們的操作系統在我們的磁盤中劃分了一個叫做swap的分區,其作用就是在我們OS的內存資源不足的時候,換取一些資源回來。怎么換呢?換誰呢?就換我們處于阻塞狀態的進程。
?
? ? ? ?將我們的PCB的數據(是數據置換了,留出空間,而不是這個進程沒有了)置換到我們的swap分區,置換之后我們的進程所處狀態就叫掛起狀態。
? ? ? ?這個時候可能有人會問,OS不是非常注重效率的嗎,其主動去訪問我們的磁盤,不會降低我們OS的效率嗎?確實會影響我們OS的效率,但是這個時候OS都快掛掉了,所以優先考慮的問題是讓OS運行下去。
? ? ? ?當之后我們的資源空閑出來,我們的進程被重新調度時,曾經被置換出去的數據和代碼,又會被重新置換回來。

二、Linux操作系統上具體的進程狀態

2.1 狀態


先來看看再kernal內核里的代碼

/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
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 */
}
  • R運行狀態(running): 并不意味著進程一定在運行中,它表明進程要么是在運行中要么在運行隊列里。
  • S睡眠狀態(sleeping): 意味著進程在等待事件完成(這里的睡眠有時候也叫做可中斷睡眠(interruptible sleep))。
  • D磁盤休眠狀態(Disk sleep)有時候也叫不可中斷睡眠狀態(uninterruptible sleep),在這個狀態的進程通常會等待IO的結束。
  • T停止狀態(stopped): 可以通過發送 SIGSTOP 信號給進程來停止(T)進程。這個被暫停的進程可以通過發送 SIGCONT 信號讓進程繼續運行。
  • X死亡狀態(dead):這個狀態只是一個返回狀態,你不會在任務列表里看到這個狀態。

2.2 R 和 S 狀態的查看

我們可以通過我們的代碼和我們的指令來查看我們的進程狀態,先寫一段代碼。

可以看到我們的狀態如下
? ? ? 其中STAT(status)就代表我們的狀態欄,可以看到我們的程序,一直明明在跑,卻處于我們的S(即阻塞狀態)狀態,這是為什么呢?其實我們的CPU速度是很快的,程序其實已經走完了,但是我們的printf語句是需要訪問我們的外設的(顯示器),訪問外設又是一個比較慢的過程,所以該進程的大部分時間都處于S狀態。那如果我們不輸出呢?

可以看到我們的進程狀態就可以被觀測到處于我們的R狀態(運行狀態)。至于這個+號是什么意思,我們馬上就能知道了。

2.3 后臺進程和前臺進程

有+號代表是前臺進程,沒有的代表是后臺進程。
首先這兩個概念是什么意思呢?

前臺進程:進程在被執行時,無法使用其他的指令,且其可以被ctrl + C 強行終止掉

后臺進程:進程在被執行時,可以使用其他的指令,但是不能被ctrl + C 強行終止掉,所以需要kill將其殺掉。

那怎么將我們的進程變成一個后臺進程呢?

在執行我們的程序時,在其后面加上一個 &
類似于: ./mybin &

給大家演示一下:

? ? ? 可以看到我們在邊執行程序的時候還可以使用我們的指令(如果要終止這個進程使用指令 kill -9 + 該進程的PID)。

2.4 休眠狀態和深度休眠狀態

? ? ? ?對于這個狀態給大家舉個例子就能理解了,假設我們有一個進程正在向磁盤中存放數據(數據量有點大),由于訪問我們的硬件速度很慢,我們的進程就會進入我們的S狀態(即阻塞狀態),如果這個時候我內存資源已經不夠,swap分區也不夠用了,需要干掉一些進程來存活,那恰好就把這個還在等待磁盤返回結果的進程干掉了,其數據全都釋放了。那此時,如果我們的磁盤存儲失敗了,那我們的這部分數據就丟失了,那是不是很容易造成很嚴重的影響。所以就有了我們深度睡眠狀態D,不可被中斷。

D磁盤休眠狀態(Disk sleep)有時候也叫不可中斷睡眠狀態(uninterruptible sleep),在這個狀態的進程通常會等待IO的結束。

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

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

相關文章

分布式光伏監控系統功能模塊詳解

目前,分布式光伏發電系統的總容量比較小,并且光伏電站的功率受外界環境影響容易出現大起大落的現象。這使電壓調整變得很困難。光伏電站運行維護人員不足,長時間不保養維護會影響光伏電站的發電效率。針對上述問題,鷓鴣云基于無線…

天銳綠盾|設計院圖紙透明加密軟件、制造業文件資料防止外泄

#圖紙加密軟件# 天銳綠盾是一家專注于數據安全解決方案的提供商,其產品主要為企業級用戶設計,旨在保護敏感信息和知識產權免遭未經授權的訪問或泄露。"天銳綠盾"的圖紙透明加密軟件和機械制造業文件資料防止外泄系統,是專為設計院…

JS中的宏任務和微任務

JavaScript 引擎是建立在一個事件循環系統之上的,它實時監控事件隊列,如果有事件就執行,如果沒有事件就等待。事件系統是一個典型的生產消費模式,生產者發出事件,接收者監聽事件,在UI 開發中是常見的一個設…

Modbus TCP轉CAN網關在不同行業中的應用以及其使用上的優勢

倍訊科技Modbus TCP轉CAN網關通常被用于工業自動化領域,特別是在需要連接現有Modbus TCP網絡和CAN總線設備的場景中。以下是該網關在不同行業中的應用以及其使用上的優勢: 1. 制造業: - 在制造業中,各種類型的設備和機器通常使用不…

Java項目實現報文數據校驗注解方式(必輸項、值大小)

普通項目 導入校驗依賴 <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>4.1.0.Final</version></dependency><dependency><groupId>javax.validation</…

Docker安裝Redis,并在 Visual Studio Code 中使用它

Docker安裝Redis 查找Redis docker search Redis完整結果 PS C:\Users\cheng> docker search Redis NAME DESCRIPTION STARS OFFICIAL redis Redis is an open …

System V IPC(進程間通信)機制詳解

文章目錄 一、引言二、System V IPC的基本概念1、IPC結構的引入2、IPC標識符&#xff08;IPC ID&#xff09;3、S ystem V的優缺點 三、共享內存&#xff08;Shared Memory&#xff09;1、共享內存的基本概念2、共享內存的創建&#xff08;shmget&#xff09;3、共享內存的附加…

C++:并發保護

一、前言 本文將會通過保護一個數據討論&#xff1a;互斥鎖、雙重檢查鎖、 std::once_flag 類、 std::call_once() 函數、單例模式、使用局部靜態變量實現單例模式等。 二、保護共享數據 假設我們需要某個共享數據&#xff0c;而它創建起來開銷不菲。因為創建它可能需要建立…

vim中的替換

:[range]s/pattern/replacement/flags 這里各部分的含義是&#xff1a; :[range]&#xff1a;可選的行范圍&#xff0c;用于指定在哪些行之間進行替換。如果省略&#xff0c;則默認為當前行。例如&#xff0c;1,10 表示在第1行到第10行之間替換&#xff0c;% 表示在整個文件中…

python的文件操作及函數式編程介紹

五、文件操作 1、讀取鍵盤輸入 input 獲取標準輸入&#xff0c;數據類型統一為字符串 #!/usr/bin/python # -*- coding: UTF-8 -*- str input("請輸入&#xff1a;") print&#xff08;"你輸入的內容是: ", str&#xff09; 這會產生如下的對應著輸入的…

KeyShot 2023.3 Pro for mac/win:完美融合3D渲染與動畫制作

在當今數字化時代&#xff0c;視覺內容的創作和表現越來越受到重視。無論是產品設計、建筑規劃&#xff0c;還是影視特效&#xff0c;都需要具備出色的3D渲染和動畫制作工具來展現創意和想法。而作為業內領先的3D渲染和動畫制作軟件之一&#xff0c;KeyShot 2023.3 Pro在這個領…

電腦剛開機的時候不卡,用一會就變卡頓了…怎么回事?

前言 昨天咱們聊到舊電腦更換了固態硬盤之后&#xff0c;開機就會變快的事情&#xff0c;這個確實是可行且有效的升級電腦辦法之一。 看完這篇之后&#xff0c;切莫著急升級電腦硬件配置&#xff0c;因為這里的坑比你想象的還要多。 從機械硬盤測試的數據和固態硬盤的測試數…

類與面向對象編程(Object-Oriented Programming, OOP)

類與面向對象編程&#xff08;Object-Oriented Programming, OOP&#xff09;&#xff08;一&#xff09; 對象比較&#xff1a;‘is’ 對比 ‘’ 當我還是個孩子的時候&#xff0c;我們的鄰居擁有一對雙胞胎貓咪。它們看起來幾乎一模一樣—同樣的炭黑色毛發和同樣銳利的綠色…

2024年港口危貨安全管理證報名條件

危化品安全員證報考條件 1、職業道德良好&#xff0c;身體健康&#xff0c;年齡不超過60周歲(法定代表人除外). 2、建筑施工企業的在職人員。 3、學歷及要求: (1)建筑施工企業主要負責人應為大專以上學歷&#xff0c;需大專以上學歷&#xff0c;除企業法人外&#xff0c;其他…

linux進階高級配置,你需要知道的有哪些(11)-YUM倉庫服務與PXE網絡裝機

1、基于RPM包構建的軟件更新機制 可以自動解決依賴關系 所有軟件包由集中的YUM軟件倉庫提供 2、軟件倉庫的提供方式 FTP服務&#xff1a;ftp://...... HTTP服務&#xff1a;http://...... 本地目錄&#xff1a;file:///...... 3、客戶端YUM命令 &#xff08;1&#xff0…

從CSDN搬家到微信公眾號

博主將會在微信公眾號里不斷輸出精品內容&#xff0c;陪伴大家共同成長。 如果你對博主的經歷感興趣&#xff0c;或者對博主的IT技術感興趣&#xff0c;歡迎關注我的微信公眾號&#xff0c;閱讀我的技術文章&#xff0c;免費獲取各種IT資源。也可以加我的微信成為我的好友&…

檔案數字化加工是如何利用檔案的

檔案數字化加工是將紙質檔案轉化為數字形式&#xff0c;并進行后續的加工和利用。通過檔案數字化加工&#xff0c;可以實現以下幾個方面的利用&#xff1a; 1. 存儲和保護&#xff1a;數字化檔案可以將大量的紙質檔案存儲在數字存儲介質中&#xff0c;從而節省空間和維護成本。…

TypeScript學習日志-第二十五天(編寫發布訂閱模式)

編寫發布訂閱模式 這是更具訂閱模式寫的代碼 可以理解訂閱模式的思想 interface I {events:Map<string,Function[]>once:(event:string,callback:Function)>void // 觸發一次on:(event:string,callback:Function)>void // 訂閱emit:(event:string,...args:any[])…

FileUpload控件

FileUpload控件是一個在Web應用程序中常用的界面元素&#xff0c;它允許用戶從客戶端選擇文件&#xff0c;并將該文件上傳到Web服務器。以下是關于FileUpload控件的一些詳細信息&#xff1a; 基本功能&#xff1a;FileUpload控件通常顯示為一個文本框和一個“瀏覽”按鈕。用戶…

面試算法之哈希專題

贖金信 class Solution { public:bool canConstruct(string ransomNote, string magazine) {// 小寫字母int r_cnt[26];int m_cnt[26];for(int i 0; i< magazine.size(); i) {m_cnt[magazine[i]-a]; // 統計}// 對比for(int i 0; i< ransomNote.size(); i) {if(m_cnt[r…