Linux進程屬性及含義

2020-07-16 10:05:13
一個進程包含多個屬性引數,通過使用 ps 命令,我們可以檢視當前系統中有關進程的詳細資訊,例如:
[[email protected] ~]# ps -le
F S UID PID PPID C  PRI  NI ADDR SZ   WCHAN TTY     TIMECMD
4 S 0   1   0    0  80   0  -    718    -   ?     00:00:02 init
1 S 0   2   0    0  80   0  -    0      -   ?     00:00:00 kthreadd
…省略部分輸出…
可以看到,每個進程都包含 F、S、UID、PID 等屬性,這些屬性引數決定了進程被處理的先後順序、能夠存取的資源等,對於系統管理員和程式設計師都非常重要。

本節將帶領大家認識幾個常用的屬性引數。

PID(進程的 ID 號)

在前面章節已經講過,系統為每個使用者都分配了用於標識其身份的 ID 號(UID)。同樣地,進程也有這樣一個 ID 號,被稱作 PID。

要知道,用 ID 確定進程的方法是非常有好處的,因為對於計算機而言,認識數位永遠比認識一串字元方便得多,Linux 沒有必要去理解那些對人類非常“有意義”的進程名。

不僅 Linux 自己使用 PID 來確定進程,還要求使用者在管理進程時,也提供相應的 PID 號。事實上,幾乎所有的進程管理工具接受的也都是 PID 號,而不是進程名。

PPID(父進程的 PID)

在 Linux 中,所有的進程都必須由另一個進程建立(除了在系統引導時,由核心自主建立並安裝的那幾個進程)。當一個進程被建立時,建立它的那個進程被稱作父進程,而這個進程則相應地被稱作子進程。

子進程使用 PPID 指出誰是其“父親”,很容易可以理解,PPID 指的就是其父進程的 PID。

注意,在以上的敘述中,多次用到了“建立”這個詞,這是出於表述和理解上的方便,事實上,在 Linux 中進程是不能被“憑空”建立的,換句話說,Linux 沒有提供一種系統呼叫讓應用程式“建立”一個進程,應用程式只能通過克隆自己來產生新進程。

關於“子進程應該是其父進程的克隆體”這種說法,聽起來的確有點讓人困惑,讀者如果對此感興趣,可以閱讀一些和 Linux 程式設計方面相關的文章。

UID(真實使用者ID)和EUID(有效使用者ID)

只有進程的建立者和 root 使用者才有權利對該進程進行操作,因此記錄一個進程的建立者(也就是屬主)就顯得非常必要。進程的 UID 就是其建立者的使用者 ID 號,用於標識進程的屬主。

除此之外,Linux 還為進程儲存了一個“有效使用者 ID 號”,被稱作 EUID。這個特殊的 UID 號用來確定進程對某些資源和檔案的存取許可權。在絕大部分情況下,進程的 UID 和 EUID 是一樣的,除了著名的 setuid 程式。

那麼,什麼是 setuid 程式呢?前面講了 passwd 命令,這個命令允許使用者修改自己的登入口令。但讀者是否考慮過這個問題,密碼儲存在 /etc/shadow 檔案中,這個檔案對普通使用者是不可讀的,那麼使用者為什麼能夠通過修改 shadow 檔案來修改自己的口令呢?

這就是 setuid 的妙處了,通過使 passwd 在執行階段具有檔案所有者(也就是 root)的許可權,讓使用者臨時有了修改 shadow 檔案的能力(當然這種能力是受到限制的)。因此,passwd 就是一個典型的 setuid 程式,其 UID 是當前執行這個命令的使用者 ID,而 EUID 則是 root 使用者的 ID(也就是 0)。

除此之外,Linux 還給進程分配了其他幾個 UID,例如 saved UID 和 FSUID。這種多 UID 體系的設定非常耐人尋味,對它的解釋超出了本教學的範圍,有興趣的讀者可以自己查閱相關資料。

GID(真實組ID)和 EGID(有效組ID)

類似地,進程的 GID 是其建立者所屬組的 ID 號。對應於 EUID,進程同樣擁有一個 EGID 號,可以通過 setgid 程式來設定。坦率地講,進程的 GID 號確實沒有什麼用處。一個進程可以同時屬於多個組,如果要考慮許可權的話,那麼 UID 就足夠了。相比較而言,EGID 在確定存取許可權方面還發揮了一定的作用。

當然,進程的 GID 號也不是一無是處。當進程需要建立一個新檔案的時候,這個檔案將採用該進程的 GID。

進程的謙讓度和優先順序

顧名思義,進程的優先順序決定了其受到 CPU“優待”的程度,優先順序髙的進程能夠更早地被處理,並獲得更多的處理器時間。

Linux 核心會綜合考慮一個進程的各種因素來決定其優先順序,這些因素包括進程已經消耗的 CPU 時間、進程已經等待的時間等。在絕大多數情況下,決定進程何時被處理是核心的事情,不需要使用者插手。

使用者可以通過設定進程的“謙讓度”來影響核心的想法。“謙讓度”和“優先順序”剛好是一對相反的概念,高“謙讓度”意味著低“優先順序”,反之亦然。需要注意的是,進程管理工具讓使用者設定的總是“謙讓度”,而不是“優先順序”。如果希望讓一個進程更早地被處理,那麼應該把它的謙讓度設定得低一些,使其變得不那麼“謙讓”。

修改進程的謙讓度可以使用 nice 和 renice 命令,這兩個命令的具體用法,會在本章後續文章做詳細介紹。