一、進(jìn)程的概念
1、什么是進(jìn)程
比如:開(kāi)發(fā)寫(xiě)的代碼我們稱(chēng)為程序,那么將開(kāi)發(fā)的代碼運(yùn)行起來(lái)。我們稱(chēng)為進(jìn)程。
總結(jié)一句話就是:當(dāng)我們運(yùn)行一個(gè)程序,那么我們將運(yùn)行的程序叫進(jìn)程。
當(dāng)程序運(yùn)行為進(jìn)程后,系統(tǒng)會(huì)為該進(jìn)程分配內(nèi)存,以及進(jìn)程運(yùn)行的身份和權(quán)限。
在進(jìn)程運(yùn)行的過(guò)程中,系統(tǒng)會(huì)有各種指標(biāo)來(lái)表示當(dāng)前運(yùn)行的狀態(tài)。
2、程序和進(jìn)程的區(qū)別
(1)程序是數(shù)據(jù)和指令的集合,是一個(gè)靜態(tài)的概念。比如/bin/ls、/bin/cp等二進(jìn)制文件。同時(shí)程序可以長(zhǎng)期存在系統(tǒng)中。
(2)進(jìn)程是程序運(yùn)行的過(guò)程,是一個(gè)動(dòng)態(tài)概念。進(jìn)程是存在生命周期的概念的,也就是說(shuō)進(jìn)程會(huì)隨著程序的終止而銷(xiāo)毀,不會(huì)永久存在系統(tǒng)中。
3、進(jìn)程的生命周期
生命周期就是指一個(gè)對(duì)象的生老病死。

當(dāng)父進(jìn)程接收到任務(wù)調(diào)度時(shí),會(huì)通過(guò)fock派生子進(jìn)程來(lái)處理,那么子進(jìn)程會(huì)繼承父進(jìn)程屬性。
(1)子進(jìn)程在處理任務(wù)代碼時(shí),父進(jìn)程會(huì)進(jìn)入等待狀態(tài)中。
(2)子進(jìn)程在處理任務(wù)代碼后,會(huì)執(zhí)行退出,然后喚醒父進(jìn)程來(lái)回收子進(jìn)程的資源。
(3)如果子進(jìn)程在處理任務(wù)過(guò)程中,父進(jìn)程退出了,子進(jìn)程沒(méi)有退出,那么這些子進(jìn)程就沒(méi)有父進(jìn)程來(lái)管理了,就變成僵尸進(jìn)程。
每個(gè)進(jìn)程父進(jìn)程叫PPID,子進(jìn)程則叫PID。
二、監(jiān)控進(jìn)程狀態(tài)
程序在運(yùn)行后,我們需要了解進(jìn)程的運(yùn)行狀態(tài)。查看進(jìn)程的狀態(tài)分為 靜態(tài) 和 動(dòng)態(tài) 兩種方式。
1、靜態(tài)進(jìn)程
使用ps命令查看當(dāng)前的進(jìn)程狀態(tài)(靜態(tài))
(1)ps -aux常用組合
ps -aux常用組合,查看進(jìn)程用戶、PID、占用cpu百分比、占用內(nèi)存百分比、執(zhí)行的命令等。

| 狀態(tài) | 描述 |
|---|---|
| USER | 啟動(dòng)進(jìn)程的用戶 |
| PID | 進(jìn)程運(yùn)行的ID號(hào) |
| %CPU | 進(jìn)程占用CPU百分比 |
| %MEM | 進(jìn)程占用內(nèi)存百分比 |
| VSZ | 進(jìn)程占用虛擬內(nèi)存大?。▎挝籏B) |
| RSS | 進(jìn)程占用物理內(nèi)存實(shí)際大?。▎挝籏B) |
| TTY | 進(jìn)程是由哪個(gè)終端運(yùn)行啟動(dòng)的tty1、pts/0等 ?表示內(nèi)核程序與終端無(wú)關(guān) |
| STAT | 進(jìn)程運(yùn)行過(guò)程中的狀態(tài)man ps(/STATE) |
| START | 進(jìn)程的啟動(dòng)時(shí)間 |
| TIME | 進(jìn)程占用CPU的總時(shí)間(為0表示還沒(méi)超過(guò)秒) |
| COMMAND | 程序的運(yùn)行指令,[方括號(hào)]屬于內(nèi)核態(tài)的進(jìn)程。沒(méi)有[] 的是用戶態(tài)進(jìn)程。 |
(2)STAT狀態(tài)詳解
STAT狀態(tài)的Ss、S< 、S、S+、R、R+、D、T、Z 等等,都是什么意思?
| STAT基本狀態(tài) | 描述 | STAT狀態(tài)+符號(hào) | 描述 |
|---|---|---|---|
| R | 進(jìn)程運(yùn)行 | s | 進(jìn)程是控制進(jìn)程,Ss進(jìn)程的領(lǐng)導(dǎo)者,父進(jìn)程 |
| S | 可中斷睡眠 | < | 進(jìn)程運(yùn)行在高優(yōu)先級(jí)上,S<優(yōu)先級(jí)較高的進(jìn)程 |
| T | 進(jìn)程被暫停 | N | 進(jìn)程運(yùn)行在低優(yōu)先級(jí)上,SN優(yōu)先級(jí)較低的進(jìn)程 |
| D | 不可中斷睡眠 | + | 當(dāng)前進(jìn)程運(yùn)行在前臺(tái),R+該表示進(jìn)程在前臺(tái)運(yùn)行 |
| Z | 僵尸進(jìn)程 | | | 進(jìn)程是多線程的,Sl表示進(jìn)程是以線程方式運(yùn)行 |
(3)案例
1)ps命令模擬查看 R+ S+ T
- 同一臺(tái)虛擬機(jī)開(kāi)啟兩個(gè)窗口
- 終端1 輸入vim fxtx ,然后停止不輸入任何東西,轉(zhuǎn)到終端2
- 終端2 運(yùn)行ps命令查看狀態(tài)
[root@oldboy ~]# ps aux | grep fxtx #S表示睡眠模式,+表示前臺(tái)運(yùn)行
root 7880 0.0 0.2 151528 5200 pts/1 S+ 15:51 0:00 vim fxtx
root 7897 0.0 0.0 112708 976 pts/0 R+ 16:06 0:00 grep --color=auto fxtx
- 終端1 掛起vim命令,按下:ctrl+z ,回到終端2
- 終端2 再次運(yùn)行ps命令查看狀態(tài)
[root@oldboy ~]# ps aux | grep fxtx #T表示停止?fàn)顟B(tài)
root 7880 0.0 0.2 151528 5200 pts/1 T 15:51 0:00 vim fxtx
root 7901 0.0 0.0 112708 976 pts/0 S+ 16:16 0:00 grep --color=auto fxtx
2)tar命令模擬查看 D+
- 同一臺(tái)虛擬機(jī)開(kāi)啟兩個(gè)窗口
- 終端1 輸入tar -czf etc.tar.gz /etc/ /usr/ /var/ ,然后轉(zhuǎn)到終端2
- 終端2 運(yùn)行ps命令查看狀態(tài)
#使用tar打包文件時(shí),可以通過(guò)終端不斷查看狀態(tài),由S+,R+變?yōu)镈+
[root@oldboy ~]# ps aux | grep etc.tar.gz
root 7903 4.0 0.0 123680 1332 pts/1 D+ 16:19 0:00 tar -czf etc.tar.gz /etc/ /usr/ /var/
root 7906 0.0 0.0 112708 988 pts/0 R+ 16:19 0:00 grep --color=auto etc.tar.gz
[root@oldboy ~]# ps aux | grep etc.tar.gz
root 7903 16.0 0.0 123812 1332 pts/1 S+ 16:19 0:01 tar -czf etc.tar.gz /etc/ /usr/ /var/
[root@oldboy ~]# ps aux | grep etc.tar.gz
root 7903 16.5 0.0 123812 1548 pts/1 R+ 16:19 0:01 tar -czf etc.tar.gz /etc/ /usr/ /var/
root 7910 0.0 0.0 112708 988 pts/0 R+ 16:19 0:00 grep --color=auto etc.tar.gz
[root@oldboy ~]# ps aux | grep etc.tar.gz
root 7903 15.3 0.0 123812 1548 pts/1 S+ 16:19 0:01 tar -czf etc.tar.gz /etc/ /usr/ /var/
root 7912 0.0 0.0 112708 988 pts/0 R+ 16:19 0:00 grep --color=auto etc.tar.gz
2、動(dòng)態(tài)進(jìn)程
(1)top命令
使用top命令查看當(dāng)前的進(jìn)程狀態(tài)(動(dòng)態(tài))
top命令可以模擬查看 R S


#Tasks: 92 total 當(dāng)前進(jìn)程的總數(shù)
#3 running 正在運(yùn)行的進(jìn)程數(shù)
#89 sleeping 睡眠的進(jìn)程數(shù)
#0 stopped 停止的進(jìn)程數(shù) 掛起
#0 zombie 僵尸進(jìn)程數(shù)
#%Cpu(s): 0.0 us 系統(tǒng)用戶進(jìn)程使用CPU百分比
#0.3 sy 內(nèi)核中的進(jìn)程占用CPU百分比,通常內(nèi)核是于硬件進(jìn)行交互
#0.0 ni 優(yōu)先級(jí)的進(jìn)程占用cpu的百分比
#99.7 id 空閑CPU的百分比
#0.0 wa CPU等待IO完成的時(shí)間
#0.0 hi 硬中斷,占的CPU百分比
#0.0 si 軟中斷,占的CPU百分比
#0.0 st 虛擬機(jī)占用物理CPU的時(shí)間
(2)中斷
1)什么是中斷
中斷是系統(tǒng)用來(lái)響應(yīng)硬件設(shè)備請(qǐng)求的一種機(jī)制,它會(huì)打斷進(jìn)程的正常調(diào)度和執(zhí)行,然后調(diào)用內(nèi)核中的中斷處理程序來(lái)響應(yīng)設(shè)備的請(qǐng)求。
2)為什么要有中斷
中斷其實(shí)是一種異步的事件處理機(jī)制,可以提高系統(tǒng)的并發(fā)處理能力。
3)中斷帶來(lái)的問(wèn)題
由于中斷處理程序會(huì)打斷其他進(jìn)程的運(yùn)行,所以,為了減少對(duì)正常進(jìn)程運(yùn)行調(diào)度的影響,中斷處理程序就需要盡可能快地運(yùn)行。如果中斷本身要做的事情不多,那么處理起來(lái)也不會(huì)有太大問(wèn)題;但如果中斷要處理的事情很多,中斷服務(wù)程序就有可能要運(yùn)行很長(zhǎng)時(shí)間。特別是,中斷處理程序在響應(yīng)中斷時(shí),還會(huì)臨時(shí)關(guān)閉中斷。這就會(huì)導(dǎo)致上一次中斷處理完成之前,其他中斷都不能響應(yīng),也就是說(shuō)中斷有可能會(huì)丟失。
4)系統(tǒng)中的軟中斷
事實(shí)上,為了解決中斷處理程序執(zhí)行過(guò)長(zhǎng)和中斷丟失的問(wèn)題,Linux 將中斷處理過(guò)程分成了兩個(gè)階段,也就是上半部和下半部:
- 上半部用來(lái)快速處理中斷,它在中斷禁止模式下運(yùn)行,主要處理跟硬件緊密相關(guān)工作。
- 下半部用來(lái)延遲處理上半部未完成的工作,通常以內(nèi)核線程的方式運(yùn)行。
5)Linux軟中斷與硬中斷小結(jié)
Linux 中的中斷處理程序分為上半部和下半部:
- 上半部對(duì)應(yīng)硬件中斷,用來(lái)快速處理中斷。
- 下半部對(duì)應(yīng)軟中斷,用來(lái)異步處理上半部未完成的工作。
Linux 中的軟中斷包括網(wǎng)絡(luò)收發(fā)、定時(shí)、調(diào)度、等各種類(lèi)型,可以通過(guò)查看 /proc/softirqs 來(lái)觀察軟中斷的運(yùn)行情況。
(3)top 常見(jiàn)指令
| 字母 | 含義 |
|---|---|
| h | 查看幫助 |
| 1 | 數(shù)字1,顯示所有CPU核心的負(fù)載 |
| z | 以高亮顯示數(shù)據(jù) |
| b | 高亮顯示處于R狀態(tài)的進(jìn)程 |
| M | 按內(nèi)存使用百分比排序輸出 |
| P | 按CPU使用百分比排序輸出 |
| q | 退出top |