如果用戶(hù)在 UNIX 操作系統(tǒng)上執(zhí)行了一個(gè)程序,那么操作系統(tǒng)會(huì)為這個(gè)程序創(chuàng)建一個(gè)運(yùn)行它的特定環(huán)境。這個(gè)環(huán)境包含系統(tǒng)運(yùn)行該程序所需的一切資源,使得好像系統(tǒng)中沒(méi)有運(yùn)行其他程序一樣。
用戶(hù)如果在 UNIX 操作系統(tǒng)中輸入一個(gè)指令,操作系統(tǒng)就會(huì)創(chuàng)建(啟動(dòng))一個(gè)相應(yīng)的進(jìn)程。比如,如果用戶(hù)希望使用 ls 指令來(lái)列出目錄內(nèi)的文件列表時(shí),系統(tǒng)就啟動(dòng)了一個(gè)進(jìn)程來(lái)完成這個(gè)任務(wù)。簡(jiǎn)單的說(shuō),進(jìn)程就是一個(gè)可執(zhí)行程序的實(shí)例。
操作系統(tǒng)通過(guò)一個(gè) 5 位的 ID 號(hào)碼來(lái)追蹤進(jìn)程,這個(gè) ID 號(hào)碼 通常被稱(chēng)為pid 或進(jìn)程 ID。操作系統(tǒng)中的每一個(gè)進(jìn)程都有唯一 pid。
由于所有的進(jìn)程 ID 是循環(huán)使用的,所以 pid 是會(huì)重復(fù)的。不過(guò),在操作系統(tǒng)中,不存在兩個(gè)進(jìn)程擁有統(tǒng)一進(jìn)程 ID 的情況。
如果用戶(hù)創(chuàng)建一個(gè)進(jìn)程(執(zhí)行一個(gè)指令),那么可以?xún)煞N方式來(lái)運(yùn)行它。
默認(rèn)情況下,任何一個(gè)用戶(hù)創(chuàng)建的進(jìn)程都會(huì)在前端執(zhí)行。該進(jìn)程可以從鍵盤(pán)獲取輸入信息并且可以將執(zhí)行結(jié)果反饋到顯示器上。
我們可以使用 ls 指令來(lái)觀察這個(gè)過(guò)程。如果用戶(hù)希望列出當(dāng)前目錄下的所有文件,用戶(hù)需要在終端命令行鍵入如下指令:
$ls ch*.doc
這個(gè)指令將會(huì)顯示所有文件名稱(chēng)以 ch 開(kāi)頭,以 .doc
結(jié)尾的文件。
ch01-1.doc ch010.doc ch02.docch03-2.doc
ch04-1.doc ch040.doc ch05.docch06-2.doc
ch01-2.doc ch02-1.doc
該指令對(duì)應(yīng)的進(jìn)程在前臺(tái)進(jìn)行,輸出結(jié)果直接顯示在顯示屏上,如果 ls 執(zhí)行需要獲取輸入,那么該進(jìn)程會(huì)等待來(lái)自鍵盤(pán)的輸入信息。
當(dāng)程序在前臺(tái)執(zhí)行的時(shí)候,用戶(hù)無(wú)法執(zhí)行其他的指令(創(chuàng)建其他的進(jìn)程),這是因?yàn)橄到y(tǒng)會(huì)提示其他進(jìn)程無(wú)法創(chuàng)建直到當(dāng)前進(jìn)程執(zhí)行完畢。
后臺(tái)進(jìn)程不需要鍵盤(pán)輸入的信息就可以執(zhí)行。如果后臺(tái)進(jìn)程需要鍵盤(pán)等外設(shè)的輸入信息的話,那么它會(huì)等待。
后臺(tái)進(jìn)程的優(yōu)點(diǎn)是用戶(hù)可以執(zhí)行其他的指令。用戶(hù)此時(shí)不需要等待進(jìn)程結(jié)束就可以執(zhí)行其他的進(jìn)程。
開(kāi)啟一個(gè)后臺(tái)進(jìn)程的最簡(jiǎn)單的方法就是在指令的末尾添加 &
標(biāo)識(shí)符。
$ls ch*.doc &
這個(gè)指令也會(huì)示所有文件名稱(chēng)以 ch 開(kāi)頭,以 .doc
結(jié)尾的文件。
ch01-1.doc ch010.doc ch02.docch03-2.doc
ch04-1.doc ch040.doc ch05.docch06-2.doc
ch01-2.doc ch02-1.doc
如果這里的 ls 指令希望得到輸入信息,它會(huì)轉(zhuǎn)換為停止?fàn)顟B(tài)直到用戶(hù)將他轉(zhuǎn)到前臺(tái)并獲取到從鍵盤(pán)來(lái)的輸入信息。
第一行顯示了后臺(tái)進(jìn)程的信息——作業(yè)號(hào)和進(jìn)程 ID,用戶(hù)需要使用作業(yè)號(hào)來(lái)完成前景和后臺(tái)之間的切換。
如果用戶(hù)按下回車(chē)鍵,可以看到如下信息:
[1] + Done ls ch*.doc &
$
第一行表示 ls 指令的后臺(tái)進(jìn)程已經(jīng)成功執(zhí)行。第二行提示可以執(zhí)行其他的指令。
可以使用 ps 指令來(lái)顯示當(dāng)前操作系統(tǒng)處于執(zhí)行狀態(tài)的進(jìn)程,結(jié)果如下:
$ps
PID TTY TIMECMD
18358 ttyp3 00:00:00sh
18361 ttyp3 00:01:31abiword
18789 ttyp3 00:00:00ps
使用 ps 指令時(shí),通常會(huì)選擇 -f 選項(xiàng)。該選項(xiàng)可以顯示更為詳細(xì)的內(nèi)容。
$ps -f
UID PID PPID C STIME TTY TIME CMD
amrood 6738 3662 0 10:23:03 pts/6 0:00 first_one
amrood 6739 3662 0 10:22:54 pts/6 0:00 second_one
amrood 3662 3657 0 08:10:53 pts/6 0:00 -ksh
amrood 6892 3662 4 10:51:50 pts/6 0:00 ps -f
下面是 -f
選項(xiàng)列出內(nèi)容的的相關(guān)解釋。
列名稱(chēng) | 意義 |
---|---|
UID | 執(zhí)行該進(jìn)程的用戶(hù)ID |
PID | 進(jìn)程編號(hào) |
PPID | 該進(jìn)程的父進(jìn)程編號(hào) |
C | 該進(jìn)程所在的CPU利用率 |
STIME | 進(jìn)程執(zhí)行時(shí)間 |
TTY | 進(jìn)程相關(guān)的終端類(lèi)型 |
TIME | 進(jìn)程所占用的CPU時(shí)間 |
CMD | 創(chuàng)建該進(jìn)程的指令 |
如下是其他配合 ps 指令的選項(xiàng):
選項(xiàng) | 意義 |
---|---|
-a | 顯示所有用戶(hù)的信息 |
-x | 顯示關(guān)于沒(méi)有終端的進(jìn)程的信息 |
-u | 顯示類(lèi)似 -f 的其他附加信息 |
-e | 顯示擴(kuò)展信息 |
用戶(hù)可以使用多種方式來(lái)停止一個(gè)進(jìn)程。通常情況下,可以通過(guò)終端指令來(lái)完成,比如,同時(shí)按下 CTRL+C 鍵就可以停止當(dāng)前執(zhí)行的指令。這種方式僅在程序以前臺(tái)的方式執(zhí)行的情況下起作用。
如果一個(gè)進(jìn)程以后臺(tái)的方式在執(zhí)行,那么首先用戶(hù)需要通過(guò) ps 指令來(lái)獲取它的作業(yè)編號(hào),然后用戶(hù)可以使用 kill 指令來(lái)殺掉該進(jìn)程。如下:
$ps -f
UID PID PPID C STIMETTY TIME CMD
amrood 6738 3662 0 10:23:03 pts/6 0:00 first_one
amrood 6739 3662 0 10:22:54 pts/6 0:00 second_one
amrood 3662 3657 0 08:10:53 pts/6 0:00 -ksh
amrood 6892 3662 4 10:51:50 pts/6 0:00 ps -f
$kill 6738
Terminated
這里的 kill 指令收終止指令為 first_one 對(duì)應(yīng)的進(jìn)程。如果某個(gè)進(jìn)程無(wú)視常規(guī)的 kill 指令。用戶(hù)可以使用 kill -9 后跟進(jìn)程編號(hào)的方式來(lái)終止指令,如下:
$kill -9 6738
Terminated
UNIX 系統(tǒng)中的每一個(gè)進(jìn)程都有兩個(gè) ID 號(hào)碼:進(jìn)程 ID(pid)和父進(jìn)程 ID(ppid).系統(tǒng)中的每一個(gè)用戶(hù)進(jìn)程均有父進(jìn)程。
大部分使用 shell 執(zhí)行的指令均有他們各自的父進(jìn)程。使用 ps -f
指令可以顯示出每個(gè)進(jìn)程相對(duì)應(yīng)的進(jìn)程 ID和其父進(jìn)程 ID.
通常情況下,當(dāng)某個(gè)子進(jìn)程被殺掉后,其父進(jìn)程會(huì)被 SIGCHILD 信號(hào)通知。然后,該父進(jìn)程會(huì)做一些必要的操作或者啟動(dòng)一個(gè)新的子進(jìn)程。然而,有時(shí)候是父進(jìn)程先于子進(jìn)程被殺掉。這種情況下,被稱(chēng)為“所有進(jìn)程的父進(jìn)程”的 init 進(jìn)程就稱(chēng)為該子進(jìn)程的父進(jìn)程。這些子進(jìn)程也稱(chēng)為孤兒進(jìn)程。
當(dāng)某個(gè)進(jìn)程被殺掉后,ps 指令列出的列表里顯示該進(jìn)程標(biāo)志位 Z 狀態(tài)。它就是一個(gè)僵尸進(jìn)程。該進(jìn)程處于死亡狀態(tài)并且不會(huì)被再次使用。這些進(jìn)程不同于孤兒進(jìn)程。他們是已經(jīng)完成任務(wù)的進(jìn)程,但是仍在進(jìn)程表中留有一個(gè)入口。
守護(hù)進(jìn)程是操作系統(tǒng)相關(guān)的后臺(tái)進(jìn)程,他們通常以 root 權(quán)限執(zhí)行,并且會(huì)相應(yīng)其他進(jìn)程的請(qǐng)求。
守護(hù)進(jìn)程沒(méi)有控制終端。它也不能打開(kāi) /dev/tty
。如果用戶(hù)使用"ps -ef" 指令來(lái)查看 tty 域,所有的守護(hù)進(jìn)程在該域都會(huì)顯示?。
更詳細(xì)的來(lái)講,守護(hù)進(jìn)程就是執(zhí)行在后臺(tái)的進(jìn)程,且它會(huì)等待某個(gè)事件的發(fā)生,從而相應(yīng)該事件。比如打印機(jī)守護(hù)進(jìn)程一直在等待打印的指令。
如果用戶(hù)的某個(gè)程序需要長(zhǎng)時(shí)間的執(zhí)行,那么可以將它設(shè)計(jì)為守護(hù)進(jìn)程的啟動(dòng)方式。
top 指令是用于顯示以不同條件排序進(jìn)程的指令。
它是一個(gè)頻繁更新的交互式診斷工具,會(huì)動(dòng)態(tài)的顯示如下和相關(guān)進(jìn)程的如下信息:物理內(nèi)存、虛擬內(nèi)存、CPU 利用率、負(fù)載率。
下面是一個(gè)簡(jiǎn)單的例子來(lái)執(zhí)行 top 指令,且查看不同繼承的CPU使用率。
$top
后臺(tái)的且阻塞狀態(tài)的進(jìn)程通常使用作業(yè)編號(hào)來(lái)維護(hù)。該作業(yè)編號(hào)不同于進(jìn)程編號(hào)。
此外,作業(yè)可以包含多個(gè)進(jìn)程,這些進(jìn)程可以串行執(zhí)行,也可以并行執(zhí)行,所以使用作業(yè)編號(hào)比跟蹤單個(gè)的進(jìn)程會(huì)更加簡(jiǎn)單。
更多建議: