【講清楚,說明白!】進程管理

目錄:
(一)瞭解進程的概念
(二)如何查看進程&&殺死進程
(三)把程序放置後臺運行
(四)瞭解進程優先級
(五)調整進程優先級


(一)瞭解進程的概念
(1.1)在我們系統後臺中有比較多的概念,第一個“程序”,指的是使用某種語言開發出來的一段代碼,是靜態存放在我們計算機硬盤上的program,它既不消耗CPU資源,也不消耗內存資源。第二個是“進程”,當一個程序運行的時候,在內存和CPU裏會有體現,例如我們計算機中運行的QQ、迅雷等應用程序,稱之爲process。第三個是“線程”,線程屬於進程裏的一個單元,一個進程裏可以包含多個線程,這些線程會共享進程的內存空間。
(1.2)我們知道系統中的每個用戶都有自己的ID號,簡稱UID,同樣每個進程頁都有自己的ID號,process id簡稱PID。進程在運行的過程中也可能會產生子進程,例如運行的A進程進過一段時間的運行後會產生一個B進程,此時我們稱A進程爲父進程,稱B進程爲子進程,父進程可能生成一個子進程,也可能會殺死一個子進程,因此父進程和子進程之間是會通信的,我們把這種通信稱之爲“信號”
【講清楚,說明白!】進程管理


(二)如何查看進程&&殺死進程
(2.1)pstree命令
(2.1.1)我們首先來查看進程之間的父子關係,我們可以使用pstree命令,在vms002主機上它可以查詢出系統中所有進程的父子關係,其中系統啓動後所有進程的父進程是systemd,它的PID爲1,而rhel6及以前的版本,所有系統的父進程是init。
【講清楚,說明白!】進程管理
(2.1.2)pstree以樹狀圖顯示進程,只顯示進程的名字,且相同進程合併顯示,我們還能以樹狀圖顯示進程,並顯示進程PID
# pstree -p---以樹狀圖顯示進程,並顯示進程PID
# pstree -p | more
【講清楚,說明白!】進程管理
(2.2)父進程會定期的向子進程發送信號,那麼系統中的信號有哪些呢?我們可以使用“# kill -l”命令列出系統中所有的信號列表,其中1)SIGHUP表示掛起,就是是重啓,如果我們想重啓某個服務,但是不想改變其ID號,就可以使用1號信號;其中2)SIGINT表示通常情況下,我們使用“Ctrl+C”的方式終止進程的方式;而15)SIGTERM表示使用常規的方式終止進程,例如我們使用kill命令不加任何參數終止某進程的時候,默認就是使用15號信號操作的,但是威力不夠強,對於異常狀態的進程是無法終止的;此時我們使用9)SIGKILL信號,表示強制終止某進程,威力也比較強。
# kill -l---列出系統中所有的信號列表
# kill -2 29626---使用“Ctrl+C”的方式終止29626進程
【講清楚,說明白!】進程管理
(2.3)殺死進程的方式
(2.3.1)如果我們開啓了一個進程,例如運行了一個firefox,我們應該怎樣查看進程的PID號呢?首先我們可以使用pgrep命令,然後直接加上程序名就可以查詢出進程的PID號了(圖2-3),然後使用kill命令將所查詢的異常進程殺死就可以了。當然我們也可以將兩個步驟合併成一個步驟執行(圖2-4)。
# pgrep firefox---查詢firefox進程的PID號
# kill -9 $(pgrep firefox)---強制殺死firefox進程
# kill -9 pgrep firefox---強制殺死firefox進程
【講清楚,說明白!】進程管理
【講清楚,說明白!】進程管理
(2.3.2)當然除了kill命令我們也可以使用killall命令,直接跟上程序名即可。
# killall firefox---殺死firefox進程
【講清楚,說明白!】進程管理
(2.3.3)我們也可以使用pkill,其中pkill可以實現把系統中某用戶踢出的功能。首先我們使用jerry用戶登錄到vms002主機(圖2-5-1),此時我們發現系統中是存在jerry用戶登錄的,我們使用pkill命令將jerry用戶踢出(圖2-5-2),此時我們使用管理員刪除jerry用戶及其家目錄的時候,便可以順利的操作了(圖2-5-3)。
# pkill -kill -t pts/1
# userdel -r jerry
【講清楚,說明白!】進程管理
【講清楚,說明白!】進程管理
【講清楚,說明白!】進程管理
(2.4)查看進程我們還可以使用pidof命令,不過我們發現pidof命令後需要跟具體的進程名稱,如果進程名稱查詢時有不一致的地方都是無法查詢出來,相比pgrep命令,pgrep可以使用模糊查詢的方式查詢,因此更加高效。
# pidof firefox---查詢firefox的進程號
【講清楚,說明白!】進程管理
(2.5)ps列的選項及意義
(2.5.1)如果我們希望查詢系統中所有的進程的情況,可以使用ps命令,如果我們只是使用ps命令的時候是隻能查詢當前終端裏shell進程下自己的幾個進程而已,並不能看到其他終端裏的進程,也無法看到系統的後臺進程。所以此時我們希望查詢到系統中所有進程時,可以使用如下兩種方式查詢:
# ps -ef---使用Linux風格的方式顯示系統後臺進程
# ps aux---使用Unix風格的方式顯示系統後臺進程
【講清楚,說明白!】進程管理
【講清楚,說明白!】進程管理
(2.5.2)接着我們來了解一下“# pa aux”命令中每一列代表的含義。
# ps aux | head---查詢頭10行的信息
USER:進程的屬主
PID:進程的ID
PPID:父進程
%CPU:進程佔用的CPU百分比
%MEM:佔用內存的百分比
NI:進程的NICE值,數值大,表示較少佔用CPU時間
VSZ:該進程使用的虛擬內存集(KB)
RSS:該進程佔用的固定內存量(KB)(駐留中頁的數量)
TTY:該進程在那個終端上運行(登陸者的終端位置),若與終端無關,則顯示(?)問號,若爲pts/0等,則表示由網絡連接主機進程
WCHAN:當前進程是否正在進行,若爲“-”表示正在進行
START:該進程被觸發啓動時間
TIME:該進程實際使用CPU運行的時間
COMMAND:命令的名稱和參數
(2.5.3)我們來了解一下STAT狀態這一列的相關含義。
D:不可中斷的休眠狀態(通常IO的進程)
R:正在運行中的隊列中可執行的狀態
S:處於休眠狀態
T:停止或被追蹤
W:進入內存交換(從內核2.6開始無效)
X:死掉的進程(基本很少見)
Z:殭屍進程
<:優先級較高的進程
N:優先級較低的進程
L:有些頁被鎖進內存
s:進程的領導者(在它之下有子進程)
l:多進程的(使用CLONE_THREAD,類似NPTL pthreads)
+:位於後臺的進程組
【講清楚,說明白!】進程管理
(2.6)ps命令的其它用法
(2.6.1)我們可以使用lscpu查詢當前系統的cpu使用情況(圖3-6),現在我們系統中運行了一個應用程序firefox,我們希望查詢這個程序具體是在當前系統的哪個CPU上運行的,我們可以使用ps命令做如下的查詢(圖3-7)。
# lscpu
# ps mo pid,comm,psr $(pgrep firefox)---查詢firefox進程及其線程運行在哪個CPU上,psr表示運行在哪顆CPU
【講清楚,說明白!】進程管理
【講清楚,說明白!】進程管理
(2.6.2)如果我們想指定查詢ps命令具體的哪幾列的信息,則可以使用如下的方式查詢:
# ps -ex -o pid,%cpu,%mem | head---查詢ps命令具體列的信息
【講清楚,說明白!】進程管理


(三)把程序放置後臺運行
(3.1)使用nohup
(3.1.1)當父進程關閉的時候,它所對應的子進程全部跟着關閉。我們在vms002主機上首先打開一個firefox進程,使用pstree命令發現,firefox是運行在第三個終端bash之上的。
# pstree | grep -C2 firefox
# ps aux | grep -v grep | grep firefox
【講清楚,說明白!】進程管理
【講清楚,說明白!】進程管理
(3.1.2)當我們將第三個終端關閉之後,會發現在終端中創建的firefox應用程序也自動關閉了。
# ps aux | grep -v grep | grep firefox
【講清楚,說明白!】進程管理
(3.1.3)但是很多時候我們會通過遠程連接的方式執行腳本,如果執行一個腳本需要10個小時,是否是說我們需要將終端保持連接10個小時不關閉?因此爲了解決這個問題,我們需要將運行的進程放置到後臺運行(圖3-4),此時我們發現關閉了所有的終端後firefox仍然能夠正常的運行。
# nohup firefox &> /dev/null &---我們創建一個firefox並放置到後臺運行
# ps aux | grep -v grep | grep firefox---查詢當前firefox的運行狀態
# pstree | grep -C2 firefox---使用pstree查詢firefox的運行狀態
注意:grep -v grep表示的是反向過濾,不去搜索grep命令後包含的字段
【講清楚,說明白!】進程管理
【講清楚,說明白!】進程管理
(3.2)使用jobs
(3.2.1)當我們在vms002的終端直接運行一個firefox進程後,發現此時終端就無法再運行其他的命令了,此時我們可以使用鍵盤“Ctrl+Z”將firefox程序停止並放到後臺。
【講清楚,說明白!】進程管理
(3.2.2)如果我們希望查詢在後臺的程序狀態信息,可以使用jobs命令查看。如果我們想將停止的firefox程序放在後臺激活運行,可以使用“# bg 1”命令。
# jobs---查詢進程的狀態
# bg 1---將1號jobs激活並放在後臺運行
【講清楚,說明白!】進程管理
(3.2.3)如果我們希望將後臺運行程序調到前臺來,則可以使用“# fg 1”命令,如果我們想終止運行的程序,則可以使用“Ctrl+C”命令。如果我們在運行程序的時候想直接運行在後臺,則應該使用“# firefox &”這種方式即可,如果我們想結束進程則可以使用kill命令,其中1號jobs使用“%1”表示。
注意:雖然我們將firefox放置到後臺運行了,但是此時firefox仍然是在當前的終端上運行的,即如果當前終端關閉了那麼此進程也會被關閉,這個要和nohup區分(圖3-12)。
# fg 1---希望將後臺運行程序調到前臺來運行
# firefox &---運行程序的時候想直接運行在後臺
# kill -9 %1---結束進程
# ps aux | grep -v grep | grep firefox
【講清楚,說明白!】進程管理
【講清楚,說明白!】進程管理


(四)瞭解進程優先級
(4.1)在我們系統中所有的任務都是由CPU來完成的,在系統中如果一顆CPU有多顆核,那麼我們認爲就是有多顆CPU。在計算機中我們是可以一次性執行多個任務的,同時一顆CPU也是可以同時執行多個任務的。對於CPU來說,是分爲時間片執行的,例如現在系統中有多個任務,那麼CPU會對每個任務分片執行,假設每個時間片的時長是1ms,由CPU輪詢的在每個任務之間循環執行,由於時間片循環的速度非常快,因此一般我們在系統中操作的時候是感覺不到有時間片在輪詢的。有時候我們會感覺系統中某些任務是非常重要的,需要CPU優先執行,此時我們是可以在系統中調整進程的優先級的。優先級的組成如下(圖4-1),一般來說,使用chrt命令可以修改優先係數,不過一般不建議修改(圖4-2),而nice值的範圍是“-20~19”之間,nice值越小優先級越高,nice值越大優先級越低。我們在圖形化界面中可以調整進程的優先級的,我們選擇“應用程序”--“系統工具”--“系統監視器”,然後便可以在圖形化界面中修改進程的優先級了。
【講清楚,說明白!】進程管理
【講清楚,說明白!】進程管理
【講清楚,說明白!】進程管理
(4.2)如果我們的系統現在有兩個進程,同時有兩顆CPU,如果一個CPU上單獨運行一個進程,那麼對這兩個進程設置進程優先級是沒有意義的,但是我們希望能出現搶佔資源這種情況,因此我們需要把兩個進程放到一顆CPU上去運行。我們想要實現這樣的效果,一般可以採用兩種方式,第一種是關閉掉其中的一顆CPU,第二種方式是配置CPU的親和性。


(五)調整進程優先級
(5.1)當前系統我們有兩顆CPU,首先我們通過關閉其中的一顆CPU的方式來實現進程對資源搶佔的效果,我們在vms002主機上進入到/sys/devices/system/cpu/cpu1目錄下,發現online的值爲1,表示正在啓用的狀態,我們可以將online的值設置爲0,此時表示1號CPU處於關閉的狀態(圖5-2),我們發現系統中確實此時只有0號CPU在運行(圖5-3)。
【講清楚,說明白!】進程管理
【講清楚,說明白!】進程管理
【講清楚,說明白!】進程管理
(5.2)top命令每一行的含義
(5.2.1)接着我們在vms002主機上執行兩個cat命令,實現不斷消耗內存的效果(圖5-4)。然後我們使用top命令查詢當前系統所有進程的情況,再按鍵盤1可以顯示所有CPU運行的信息,其中第一行“top - 18:01:29 up 11:52, 6 users, load average: 2.72, 2.11, 1.11”分別代表的是當前的時間是18:01:29,機器一共運行了11:52的時長,當前系統有6 users個用戶登錄,機器在一分鐘、五分鐘、十五分鐘的負載分別是“2.72, 2.11, 1.11”。第二行“Tasks: 475 total, 7 running, 468 sleeping, 0 stopped, 0 zombie”表示的是系統總共有進程475 total,其中7 running在運行,有468 sleeping在睡眠狀態,有0 stopped個是停止的,有0 zombie時殭屍的狀態。由於我們將1號CPU關閉了,所以此時2個進程都是在0號CPU上搶佔式運行(圖5-5)。第三行“%Cpu(s): 20.4 us, 79.6 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st”表示的是系統用戶進程使用CPU百分比爲20.4 us,內核中的進程佔用CPU百分比爲79.6 sy,用戶進程空間內改變過優先級的進程佔用CPU百分比爲0.0 ni,空閒CPU百分比爲0.0 id,CPU等待I/O完成的時間總量爲0.0 wa(如果wa佔用較多CPU,原因是磁盤性能有問題,建議更換磁盤),硬件中斷佔用CPU百分比爲0.0 hi,軟件中斷佔用CPU百分比爲0.0 si,被虛擬內存偷走佔用CPU百分比爲0.0 st。
注意:htop命令也可以實現top命令的相關顯示,不過需要我們額外的安裝相關的軟件包
# cat /dev/zero > /dev/null &
# top -d 1---每1秒中更新一次所有進程的顯示
【講清楚,說明白!】進程管理
【講清楚,說明白!】進程管理
(5.2.2)經驗:
0.0 hi:硬中斷,佔的CPU百分比。硬中斷是由硬件產生的,比如,像磁盤、網卡、鍵盤、時鐘等。每個設備或設備集都有它自己的IRQ(中斷請求)。基於IRQ,CPU可以將相應的請求分發到對應的硬件驅動上(注:硬件驅動通常是內核中的一個子程序,而不是一個獨立的進程)hi->Hardware IRQ:The amount of time the CPU has been servicing hardware interrupts
0.0 si:軟中斷,佔的CPU百分比。通常軟中斷是一些對I/O的請求。這些請求會調用內核中可以調度I/O發生的程序。對於某些設備,I/O請求需要被立即處理,而磁盤I/O請求通常可以排隊並且可以稍後處理。根據I/O模型的不同,進程或許會被掛起直到I/O完成,此時內核調度器就會選擇另一個進程去運行。I/O可以在進程之間產生並且調度過程通常和磁盤I/O的方式是相同的。Si->Software Interrupts:The amount of time the CPUhas been servicing software interrupts。
0.0 st:虛擬機偷取物理CPU的時間。比如:物理機已經運行了KVM,KVM虛擬機佔用物理機的CPU時間。
(5.2.3)第四行中“Mem : 4033636 total”表示物理內存總量,“3265760 free”表示空閒內存總量,“380604 used”表示使用的物理內存總量,“387272 buff/cache”表示用作內核緩存的內存量和free -k是一個意思。第五行中“Swap: 6291448 total”表示交換區總量,“6291448 free”表示空閒交換分區總量,“0 used”表示使用的交換區總量,“3394360 avail Mem”表示總的可利用內存是多少。
【講清楚,說明白!】進程管理
(5.2.4)第六行中PID表示進程id,USER表示進程所有者的用戶名,PR表示由內核動態調整的優先級、用戶不能修改,NI表示進程優先級即nice值、負值表示高優先級、正值表示低優先級、用戶可以自己調整,VIRT表示虛擬內存、是進程正在使用的所有內存,RES表示的是常駐內存集(resident memory usage),SHR表示的是共享內存大小(shared memory)單位kb,S表示進程狀態、其中D(不可中斷的睡眠狀態)、R(運行中或可運行)、S(睡眠中)、T(已跟蹤/已停止)、Z(僵死),%CPU表示上次更新到現在的CPU時間佔用百分比,%MEM表示進程使用的物理內存百分比,TIME+表示使用的CPU時間總計、單位1/100秒,COMMAND表示命令行。
注意:對於SHR:1、除了M自身進程的共享內存,也包括其他進程的共享內存;2、雖然進程只使用了幾個共享庫的函數,但它包含了整個共享庫的大小;3、計算某個進程所佔的物理內存大小公式爲RES-SHR;4、swap out後,它將會降下來
【講清楚,說明白!】進程管理
(5.2.5)對於top快捷鍵:
默認3s刷新一次,按s鍵刷新時間
按空格:立即刷新
q:退出
P:按CPU排序(CPU進行排序)
M:按內存排序
T:按時間排序
數字鍵1:顯示每個內核的CPU使用率
u/U:指定顯示的用戶
h:幫助
# top -p 9465---使用top命令動態只查看某個或某些進程的信息
【講清楚,說明白!】進程管理
(5.3)此時我們在圖5-5中發現兩個cat進程的NICE值都是0是一致的,而我們希望將進程11239的進程優先級提高,我們可以使用renice命令。我們發現11239進程的nice值爲-19,CPU的佔用率爲96.1%,而11232的nice值爲0,CPU的佔用率只有1.9%,因此我們通過設置nice值而實現了進程搶佔資源的效果,最後我們使用killall命令終止cat命令的總線。
# renice -n -19 11239---將11239進程的nice值設置爲-19
# killall -7 cat---終止cat命令的總線
【講清楚,說明白!】進程管理
【講清楚,說明白!】進程管理
(5.4)調整進程優先級
(5.4.1)接着我們將1號CPU開啓,實現1號CPU和0號CPU都是啓用的狀態(圖5-8),並重新運行兩個cat命令,實現不斷消耗內存的效果(圖5-9),此時我們發現兩個進程是分別在兩個CPU上運行的(圖5-10)。
# echo 1 > cpu1/online
# cat /dev/zero > /dev/null &
【講清楚,說明白!】進程管理
【講清楚,說明白!】進程管理
【講清楚,說明白!】進程管理
【講清楚,說明白!】進程管理
(5.4.2)當然現在我們想具體的知道每個進程究竟是在哪個CPU上運行的,我們可以使用ps命令,此時我們發現13884進程是在0號CPU上運行,13899是在1號CPU上運行的。
# ps mo pid,comm,psr `pgrep cat`
【講清楚,說明白!】進程管理
(5.4.3)現在我們希望在兩顆CPU都是啓用的狀態下,仍然能夠指定進程所有的進程都在同一顆CPU上運行,我們可以使用taskset命令進行指定(圖5-12),此時我們發現兩個進程都已經在同一個CPU上運行了,且各佔0號CPU運行的50%的容量(圖5-13)。
# taskset -c 0 cat /dev/zero > /dev/null &---指定一個cat進程在0號CPU上運行
# ps mo pid,comm,psr pgrep cat---查詢進程是在哪顆CPU上運行
# top -d 1---使用top命令並且每1秒更新一次
【講清楚,說明白!】進程管理
【講清楚,說明白!】進程管理
(5.5)我們在調整優先級的時候,都是修改已經運行了的進程的優先級,那麼我們是否可以以某優先級來運行某程序呢?其實這個是可以的,我們使用nice指定進程的優先級爲-10,然後開始運行一個cat循環的命令(圖5-14)。我們使用top命令後發現創建的-10的nice值的進程已經運行了(圖5-15)。
# nice -n -10 taskset -c 1 cat /dev/zero > /dev/null &---我們使用nice指定進程的優先級爲-10,然後開始運行一個cat循環的命令
# top -d 1
【講清楚,說明白!】進程管理
【講清楚,說明白!】進程管理

—————— 本文至此結束,感謝閱讀 ——————

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章