一個(gè)進(jìn)程包含多個(gè)屬性參數(shù),通過使用 ps 命令,我們可以查看當(dāng)前系統(tǒng)中有關(guān)進(jìn)程的詳細(xì)信息,例如:
…省略部分輸出…
可以看到,每個(gè)進(jìn)程都包含 F、S、UID、PID 等屬性,這些屬性參數(shù)決定了進(jìn)程被處理的先后順序、能夠訪問的資源等,對(duì)于系統(tǒng)管理員和程序員都非常重要。
本節(jié)將帶領(lǐng)大家認(rèn)識(shí)幾個(gè)常用的屬性參數(shù)。
PID(進(jìn)程的 ID 號(hào))
在前面章節(jié)已經(jīng)講過,系統(tǒng)為每個(gè)用戶都分配了用于標(biāo)識(shí)其身份的 ID 號(hào)(UID)。同樣地,進(jìn)程也有這樣一個(gè) ID 號(hào),被稱作 PID。
要知道,用 ID 確定進(jìn)程的方法是非常有好處的,因?yàn)閷?duì)于計(jì)算機(jī)而言,認(rèn)識(shí)數(shù)字永遠(yuǎn)比認(rèn)識(shí)一串字符方便得多,Linux 沒有必要去理解那些對(duì)人類非常“有意義”的進(jìn)程名。
不僅 Linux 自己使用 PID 來確定進(jìn)程,還要求用戶在管理進(jìn)程時(shí),也提供相應(yīng)的 PID 號(hào)。事實(shí)上,幾乎所有的進(jìn)程管理工具接受的也都是 PID 號(hào),而不是進(jìn)程名。
PPID(父進(jìn)程的 PID)
在 Linux 中,所有的進(jìn)程都必須由另一個(gè)進(jìn)程創(chuàng)建(除了在系統(tǒng)引導(dǎo)時(shí),由內(nèi)核自主創(chuàng)建并安裝的那幾個(gè)進(jìn)程)。當(dāng)一個(gè)進(jìn)程被創(chuàng)建時(shí),創(chuàng)建它的那個(gè)進(jìn)程被稱作父進(jìn)程,而這個(gè)進(jìn)程則相應(yīng)地被稱作子進(jìn)程。
子進(jìn)程使用 PPID 指出誰是其“父親”,很容易可以理解,PPID 指的就是其父進(jìn)程的 PID。
注意,在以上的敘述中,多次用到了“創(chuàng)建”這個(gè)詞,這是出于表述和理解上的方便,事實(shí)上,在 Linux 中進(jìn)程是不能被“憑空”創(chuàng)建的,換句話說,Linux 沒有提供一種系統(tǒng)調(diào)用讓應(yīng)用程序“創(chuàng)建”一個(gè)進(jìn)程,應(yīng)用程序只能通過克隆自己來產(chǎn)生新進(jìn)程。
關(guān)于“子進(jìn)程應(yīng)該是其父進(jìn)程的克隆體”這種說法,聽起來的確有點(diǎn)讓人困惑,讀者如果對(duì)此感興趣,可以閱讀一些和 Linux 編程方面相關(guān)的文章。
UID(真實(shí)用戶ID)和EUID(有效用戶ID)
只有進(jìn)程的創(chuàng)建者和 root 用戶才有權(quán)利對(duì)該進(jìn)程進(jìn)行操作,因此記錄一個(gè)進(jìn)程的創(chuàng)建者(也就是屬主)就顯得非常必要。進(jìn)程的 UID 就是其創(chuàng)建者的用戶 ID 號(hào),用于標(biāo)識(shí)進(jìn)程的屬主。
除此之外,Linux 還為進(jìn)程保存了一個(gè)“有效用戶 ID 號(hào)”,被稱作 EUID。這個(gè)特殊的 UID 號(hào)用來確定進(jìn)程對(duì)某些資源和文件的訪問權(quán)限。在絕大部分情況下,進(jìn)程的 UID 和 EUID 是一樣的,除了著名的 setuid 程序。
那么,什么是 setuid 程序呢?前面講了 passwd 命令,這個(gè)命令允許用戶修改自己的登錄口令。但讀者是否考慮過這個(gè)問題,密碼保存在 /etc/shadow 文件中,這個(gè)文件對(duì)普通用戶是不可讀的,那么用戶為什么能夠通過修改 shadow 文件來修改自己的口令呢?
這就是 setuid 的妙處了,通過使 passwd 在執(zhí)行階段具有文件所有者(也就是 root)的權(quán)限,讓用戶臨時(shí)有了修改 shadow 文件的能力(當(dāng)然這種能力是受到限制的)。因此,passwd 就是一個(gè)典型的 setuid 程序,其 UID 是當(dāng)前執(zhí)行這個(gè)命令的用戶 ID,而 EUID 則是 root 用戶的 ID(也就是 0)。
除此之外,Linux 還給進(jìn)程分配了其他幾個(gè) UID,例如 saved UID 和 FSUID。這種多 UID 體系的設(shè)置非常耐人尋味,對(duì)它的解釋超出了本教程的范圍,有興趣的讀者可以自己查閱相關(guān)資料。
GID(真實(shí)組ID)和 EGID(有效組ID)
類似地,進(jìn)程的 GID 是其創(chuàng)建者所屬組的 ID 號(hào)。對(duì)應(yīng)于 EUID,進(jìn)程同樣擁有一個(gè) EGID 號(hào),可以通過 setgid 程序來設(shè)置。坦率地講,進(jìn)程的 GID 號(hào)確實(shí)沒有什么用處。一個(gè)進(jìn)程可以同時(shí)屬于多個(gè)組,如果要考慮權(quán)限的話,那么 UID 就足夠了。相比較而言,EGID 在確定訪問權(quán)限方面還發(fā)揮了一定的作用。
當(dāng)然,進(jìn)程的 GID 號(hào)也不是一無是處。當(dāng)進(jìn)程需要?jiǎng)?chuàng)建一個(gè)新文件的時(shí)候,這個(gè)文件將采用該進(jìn)程的 GID。
進(jìn)程的謙讓度和優(yōu)先級(jí)
顧名思義,進(jìn)程的優(yōu)先級(jí)決定了其受到 CPU“優(yōu)待”的程度,優(yōu)先級(jí)髙的進(jìn)程能夠更早地被處理,并獲得更多的處理器時(shí)間。
Linux 內(nèi)核會(huì)綜合考慮一個(gè)進(jìn)程的各種因素來決定其優(yōu)先級(jí),這些因素包括進(jìn)程已經(jīng)消耗的 CPU 時(shí)間、進(jìn)程已經(jīng)等待的時(shí)間等。在絕大多數(shù)情況下,決定進(jìn)程何時(shí)被處理是內(nèi)核的事情,不需要用戶插手。
用戶可以通過設(shè)置進(jìn)程的“謙讓度”來影響內(nèi)核的想法。“謙讓度”和“優(yōu)先級(jí)”剛好是一對(duì)相反的概念,高“謙讓度”意味著低“優(yōu)先級(jí)”,反之亦然。需要注意的是,進(jìn)程管理工具讓用戶設(shè)置的總是“謙讓度”,而不是“優(yōu)先級(jí)”。如果希望讓一個(gè)進(jìn)程更早地被處理,那么應(yīng)該把它的謙讓度設(shè)置得低一些,使其變得不那么“謙讓”。
評(píng)論
查看更多