0. 說明
進程
進程是處于執(zhí)行期的程序以及相關(guān)資源的總稱,,注意包含了兩個方面:
PID
任意一個進程通過PID作為標(biāo)識,,PID一般是一個正整數(shù)。
線程
對于Linux,,內(nèi)核并沒有線程這個概念,。Linux把所有的線程都當(dāng)做進程來實現(xiàn),線程僅僅被視為一個與其他進程共享某些資源的進程,。
進程的狀態(tài)
進程可以有5種狀態(tài):
2. ps的使用
ps的參數(shù)
Linux中查看進程的最重要的命令是ps,,學(xué)會ps的使用,就了解了進程的大部分內(nèi)容,。具體的參數(shù)都在man手冊,,常用的參數(shù)是:
a 顯示所有進程(包括其它用戶的進程)
-e 列出所有進程
x 顯示無控制終端的進程
u 輸出用戶名
e 列出程序時,顯示每個程序所使用的環(huán)境變量
f 顯示樹狀圖
-L 顯示線程
-o 按照自定義的格式輸出信息
-ww 在終端下不截斷命令
命令ps aux的輸出的各列如下:
需要解釋的是:
VSZ 表示如果一個程序完全駐留在內(nèi)存的話需要占用多少內(nèi)存空間;
RSS 指明了當(dāng)前實際占用了多少內(nèi)存;
STAT 顯示了進程當(dāng)前的狀態(tài):
ps輸出的進程狀態(tài)
進程的狀態(tài)和其表示符號如下:
D uninterruptible sleep (usually IO)
R running or runnable (on run queue) S interruptible sleep (waiting for an event to complete) T stopped, either by a job control signal or because it is being traced W paging (not valid since the 2.6.xx kernel) X dead (should never be seen) Z defunct ("zombie") process, terminated but not reaped by its parent For BSD formats and when the stat keyword is used, additional characters may be displayed: < high-priority (not nice to other users) N low-priority (nice to other users) L has pages locked into memory (for real-time and custom IO) s is a session leader l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do) + is in the foreground process group 3. 進程關(guān)系 進程的創(chuàng)建
Linux非常依賴進程創(chuàng)建來滿足用戶的需求,,比如在shell中輸入一條命令,,shell進程就生成一個新進程,新進程執(zhí)行shell的另一個拷貝,,這個拷貝的過程由fork()函數(shù)完成,。示例如下:
示例1:
可以看到用戶的終端shell的pid是18586,執(zhí)行ps程序時,,進程18586生產(chǎn)了新的子進程19110來運行ps,。
示例2:
示例中ps的輸出通過管道傳送給cat,可以看到,,運行ps的進程(19130)和運行cat的進程(19131)都是bash進程(18586)的子進程,。
由此可見,出了初始的內(nèi)核進程,,所有進程都由其父進程fork()產(chǎn)生,。
如果一個進程的父進程終止而自己繼續(xù)運行,則這種進程叫做孤兒進程(orphan process),,內(nèi)核會把init進程(即PID為1)的進程安排為孤兒進程的父進程,。
作業(yè)
顧名思義,作業(yè)就是完成某個任務(wù)的進程的集合,。作業(yè)可以在前臺或者后臺運行,。比如
示例1:
$ cat main.c
在前臺啟動了一個作業(yè),這個作業(yè)只包含了一個進程,,即cat。
示例2:
$ ps aux | grep -v root | cat
在前臺啟動了一個作業(yè),,這個作業(yè)包含了三個進程,,即ps, grep和cat
示例3:
$ ps aux | grep -v root | cat &
則是在后臺啟動了一個包含3個進程的作業(yè)
進程組
每個進程除了有一個唯一的PID外,還屬于一個進程組。
進程組是一個或多個進程的集合,。通常,,他們與統(tǒng)一作業(yè)相關(guān)聯(lián),可以接受來自同一終端的各種信號,。
每個進程組由一個進程組ID(PGID)標(biāo)識,。當(dāng)一個進程的PID等于其所在進程組的PGID時,我們稱這個進程是該進程組的組長,。
可以看到,,19299, 19300, 19301三個進程具有同樣的PGID(19299),說明它們屬于同一進程組,,組長進程為19299.
會話(session)
會話是一個或多個進程組的集合,。
同樣,會話由會話ID(SID)標(biāo)識,。如果一個進程的PID等于其所在會話的SID,,我們稱這個進程是該會話的會話首進程。
一個會話中的幾個進程組可以被分成一個前臺進程組(foreground process group)和一個或多個后臺進程組(background process group),。擁有控制終端的進程所在的進程組就是前臺進程組,,在終端中鍵入中斷鍵(Control + C),就會把中斷信號發(fā)給前臺進程組中的所有進程,。
|
|