在Linux系統中,觸發任意一個事件時,系統都會將它定義為一個進程,并且給予這個進程一個ID,稱為PID,同時依據觸發這個進程與用戶相關的屬性關系,給予這個PID一組有效的權限設置。
進程(Process)是計算機中的程序關于某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。在早期面向進程設計的計算機結構中,進程是程序的基本執行實體;在當代面向線程設計的計算機結構中,進程是線程的容器。程序是指令、數據及其組織形式的描述,進程是程序的實體。
線程是程序執行流的最小單元。一個標準的線程由線程ID,當前指令指針(PC),寄存器集合和堆棧組成。另外,線程是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程自己不擁有系統資源,只擁有一點兒在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源。一個線程可以創建和撤消另一個線程,同一進程中的多個線程之間可以并發執行。由于線程之間的相互制約,致使線程在運行中呈現出間斷性。線程也有就緒、阻塞和運行三種基本狀態。就緒狀態是指線程具備運行的所有條件,邏輯上可以運行,在等待處理機;運行狀態是指線程占有處理機正在運行;阻塞狀態是指線程在等待一個事件(如某個信號量),邏輯上不可執行。每一個程序都至少有一個線程,若程序只有一個線程,那就是程序本身。
線程是程序中一個單一的順序控制流程。進程內一個相對獨立的、可調度的執行單元,是系統獨立調度和分派CPU的基本單位指運行中的程序的調度單位。在單個程序中同時運行多個線程完成不同的工作,稱為多線程。
操作系統中最小的資源分配單位就是進程了,從系統啟動的那一刻起,就有一個個服務在被啟動起來,而每個進程都與其定義的發起者權限相關聯,所以我們的進程也會沿用我們定義的權限關系。
所以包括我們在shell中執行任務開啟的子進制,也會沿用父進程的權限。
程序彼此之間是有相關性的!以下面的圖示來看,連續運行兩個 bash 后,第二個 bash 的父程序就是前一個 bash。因為每個程序都有一個 PID ,那某個程序的父程序該如何判斷?就透過 Parent PID (PPID) 來判斷即可。子進程可以取得父進程的環境變量,有時候殺掉一個進程,過段時間又出現的話,如果不是crontab定時任務的話,那么很有可能就是它的父進程又創建了它哦。
進程可以分為守護進程和用戶進程:
守護進程(daemon),在系統引導過程中啟動的進程,與終端無關;
用戶進程,也稱前臺進程,通過終端啟動的進程,與終端相關;
進程的運行狀態:
運行態:running
就緒態(睡眠態):ready,又可分為可中斷(interruptable)和不可中斷(uninterruptable);
停止態:stoped,暫停于內存中,但不會被調度,除非手動啟動;
僵死態:zombie,父進程結束前,子進程不會結束;
進程根據消耗的資源分類,可以分為:
cpu-bound:CPU密集型的,消耗很多的cpu資源
io-bound:IO密集型,消耗很多的IO資源
進程的查看:
ps命令查看:可以跟3種格式:短參數帶"-",長參數形式“–”以及不帶“-”形式。
不帶“-”形式有:
a:顯示所有與終端相關的進程
x:顯示所有與終端無關的進程
u:以用戶為中心組織進程狀態信息顯示
f:顯示進程的父進程
o:顯示定制的信息
常用選型aux,即 “ps aux”,顯示如下:
第一行顯示字段:USER 發起該進程的用戶;PID 進程的進程id; %cpu 進程的當前cpu使用率; %MEM 進程的占用物理內存的比例; VSZ 虛擬內存集; RSS 真實分配內存,常駐內存集,不能交換到交換空間去;TTY 該進程運行在的終端號;STAT 當前狀態,其中有很多的狀態。運行態(R)、可終端睡眠(S)、不可終端睡眠(D)、停止(T)、僵死態(z)、前臺進程(+)、多線程進程(l)、低優先級進程(N)、高優先級進程(<)、回話主導者(s); START 發起進程的時間點;COMMAND 進程程序名。
帶“-”的選項
-e:顯示所有進程,相當于ax
-f/-F:顯示完整格式的進程信息
-H:以層級結構顯示進程的相關信息
常用選項為-efH
pgrep [options] pattern
-u <uid> :顯示有效用戶的進程
-U <username>:顯示指定用戶的進程
-t <終端名>: 顯示指定的終端相關的進程
-l: 顯示進程名
-a: 顯示完整格式的進程名
-P pid:顯示指定pid的子進程
pidof <進程名>: 根據進程名字取其pid
top命令:以動態刷新的方式顯示當前系統進程信息,如圖:
圖中黃色框內第一行顯示的內容分別為當前系統時間、系統已經運行了多長時間、過去1分鐘、5分鐘和15分鐘的平均負載;第二行顯示的任務數量以及任務的分布情況,需注意的是如果出現zombie前面的數字長時間不為0的話,就需要查看進程狀態,找出該僵死進程;第三行為cpu的使用情況:用戶空間使用率(us),系統空間使用率(sy),調整nice值的cpu使用率(ni),空閑比例(id),等待時間比例(wa),硬件中斷占用率(hi),軟件終端cpu使用率(si),被偷走(如使用虛擬化技術)的cpu比例(st)。第4和5行分別是內存和交換空間的使用情況。橢圓框內分別列出的是進程id(pid)、發起進程的用戶(USER)、優先級(PR)、nice值(NI)、線性內存使用大?。╒RTZ)、常駐內存大寫哦(RES)、空閑內存大?。⊿HR)、cpu使用率(%CPU)、內存使用率(%MEM)、從進程開始所使用的cpu時間(TIME+)以及命令名稱(COMMAND)。
在top命令運行的過程中,可以按"P"查看cpu占用率排序,“M”內存排序,“T”累計占用cpu時間排序,“l”顯示或者不顯示第一行的內容,“t”顯示或者不顯示任務以及cpu的統計信息,“m”調整內存統計信息的顯示。按“s”調試刷新數據的時間間隔,默認為3s,按“k”提示輸入pid,殺掉指點的pid的進程。
top命令常用選項:-d# 指定刷新時間間隔;-b 以批次方式顯示;-n # 顯示多少批次。
htop命令,top命令的擴展,使用圖形的方式顯示。如圖:
通過下面的菜單可以調整顯示的內容和方式,接口更友好。在運行的過程中按“l”顯示指定進程打開的文件;“a”將選定的進程綁定指定的cpu核心;“s”跟蹤指定進程發起的系統調用;“t”以層級關系顯示進程狀態。
vmstat命令:顯示虛擬內存狀態:
圖中procs字段:r代表等待運行的進程個數(cpu上等待運行的任務的隊列長度),b代表處于不可終端的睡眠態的進程個數(被阻塞的任務隊列的長度);
memory字段:swpd表示交換空間使用總量(如果使用過大,考慮增加內存);free表示空閑的物理內存總量;buffer表示用于緩沖的內存總量;cache表示用戶緩存的內存總量;
swap字段:si表示數據進入swap的數據速率(kb/s);so表示數據離開swap的速率(kb/s)
io字段:bi表示從塊設備讀入數據到系統的速度(kb/s);bo表示保存數據到塊設備的速率(kb/s)
system字段:in表示中斷速率;cs(centext switch)表示上下文切換速率
cpu字段:us表示用戶空間占用cpu比例;sy表示系統空間占用cpu比例;id表示空閑時間比例;wa表示等待時間比例;st代表被偷時間比例.
常用選項-s ,顯示內存統計數據
pmap命令用來查看指定進程的內存映射表,用法為 pmap [options] pid…
常用選項-x:指定進程的擴展信息,相當于cat /proc/PID/maps
glances命令,基于視窗的交叉平臺的監控工具,命令顯示為:
詳細顯示了cpu、任務、網絡、硬盤、分區和進程的情況,用”h“獲得幫助列表,常用的選項有-b:以字節為單位顯示網卡的數據速率;-d:關閉磁盤I/O模塊 -n :關閉網絡模塊 -t #:指定刷新時間;-m 關閉mount模塊; -1 每個cpu的數據單獨顯示; -f /PATH/TO/SOMEFILE 設定輸出文件的位置。
該命令常用C/S模式運行:服務端:glances -S -B IPADDE(本機地址); 客戶端:glances -C IPADDR(遠程主機ip)。
dstat命令:功能強大的系統資源統計工具,用法:
dstat # ##: #表示刷新時間,##為顯示次數;
-c:cpu狀態 -d:磁盤狀態 -i:中斷的信息 -m:內存的信息 -p:進程狀態 -n:網絡接口的統計數據 -s:swap的統計信息 –aio:異步IO的統計信息 –ipc:進程間通訊的相關信息 -g:page頁的相關統計 –tcp:tcp相關的統計信息 –udp:udp相關的統計信息 –top-cpu:最占用cpu的進程 –top-io:最占用IO的進程 –top-mem:最占用內存的進程 –top-lantency:延遲最大的進程。如果不指定選項,默認顯示如下:
上面的內容講述如何查看進程及其狀態,下面我們就來討論進程的管理。如何管理進程內,在linux系統中,通過IPC的方式進行管理,即進程間通信。到底有哪些信號呢,使用”kill -l“命令查看
這么多的信號,挑選常用的來演示。1)SIGHUP 無須關閉進程而讓其重讀配置文件 2)SIGINT 終止正在運行的進程,相當于Ctrl+c 9)SIGKILL 強行殺掉運行中的進程 15)SIGERM 終止正在運行的進程 18)SIGCONT 繼續運行 19)SIGSTOP 后臺休眠。
使用格式為:kill [-s singal|-SINGAL] pid…如要殺掉某進程kill -9 PID或者kill -SIGKILL PID。
kill后面跟的是PID,指定的是某一個進程,某些程序在運行的時候,會產生很多進程。要想殺死該程序發起的多個進程,用kill就比較麻煩。解決這個問題,可以使用killall命令,它可以殺死一個進程集。用法是killall PIDNAME。
系統在運行過程中,每時每刻都有很多進程在后臺,有的運行,有的睡眠,有的等待。那么,系統怎么知道下一刻需要運行什么進程,調度的優先級怎么確定的呢。實際上,系統給每個進程打上了一個標簽,區分每個進程的優先度的。這個就是優先級。
圖中框內的PRI和NI就是確定進程優先級的數值。PRI是內核自己調整的,用戶無法去調整該值,但是可以調整NI(nice)值去影響PRI的值,從而達到調整PRI的目的。nice值的范圍為-20~19,管理員可以調整自己或者其他的人的nice值,而一般用戶只能調整自己進程的nice值,并且范圍為0~19,而且只能將nice值往大的調整,不能往小的調整。
在程序運行前指定nice值:nice -n [COMMAND]。如使用命令nice -了3 ping 127.0.0.1 & 可以是ping命令在后臺以nice值為3運行。
調整正在運行的程序的nice值:renice -n # pid
使用ping命令,使用的時候NI如下,
使用命令renice -n -6 10131后,優先級和nice值為:
作業控制
Linux系統的作業可以分為前臺作業和后臺作業。前臺作業是通過終端啟動,且啟動后一直占據終端;后臺作業是不通過終端啟動或者是通過終端啟動后轉入后臺運行??梢杂袃煞N方式讓程序運行于后臺:1、在運行中的作業,通過Ctrl+z命令將其送入后臺,但是在后臺是停止狀態;2、在運行命令時加上”&“,如vim&可以讓命令直接后臺運行。
注意:后臺運行的程序仍然與終端相關,如果終端關閉,與該終端相關的后臺程序也會被關閉。如果要想后臺程序與終端剝離開來,可以使用”nohup COMMAND &“或者”screen;COMMAND“實現。
使用命令jobs查看所有的后臺作業:
如上圖,有兩個后臺作業,一個在運行,一個停止,[#]為后臺作業的編號。fg命令可以將指定的后臺作業調回前臺運行,如上圖,將vim調回前臺運行使用命令:fg %2(%可以省略)。有些進入后臺的程序處于停止狀態,要想讓其在后臺繼續運行,可以使用命令:bg %#(%可省略),其中#為后臺作業編號;想要終止后臺作業:kill %#(此處%不能shenglve)#為后臺作業標號。
原創文章,作者:王更生,如若轉載,請注明出處:http://www.www58058.com/60799