一茬斧、進程的基本概念
1腰懂、什么是進程?
開發(fā)寫的代碼我們稱之為程序项秉,那么將開發(fā)的代碼運行起來绣溜,我們稱之為進程。
1)娄蔼、當(dāng)程序運行為進程后怖喻,系統(tǒng)就會為該進程分配內(nèi)存,以及進程運行的身份和權(quán)利岁诉。
2)罢防、在進程運行的過程中,系統(tǒng)會有各種指標(biāo)來表示當(dāng)前運行的狀態(tài)唉侄。
2咒吐、程序與進程之間有什么區(qū)別
1)、程序是數(shù)據(jù)和指令的集合,是一個靜態(tài)的概念恬叹,比如/bin/ls候生、/bin/cp等二進制文件。程序可以長期存在系統(tǒng)中绽昼。
2)唯鸭、進程是程序運行的過程,是一個動態(tài)的概念硅确。進程是存在于生命周期的概念目溉,也就是說進程會隨著程序的終止而銷毀,不會永久存在系統(tǒng)中菱农。
3缭付、進程的生命周期
生命周期就是指一個對象的生老病死。
當(dāng)父進程接收到任務(wù)調(diào)度時循未,會通過fack派生子進程來處理陷猫,那么子進程會繼承父進程的屬性
1)、子進程在處理任務(wù)代碼時的妖,父進程會進入等待狀態(tài)中绣檬。
2)、子進程在處理任務(wù)代碼后會執(zhí)行退出嫂粟,然后喚醒父進程來回收子進程的資源娇未。
3)、如果子進程在處理任務(wù)的過程中星虹,父進程退出零抬,子進程沒有退出,那么子進程就沒有父進程的管理了搁凸,就會變成僵尸進程媚值。
PS:每一個進程有父進程的PPID狠毯,子進程的則叫PID护糖。
二、監(jiān)控進程狀態(tài)
程序在運行后嚼松,我們需要了解進程的運行狀態(tài)嫡良。查看進程的狀態(tài)分為靜態(tài)和動態(tài)兩種方式。
1献酗、使用 ps -aux 常用組合寝受,查看進程的用戶、PID罕偎、占用CPU百分比很澄、占用內(nèi)存百分比、狀態(tài)、執(zhí)行的命令等甩苛。
[root@oldboy ~]# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
······
root 2 0.0 0.0 0 0 ? S 14:42 0:0 [kthreadd]
······
狀態(tài) | 描述 |
---|---|
USER | 啟動進程的用戶 |
PID | 進程運行的ID號 |
%CPU | 進程占用CPU的百分比 |
%MEM | 進程占用內(nèi)存的百分比 |
VSZ | 進程占用虛擬內(nèi)存大小(單位KB) |
RSS | 進程占用物理內(nèi)存書記大小(單位KB) |
TTY | 進程是由哪個終端運行啟動的tty1蹂楣、pts/0等,"?"表示內(nèi)核程序讯蒲,與終端無關(guān) |
STAT | 進程運行過程中的狀態(tài) man ps (/STATE) |
ATART | 進程的啟動時間 |
TIME | 進程占用CPU的總時間(為0表示沒超過1秒) |
COMMAND | 程序的運行指令痊土,[ ]內(nèi)的屬于內(nèi)核的進程,沒有[]的是用戶態(tài)進程 |
2墨林、STAT狀態(tài)的描述
STAT基本狀態(tài) | 描述 | STAT狀態(tài)+符號 | 描述 |
---|---|---|---|
R | 進程進行 | s | 進程是控制進程赁酝,Ss進程的領(lǐng)導(dǎo),父進程 |
S | 可中斷睡眠 | < | 進程運行在高優(yōu)先級上旭等,S<優(yōu)先級較高的進程 |
T | 進程被暫停 | N | 進程運行在低優(yōu)先級上酌呆,SN優(yōu)先級較低的進程 |
D | 不可中斷睡眠 | + | 當(dāng)前進程運行在前臺,R+表示該進程在前臺運行 |
Z | 僵尸進程 | I | 進程是多棧的辆雾,SI表示進程是一線程方式運行的 |
3肪笋、案例
1)、可中斷進程
(1)度迂、在終端1上運行vim
[root@oldboy ~]# vim 1.txt
1
2
(2)藤乙、在終端2上運行ps命令查看狀態(tài)
[root@oldboy ~]# ps aux |grep 1.txt
root 7860 0.1 0.2 151532 5260 pts/0 S+ 16:15 0:00 vim 1.txt #S表示睡眠模式,+表示前臺運行
root 7888 0.0 0.0 112708 992 pts/1 R+ 16:17 0:00 grep --color=auto 1.txt
(3)惭墓、在終端1上使用"ctrl+z"掛起vim命令
(4)坛梁、回到終端2再次運行ps命令查看狀態(tài)
[root@oldboy ~]# ps aux |grep 1.txt
root 7860 0.0 0.2 151532 5260 pts/0 T 16:15 0:00 vim 1.txt #T表示停止?fàn)顟B(tài)
root 7890 0.0 0.0 112708 992 pts/1 R+ 16:19 0:00 grep --color=auto 1.txt
2)、不可中斷進程
(1)腊凶、使用tar打包文件時划咐,可以通過終端不斷查看狀態(tài),由S+钧萍,R+變?yōu)镈+
[root@oldboy ~]# tar -czf etc.tar.gz /etc/ /usr/ /var/
[root@oldboy ~]# ps aux|grep tar|grep -v grep
root 7901 9.5 0.0 123812 1316 pts/0 S+ 16:25 0:00 tar -czf etc.tar.gz /etc/ /usr/ /var/
[root@oldboy ~]# ps aux|grep tar|grep -v grep
root 7901 9.8 0.0 123812 1624 pts/0 R+ 16:25 0:00 tar -czf etc.tar.gz /etc/ /usr/ /var/
······
[root@oldboy ~]# ps aux|grep tar|grep -v grep
root 7901 10.8 0.0 123812 1640 pts/0 S+ 16:25 0:03 tar -czf etc.tar.gz /etc/ /usr/ /var/
[root@oldboy ~]# ps aux|grep tar|grep -v grep
root 7901 11.0 0.0 123812 1640 pts/0 R+ 16:25 0:03 tar -czf etc.tar.gz /etc/ /usr/ /var/
[root@oldboy ~]# ps aux|grep tar|grep -v grep
root 7901 10.8 0.0 123812 1640 pts/0 D+ 16:25 0:03 tar -czf etc.tar.gz /etc/ /usr/ /var/
[root@oldboy ~]# ps aux|grep tar|grep -v grep
root 7901 11.0 0.0 123812 1640 pts/0 S+ 16:25 0:03 tar -czf etc.tar.gz /etc/ /usr/ /var/
4褐缠、使用top命令查看當(dāng)前的進程狀態(tài)(動態(tài))
1)、查看過程
top - 16:32:07 up 1:49, 2 users, load average: 0.02, 0.14, 0.13
Tasks: 112 total, 1 running, 110 sleeping, 1 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 2028088 total, 1557944 free, 145644 used, 324500 buff/cache
KiB Swap: 1048572 total, 1048572 free, 0 used. 1689076 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
7486 root 20 0 573824 17232 6084 S 0.7 0.8 0:07.77 tuned
8025 root 20 0 162032 2192 1548 R 0.3 0.1 0:00.25 top
1 root 20 0 193812 6872 4148 S 0.0 0.3 0:09.67 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.03 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.95 ksoftirqd/0
任務(wù) | 含義 |
---|---|
Tasks: 112 total | 當(dāng)然進程的總數(shù) |
1 running | 正在運行的進程數(shù) |
110 sleeping | 睡眠的進程數(shù) |
1 stopped | 停止的進程數(shù) |
0 zombie | 僵尸進程數(shù) |
%Cpu(s): 0.0 us | 系統(tǒng)用戶進程使用CPU百分比 |
0.3 sy | 內(nèi)核中的進程占用CPU百分比风瘦,通常內(nèi)核是于硬件進行交互 |
0.0 ni | 優(yōu)先級的進程占用CPU的百分比 |
99.7 id | 空閑CPU的百分比 |
0.0 wa | CPU等待IO完成的時間 |
0.0 hi | 硬中斷队魏,占的CPU百分比 |
0.0 si | 軟中斷,占的CPU百分比 |
0.0 st | 虛擬機占用物理CPU的時間 |
2)万搔、top 常見指令
字母 | 含義 |
---|---|
h | 查看幫助 |
1 | 數(shù)字1胡桨,顯示所有CPU核心的負載 |
z | 以高亮顯示數(shù)據(jù) |
b | 高亮顯示處于R狀態(tài)的進程 |
M | 按內(nèi)存使用百分比排序輸出 |
P | 按CPU使用百分比排揎輸出 |
q | 退出top |
三、中斷
1瞬雹、什么是中斷
中斷是系統(tǒng)用來響應(yīng)硬件設(shè)備請求的一種機制昧谊,它會打斷進程的正常調(diào)度和執(zhí)行,然后調(diào)用內(nèi)核中的中斷處理程序來響應(yīng)設(shè)備的請求酗捌。
2呢诬、為什么要有中斷呢? "舉個生活中的例子"
比如說你訂了一份外賣涌哲,但是不確定外賣什么時候送到,也沒有別的方法了解外賣的進度尚镰,但是膛虫,配送員送外賣是不等人的,到了你這兒沒人取的話钓猬,就直接走人了稍刀。所以你只能苦苦等著,時不時去門口看看外賣送到?jīng)]敞曹,而不能干其他事情账月。不過呢,如果在訂外賣的時候澳迫,你就跟配送員約定好局齿,讓他送到后給你打個電話,那你就不用苦苦等待了橄登,就可以去忙別的事情抓歼,直到電話一響,接電話拢锹、取外賣就可以了谣妻。 這里的“打電話”,其實就是一個中斷卒稳。沒接到電話的時候蹋半,你可以做其他的事情;只有接到了電話(也就是發(fā)生中斷)充坑,你才要進行另一個動作:取外賣减江。
這個例子你就可以發(fā)現(xiàn),中斷其實是一種異步的事件處理機制捻爷,可以提高系統(tǒng)的并發(fā)處理能力辈灼。
3、中斷會帶來什么問題也榄?
由于中斷處理程序會打斷其他進程的運行巡莹,所以,為了減少對正常進程運行調(diào)度的影響手蝎,中斷處理程序就需要盡可能快地運行榕莺。如果中斷本身要做的事情不多俐芯,那么處理起來也不會有太大問題棵介;但如果中斷要處理的事情很多,中斷服務(wù)程序就有可能要運行很長時間吧史。特別是邮辽,中斷處理程序在響應(yīng)中斷時,還會臨時關(guān)閉中斷。這就會導(dǎo)致上一次中斷處理完成之前吨述,其他中斷都不能響應(yīng)岩睁,也就是說中斷有可能會丟失。
4揣云、系統(tǒng)的中斷機制
事實上捕儒,為了解決中斷處理程序執(zhí)行過長和中斷丟失的問題,Linux 將中斷處理過程分成了兩個階段邓夕,也就是上半部和下半部:
上半部用來快速處理中斷刘莹,它在中斷禁止模式下運行,主要處理跟硬件緊密相關(guān)工作焚刚。
下半部用來延遲處理上半部未完成的工作点弯,通常以內(nèi)核線程的方式運行。
···············································································································
所以矿咕,這兩個階段你也可以這樣理解:
上半部直接處理硬件請求抢肛,也就是我們常說的硬中斷,特點是快速執(zhí)行碳柱;
而下半部則是由內(nèi)核觸發(fā)捡絮,也就是我們常說的軟中斷,特點是延遲執(zhí)行莲镣。
5锦援、Linux軟中斷與硬中斷小結(jié)
Linux 中的中斷處理程序分為上半部對應(yīng)硬件中斷,用來快速處理中斷剥悟。和下半部對應(yīng)軟中斷灵寺,用來異步處理上半部未完成的工作。Linux 中的軟中斷包括網(wǎng)絡(luò)收發(fā)区岗、定時略板、調(diào)度、等各種類型慈缔,可以通過查看/proc/softirqs 來觀察軟中斷的運行情況叮称。