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的其中九列內(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”)

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ī)制,屬于下半部。