day21——進(jìn)程管理之進(jìn)程的狀態(tài)及監(jiān)控

1.什么是進(jìn)程?

定義

程序是人使用計(jì)算機(jī)語言編寫的,可以實(shí)現(xiàn)一定功能,并且可以執(zhí)行的代碼集合。而進(jìn)程是正在執(zhí)行中的程序。當(dāng)程序被執(zhí)行時(shí),執(zhí)行人的權(quán)限和屬性,以及程序的代碼都會(huì)被加載入內(nèi)存,操作系統(tǒng)給這個(gè)進(jìn)程分配一個(gè) ID,稱為 PID(進(jìn)程 ID)。
在使用 Windows 系統(tǒng)的過程中,使用任務(wù)管理器,很大程度上是為了強(qiáng)制關(guān)閉“未反應(yīng)”的軟件,也就是殺死進(jìn)程。的確,這是很多使用進(jìn)程管理工具或進(jìn)程管理命令的人最常見的使用方法。不過,殺死進(jìn)程(強(qiáng)制中止進(jìn)程)只是進(jìn)程管理工作中最不常用的手段,因?yàn)槊總€(gè)進(jìn)程都有自己正確的結(jié)束方法,而殺死進(jìn)程是在正常方法已經(jīng)失效的情況下的后備手段。

子進(jìn)程與父進(jìn)程

某些進(jìn)程會(huì)產(chǎn)生一些新的進(jìn)程,我們把這些進(jìn)程稱作子進(jìn)程,而把這個(gè)進(jìn)程本身稱作父進(jìn)程。比如,我們必須正常登錄到 Shell環(huán)境中才能執(zhí)行系統(tǒng)命令,而 Linux 的標(biāo)準(zhǔn) Shell 是 bash。我們?cè)?bash 當(dāng)中執(zhí)行了 ls 命令,那么 bash 就是父進(jìn)程,而 ls 命令是在 bash 進(jìn)程中產(chǎn)生的進(jìn)程,所以 ls 進(jìn)程是 bash 進(jìn)程的子進(jìn)程。也就是說,子進(jìn)程是依賴父進(jìn)程而產(chǎn)生的,如果父進(jìn)程不存在,那么子進(jìn)程也不存在了。但如果父進(jìn)程死亡,子進(jìn)程依然存在,這種進(jìn)程被稱為僵尸進(jìn)程。

2.程序與進(jìn)程之間有什么區(qū)別?

程序是經(jīng)驗(yàn)概念,本身作為一種軟件資源長期保存,而進(jìn)程是程序是執(zhí)行過程,它是動(dòng)態(tài)概念,有一定的生命周期,是動(dòng)態(tài)產(chǎn)生和消亡的。
程序和進(jìn)程無一一對(duì)應(yīng)關(guān)系,一個(gè)程序可以由多個(gè)進(jìn)程共有;另外,一個(gè)進(jìn)程在活動(dòng)中可以有序的執(zhí)行若干個(gè)程序。

3.進(jìn)程的生命周期?

每一個(gè)進(jìn)程都有其生命周期,例如創(chuàng)建、運(yùn)行、終止和消除。這些階段會(huì)在系統(tǒng)啟動(dòng)和運(yùn)行中重復(fù)無數(shù)次。因此,進(jìn)程的生命周期對(duì)于其性能的分析是非常重要的。

4.進(jìn)程運(yùn)行的狀態(tài)指標(biāo)?

狀態(tài)標(biāo)識(shí) 狀態(tài)描述
R (TASK_RUNNING) 運(yùn)行狀態(tài),即包括了上圖中的就緒狀態(tài)和運(yùn)行狀態(tài)
S (TASK_INTERRUPTIBLE) 可中斷的睡眠狀態(tài),即上圖中的阻塞狀態(tài)。在這個(gè)狀態(tài)下進(jìn)程是可被中斷的,即收到信號(hào)之后可以執(zhí)行信號(hào)處理函數(shù)
D (TASK_UNINTERRUPTIBLE) 不可中斷的睡眠狀態(tài)。磁盤IO時(shí)會(huì)出現(xiàn)這種狀態(tài),在此狀態(tài)下,進(jìn)程是不能被中斷的,即不能響應(yīng)信號(hào)。但是可以響應(yīng)外部硬件中斷
T (TASK_STOPPED) 停止?fàn)顟B(tài)。記得是大寫的T。當(dāng)進(jìn)程收到SIGSTOP信號(hào)后就處于停止?fàn)顟B(tài),可以發(fā)送SIGCONT信號(hào)讓進(jìn)程繼續(xù)運(yùn)行
X (TASK_DEAD - EXIT_DEAD) 退出狀態(tài)(死亡狀態(tài))。進(jìn)程即將被銷毀,通常是在父進(jìn)程中設(shè)置SIGCHLD信號(hào)的handler為SIG_IGN,顯式忽略了SIGCHLD信號(hào)。在使用ps命令查看進(jìn)程狀態(tài)時(shí)很難捕捉到這種狀態(tài)
Z (TASK_DEAD - EXIT_ZOMBIE) 僵尸狀態(tài)。子進(jìn)程先于父進(jìn)程退出,并且父進(jìn)程沒有調(diào)用wait或waitpid回收子進(jìn)程。此時(shí)子進(jìn)程即處于僵尸狀態(tài)
t(TASK_TRACED) 跟蹤狀態(tài),記得是小寫的t,和停止?fàn)顟B(tài)只是大小寫的區(qū)別。當(dāng)利用gdb調(diào)試某個(gè)程序,程序停留在某個(gè)斷點(diǎn)處時(shí),就處于跟蹤狀態(tài)。

當(dāng)利用命令:ps -aux 查看進(jìn)程狀態(tài)時(shí),STAT字段還有其他的一些字符,其中部分表示如下:

狀態(tài)符號(hào) 狀態(tài)描述
< 高優(yōu)先級(jí)
N 低優(yōu)先級(jí)
L 有pages在內(nèi)存中l(wèi)ocked。用于實(shí)時(shí)或者自定義IO。
s 進(jìn)程領(lǐng)導(dǎo)者,其有子進(jìn)程。
l 多線程
+ 位于前臺(tái)進(jìn)程組。

5.如何監(jiān)控進(jìn)程的狀態(tài)、靜態(tài)ps、動(dòng)態(tài)top?

動(dòng)態(tài)監(jiān)控進(jìn)程:top

top命令

top的其中九列內(nèi)容及詳解:

內(nèi)容 詳解
Tasks: 154 total 任務(wù)總數(shù)
2 running 有兩個(gè)進(jìn)程正在運(yùn)行
99sleeping 99睡眠
1 stopped 1個(gè)掛起 停止
0 zombie 僵尸進(jìn)程 # 0.3 us 進(jìn)程占用cpu的百分比(用戶進(jìn)程)
0.0 sy 內(nèi)核進(jìn)程 (硬件) # 0.0 ni 優(yōu)先級(jí)的進(jìn)程占用cpu的百分比
99.7 id 空閑的進(jìn)程 # 0.0 wa 大量的等待 -->
0.0 hi 硬中斷
0.0 si 軟中斷 # 0.0 st 虛擬機(jī)占用物理CPU的時(shí)間

top命令顯示的信息:
第一行:系統(tǒng)時(shí)間,運(yùn)行時(shí)間,登錄用戶數(shù),系統(tǒng)負(fù)載(分別為1分鐘、5分鐘、15分鐘的平均值)
第二行:進(jìn)程總數(shù)、運(yùn)行中的,睡眠中的'挺值得,僵尸的
第三行:用戶占用資源、系統(tǒng)內(nèi)核占用資源,改變過優(yōu)先級(jí)的進(jìn)程、空閑的資源,等待輸出的時(shí)間。
此行數(shù)據(jù)均為CPU數(shù)據(jù)并以百分比格式顯示,例如"99.2id"以為著有99.2% CPU 資源正在空閑中
第四行:物理內(nèi)存總量,使用量,空閑量,作為內(nèi)核緩存的內(nèi)存量
第五行:虛擬內(nèi)存總量,使用量,空閑量,已被提前加載的內(nèi)存數(shù)據(jù)

靜態(tài)查看進(jìn)程:ps(可用“-ef”,個(gè)人喜用參數(shù)“aux”)

image.png

ps aux
的其中九列內(nèi)容及詳解:

內(nèi)容 詳解
USER 進(jìn)程的所有者
PID 進(jìn)程的ID號(hào)
%CPU 運(yùn)算器占用率
%MEM 內(nèi)容占有率
VSZ 虛擬內(nèi)存使用量(單位是KB)
RSS 占用的固定內(nèi)存量(單位是KB)
TTY 所在終端
STAT 進(jìn)程狀態(tài)
START 被啟動(dòng)的時(shí)間
TIME 實(shí)際使用CPU的時(shí)間
COMMAND 命令名稱與參數(shù)

6.進(jìn)程中的iowait 軟中斷 硬中斷?

(1) 硬中斷
由與系統(tǒng)相連的外設(shè)(比如網(wǎng)卡、硬盤)自動(dòng)產(chǎn)生的。主要是用來通知操作系統(tǒng)系統(tǒng)外設(shè)狀態(tài)的變化。比如當(dāng)網(wǎng)卡收到數(shù)據(jù)包的時(shí)候,就會(huì)發(fā)出一個(gè)中斷。我們通常所說的中斷指的是硬中斷(hardirq)。
(2) 軟中斷
軟中斷是一組靜態(tài)定義的下半部接口,可以在所有處理器上同時(shí)執(zhí)行,即使兩個(gè)類型相同也可以。為了滿足實(shí)時(shí)系統(tǒng)的要求,中斷處理應(yīng)該是越快越好。linux為了實(shí)現(xiàn)這個(gè)特點(diǎn),當(dāng)中斷發(fā)生的時(shí)候,硬中斷處理那些短時(shí)間就可以完成的工作,而將那些處理事件比較長的工作,放到中斷之后來完成,也就是軟中斷(softirq)來完成。但一個(gè)軟中斷不會(huì)搶占另一個(gè)軟中斷,唯一可以搶占軟中斷的是硬中斷。
(3)硬中斷和軟中斷的區(qū)別

  • 軟中斷是執(zhí)行中斷指令產(chǎn)生的,而硬中斷是由外設(shè)引發(fā)的。
  • 硬中斷的中斷號(hào)是由中斷控制器提供的,軟中斷的中斷號(hào)由指令直接指出,無需使用中斷控制器。
  • 硬中斷是可屏蔽的,軟中斷不可屏蔽。
  • 硬中斷處理程序要確保它能快速地完成任務(wù),這樣程序執(zhí)行時(shí)才不會(huì)等待較長時(shí)- 間,稱為上半部。
  • 軟中斷處理硬中斷未完成的工作,是一種推后執(zhí)行的機(jī)制,屬于下半部。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容