進程有哪些狀態?這個問題在面試的時候出現的概率也比較高。
如果你學過操作系統這門課,那一定看過這張圖:
?
運行、就緒、阻塞指的就是進程的三種狀態。 要想搞懂這三種狀態,還得從操作系統的進程調度說起。
假設CPU是單核的,單核的CPU一次只能處理一件事情,但是在操作系統上往往有多個任務需要執行。
于是操作系統就會輪流讓任務占用CPU,比如先讓第一個進程占用CPU,運行個5ms,然后把它放一邊去,再讓第二個進程占用CPU,也運行個幾毫秒。
因為輪轉的速度特別快,所以在正常人看來,這些進程好像是在同時執行。
有了這個背景,再來看進程的狀態就會比較容易。
所謂運行,就是進程占用CPU正在執行的狀態。
所謂就緒,就是萬事俱備,等待被操作系統調度的狀態。
最后還有一種阻塞,比如程序在運行的時候,遇到了類似scanf這樣阻塞的函數,需要等待用戶從鍵盤輸入,這個時候即使讓他占用CPU運行,也是浪費時間,干脆就讓它進入阻塞的狀態,直到條件滿足,也就是有用戶輸入了數據,再讓它回到就緒的狀態,等待被操作系統調用。
再來看下Linux下進程的狀態。
?
這個分的就更細了,結合代碼來說明。
int main() { while (1); }先來個死循環,運行起來,此時它是R的狀態,表示正在運行,加號表示前臺運行。
?
代碼稍微修改一下,加上printf輸出。
int main() { while (1) { printf(" "); } return 0; }此時變成了S狀態,就是睡眠狀態。
?
那么問題就來了,程序正在運行,為什么就是睡眠狀態?
因為printf需要訪問外設,比CPU速度慢很多,程序大部分時間都在等待輸出,并不是在等待被調度,所以并不屬于運行狀態。
還有一種睡眠狀態叫D,Disk sleep,也叫深度睡眠。
?
服務器壓力過大時,操作系統會殺掉一些進程,如果是D狀態,操作系統無法干預,比如dd這個命令,進程就是D狀態。
還有一種T狀態也比較常見,一個正在運行的程序,如果按下ctrl z,就會進入暫停狀態。
? ?
審核編輯:劉清
-
Linux系統
+關注
關注
4文章
595瀏覽量
27442 -
狀態機
+關注
關注
2文章
492瀏覽量
27579 -
LINUX內核
+關注
關注
1文章
316瀏覽量
21677 -
printf函數
+關注
關注
0文章
31瀏覽量
5900
原文標題:細說進程的狀態
文章出處:【微信號:學益得智能硬件,微信公眾號:學益得智能硬件】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論