進程有哪些狀態(tài)?這個問題在面試的時候出現的概率也比較高。
如果你學過操作系統(tǒng)這門課,那一定看過這張圖:
?
運行、就緒、阻塞指的就是進程的三種狀態(tài)。 要想搞懂這三種狀態(tài),還得從操作系統(tǒng)的進程調度說起。
假設CPU是單核的,單核的CPU一次只能處理一件事情,但是在操作系統(tǒng)上往往有多個任務需要執(zhí)行。
于是操作系統(tǒng)就會輪流讓任務占用CPU,比如先讓第一個進程占用CPU,運行個5ms,然后把它放一邊去,再讓第二個進程占用CPU,也運行個幾毫秒。
因為輪轉的速度特別快,所以在正常人看來,這些進程好像是在同時執(zhí)行。
有了這個背景,再來看進程的狀態(tài)就會比較容易。
所謂運行,就是進程占用CPU正在執(zhí)行的狀態(tài)。
所謂就緒,就是萬事俱備,等待被操作系統(tǒng)調度的狀態(tài)。
最后還有一種阻塞,比如程序在運行的時候,遇到了類似scanf這樣阻塞的函數,需要等待用戶從鍵盤輸入,這個時候即使讓他占用CPU運行,也是浪費時間,干脆就讓它進入阻塞的狀態(tài),直到條件滿足,也就是有用戶輸入了數據,再讓它回到就緒的狀態(tài),等待被操作系統(tǒng)調用。
再來看下Linux下進程的狀態(tài)。
?
這個分的就更細了,結合代碼來說明。
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需要訪問外設,比CPU速度慢很多,程序大部分時間都在等待輸出,并不是在等待被調度,所以并不屬于運行狀態(tài)。
還有一種睡眠狀態(tài)叫D,Disk sleep,也叫深度睡眠。
?服務器壓力過大時,操作系統(tǒng)會殺掉一些進程,如果是D狀態(tài),操作系統(tǒng)無法干預,比如dd這個命令,進程就是D狀態(tài)。
還有一種T狀態(tài)也比較常見,一個正在運行的程序,如果按下ctrl z,就會進入暫停狀態(tài)。
?
?
審核編輯:劉清
-
Linux系統(tǒng)
+關注
關注
4文章
617瀏覽量
30176 -
狀態(tài)機
+關注
關注
2文章
501瀏覽量
29352 -
LINUX內核
+關注
關注
1文章
321瀏覽量
23306 -
printf函數
+關注
關注
0文章
31瀏覽量
6316
原文標題:細說進程的狀態(tài)
文章出處:【微信號:學益得智能硬件,微信公眾號:學益得智能硬件】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
Linux系統(tǒng)下進程的幾種狀態(tài)介紹
飛凌嵌入式ElfBoard-進程之進程狀態(tài)
【Linux學習雜談】之進程狀態(tài)
進程與程序有何不同
Linux 進程狀態(tài)淺析
進程的三種基本狀態(tài)及進程控制塊(PCB)
經典雙進程狀態(tài)機的FPGA實現(含testbeach)
進程有哪些狀態(tài)?細說進程的狀態(tài)
評論