【Linux】进程概念 —— 进程状态
目錄
一.操作系統理論中的進程狀態
二.Linux系統中的進程狀態
0.前臺進程與后臺進程
1.R - 運行狀態(Running)
2.S - 睡眠狀態(Sleeping)
3.D - 磁盤睡眠(Disk Sleep)
4.T - 暫停狀態(Stopped)
5.t - 調試狀態(Tracing Stopped)
6.X - 死亡狀態(Dead)?
7.Z - 僵尸狀態(Zombie)
一.操作系統理論中的進程狀態
1.新建態:字面意思,一個進程剛剛被新建出來,還沒有加入到任何隊列中
2.運行態:task_struct在運行隊列中等待CPU執行
3.阻塞態:等待非CPU資源,例如:等待鍵盤輸入就緒,等待網卡等各種非CPU資源...
4.掛起態:內存不足時,OS會挑選需要等待資源時間過長的進程先換出到磁盤(SWAP分區),此時只是將內容和數據換出到磁盤,task_struct仍然還在內存中,當掛起態需要被運行時,先要進行換入內存操作,再添加到運行隊列等待。
5.終止態:字面意思
內存到磁盤換入換出的過程就是I/O的過程,這個過程很浪費時間
掛起所做的事其實本質就是用時間來換取空間
二.Linux系統中的進程狀態
Linux內核中對于狀態的標識與定義
0.前臺進程與后臺進程
進程分為前臺進程和后臺進程,狀態符號后帶有“+”說明是前臺進程
前臺進程:運行時會占用Shell進程,使Shell無法運行,可以使用ctrl+c結束進程
后臺進程:運行時不會影響Shell進程,ctrl+c沒有用,可以使用kill -9 進程pid殺掉
例如:./process為將進程當作前臺進程運行
? ? ? ? ? ?./process &為將進程當作后臺進程運行
1.R - 運行狀態(Running)
進程在運行中或者進程在運行隊列里
對應操作系統理念中的運行態
2.S - 睡眠狀態(Sleeping)
進程在等待事件完成,在等待某種資源(S狀態也可稱為可中斷睡眠)
對應操作系統中的阻塞態/掛起態
3.D - 磁盤睡眠(Disk Sleep)
深度睡眠,不可被中斷,不可被被動喚醒
當服務器壓力過大時,OS會通過一定的手段,殺掉一些進程,來起到節省空間的作用!
如果是S狀態時,可以被OS殺掉;
如果是D狀態時,不能被OS殺掉,OS無法插手,只能等進程自動醒來;
dd命令可以模擬出D狀態的進程
4.T - 暫停狀態(Stopped)
5.t - 調試狀態(Tracing Stopped)
6.X - 死亡狀態(Dead)?
一個進程退出且被檢測好回收后,就是X狀態
該狀態不好捕捉,如果有大量結束的進程都在等待OS回收,才可觀察到,瞬時性非常強
7.Z - 僵尸狀態(Zombie)
此時一個進程已經退出,還不允許被回收釋放,處于一個檢測狀態
維持這個狀態,等待OS或者父進程檢測后來進行回收。
Z與X狀態的結合就是操作系統理論的終止狀態
以上例子,子進程先于父進程結束,處于一個待檢測狀態,但父進程還沒有調用系統調用,也就是還沒有讀取到子進程退出時的返回值,這時子進程就是一個僵尸進程
總結:
只要子進程退出,父進程還沒有退出,且父進程還沒有讀取到子進程的狀態代碼(子進程返回值),子進程就會進入僵尸狀態,成為一個僵尸進程,等待父進程讀取退出狀態代碼。
僵尸進程的危害:
子進程一直處于Z狀態,無法被回收
維護退出狀態本身要用數據維護,task_struct就需要一直維護
最終結果就是:PCB需要一直維護狀態,內存資源也一直被占用,發生內存泄漏!
總結
以上是生活随笔為你收集整理的【Linux】进程概念 —— 进程状态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql怎么看端口号_mysql端口号
- 下一篇: vue所有内置指令(面试)