Unix – 行程(Process)

這裡討論的內容以 FreeBSD 為主,可能會與 linux 系的不同。

行程(Process)簡單來說就是正在運行中的程式。 每一支程式執行時,都會產生對應的新行程,而這些行程都有屬於自己的 Process ID(或稱 PID)來代表自己, 之所以不直接用程式名稱來代表是因為除了避免同名外,還因為同一支程式也可以同時執行很多次, 如果用程式名稱來代表的話,就不能區分了。

每個 PID 都是獨一無二的非零正整數,由系統自動分配。 理論上不會同時有兩個運行中的行程有同樣 PID,對系統而言,同樣 PID 就代表是同一個行程。

除了 PID 之外,還有 Parent Process ID(也就是 PPID),這個數值代表其父行程的 PID。 父行程指的是產生這個行程的行程,聽起來很繞口吧?總之就是這個行程是由 PPID 所代表的行程產生的。

所有的行程都可以追溯其父行程至 init 這個行程, init 是系統開啟時第一個啟動的行程。

除了 PID 和 PPID 外,行程還有諸多屬性,比較重要的是 Nice 值,

這邊要討論的是 Nice 值,也就是俗稱的好人值,好人值越低的,代表優先權越高,行程會被優先處理, 可能會越快完成;反過來說,好人值越高的行程,代表優先權越低,因為人太好了, 所以一有行程和它爭就會讓給別人,也因此資源越少,越多人爭,這個行程的任務就會越慢完成。

一般來說,我們不太會介意一個需要執行一星期的程式晚一個小時完成, 但絕對會介意原本只需要五秒就能完成的程式花上十秒才完成。

所以如果有一支程式需要執行很長的一段時間,就會把 Nice 值設得比較高。因為資源有限, 這種程式不需要一直和只需要十秒鐘內就可以完成的行程搶資源,因為一旦搶了, 這些十秒內就可以完成的行程就可能會比較慢才結束,這是我們不能容忍的。

對 FreeBSD 而言,預設的行程的 Nice 值是 0,若想以不同的 Nice 值來執行程式,可以使用 nice 這個指令來指定其執行時的優先權:

nice -n 15 /usr/local/bin/myjob

但若這支程式已經在運行中的話,則可以用 renice 來重新指定其執行時的優先權:

renice -n 15 /usr/local/bin/myjob

(其中 15 指的是 Nice 值)

FreeBSD 的 Nice 值範圍是 -20 ~ 20,不同的作業系統數值可能不一樣,但概念都是相同的, 對 FreeBSD 系統的一般使用者來說,Nice 值可以調整的範圍只能是 0 ~ 20, 也就是說一般使用者只能讓自己的程式設成低優先權,但卻不能自己調高行程的優先權, 只有 root 才能這麼做(再強調一次「root is god!」)。

另外,行程有多種狀態條列如下(說實在的,不用去記,看久了就知道):

狀態意義備註
I Idle表示沉睡了大約 20 秒左右
RRunnable
SSleeping表示沉睡不到 20 秒
TStopped
ZZombie代表死掉的行程
Din Disk

這些符號代表這些行程執行的狀態,像是正在運作,或是等待等資訊,若想要知道更多,可以使用指令 ps 來查看(或直接找 Google 大神)。 上面只是列舉一部分的狀態, 詳情可以 man ps 並搜尋 state 的部分,就可以看到更詳細的資訊。

以上。

發表迴響