進程有哪些狀態(tài)?這個問題在面試的時候出現(xiàn)的概率也比較高。
如果你學(xué)過操作系統(tǒng)這門課,那一定看過這張圖: ?
運行、就緒、阻塞指的就是進程的三種狀態(tài)。 要想搞懂這三種狀態(tài),還得從操作系統(tǒng)的進程調(diào)度說起。
假設(shè)CPU是單核的,單核的CPU一次只能處理一件事情,但是在操作系統(tǒng)上往往有多個任務(wù)需要執(zhí)行。
于是操作系統(tǒng)就會輪流讓任務(wù)占用CPU,比如先讓第一個進程占用CPU,運行個5ms,然后把它放一邊去,再讓第二個進程占用CPU,也運行個幾毫秒。
因為輪轉(zhuǎn)的速度特別快,所以在正常人看來,這些進程好像是在同時執(zhí)行。
有了這個背景,再來看進程的狀態(tài)就會比較容易。
所謂運行,就是進程占用CPU正在執(zhí)行的狀態(tài)。
所謂就緒,就是萬事俱備,等待被操作系統(tǒng)調(diào)度的狀態(tài)。
最后還有一種阻塞,比如程序在運行的時候,遇到了類似scanf這樣阻塞的函數(shù),需要等待用戶從鍵盤輸入,這個時候即使讓他占用CPU運行,也是浪費時間,干脆就讓它進入阻塞的狀態(tài),直到條件滿足,也就是有用戶輸入了數(shù)據(jù),再讓它回到就緒的狀態(tài),等待被操作系統(tǒng)調(diào)用。
再來看下Linux下進程的狀態(tài)。 ?
這個分的就更細了,結(jié)合代碼來說明。
int main() { while (1); }先來個死循環(huán),運行起來,此時它是R的狀態(tài),表示正在運行,加號表示前臺運行。

代碼稍微修改一下,加上printf輸出。
int main() { while (1) { printf(" "); } return 0; }此時變成了S狀態(tài),就是睡眠狀態(tài)。

那么問題就來了,程序正在運行,為什么就是睡眠狀態(tài)?
因為printf需要訪問外設(shè),比CPU速度慢很多,程序大部分時間都在等待輸出,并不是在等待被調(diào)度,所以并不屬于運行狀態(tài)。
還有一種睡眠狀態(tài)叫D,Disk sleep,也叫深度睡眠。

服務(wù)器壓力過大時,操作系統(tǒng)會殺掉一些進程,如果是D狀態(tài),操作系統(tǒng)無法干預(yù),比如dd這個命令,進程就是D狀態(tài)。
還有一種T狀態(tài)也比較常見,一個正在運行的程序,如果按下ctrl z,就會進入暫停狀態(tài)。


審核編輯:劉清
-
Linux系統(tǒng)
+關(guān)注
關(guān)注
4文章
605瀏覽量
28618 -
狀態(tài)機
+關(guān)注
關(guān)注
2文章
493瀏覽量
28251 -
LINUX內(nèi)核
+關(guān)注
關(guān)注
1文章
317瀏覽量
22409 -
printf函數(shù)
+關(guān)注
關(guān)注
0文章
31瀏覽量
6117
原文標(biāo)題:細說進程的狀態(tài)
文章出處:【微信號:學(xué)益得智能硬件,微信公眾號:學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
Linux系統(tǒng)下進程的幾種狀態(tài)介紹

【Linux學(xué)習(xí)雜談】之進程狀態(tài)
Linux下的進程結(jié)構(gòu)
進程與程序有何不同
Linux進程管理
Linux 進程狀態(tài)淺析
進程的三種基本狀態(tài)及進程控制塊(PCB)

經(jīng)典雙進程狀態(tài)機的FPGA實現(xiàn)(含testbeach)

Linux如何以暫停狀態(tài)啟動新進程
進程進入等待狀態(tài)有哪幾種方式
Linux進程狀態(tài)詳解

評論