天天看點

使用者辨別和程序排程

任一程序都可以得到其實際使用者 ID 和有效 ID 及組 ID。但有時希望找到運作該程式使用者的的登入名。通常情況下可以調用 getpwuid(getuid()) 來得到,但如果一個使用者有多個登入名,這些登入名又對應着同一個使用者 ID(但登入 shell 不同)時,就可以考慮使用 getlogin 函數來擷取此登入名。

如果調用此函數的程序沒有連接配接到使用者登入時所用的終端,則函數會失敗。通常稱這些程序為守護程序(daemon)。

給出了登入名,就可用 getpwnam 在密碼檔案中查找使用者的相應記錄,進而确定其登入 shell 等。

UNIX 系統曆史上對程序提供的隻是基于排程優先級的粗粒度的控制。程序可以通過增大 nice 值選擇以更低優先級運作,而隻有特權程序允許提高排程權限。Single UNIX Specification 中 nice 值的範圍在 0~2*NZERO-1 之間,有些實作支援 0~2*NZERO(注意:定義 NZERO 的頭檔案因系統而異。Linux 3.2.0 還可以通過非标準的 sysconf 參數 _SC_NZERO 來通路 NZERO 值)。

程序可以通過 nice 函數擷取或更改它的 nice 值,但無法影響任何其他程序的 nice 值。

incr 參數被增加到調用程序的 nice 值上。如果它過大或過小,系統都會無聲無息地把它降到最大合法值或提高到最小合法值。由于 -1 是合法的成功傳回值,是以在調用 nice 函數之前需要清除 errno,在 nice 傳回 -1 時需要檢查它的值,以便确認是否是調用失敗。

getpriority 函數也可以擷取程序的 nice 值,還可以擷取一組相關程序的 nice 值;setpriority 函數則可以為程序、程序組和屬于特定使用者 ID 的所有程序設定優先級。

其中,which 參數可以取以下 3 個值之一:PRIO_PROCESS 表示程序,PRIO_PGRP 表示程序組,PRIO_USER 表示使用者 ID。如果 which 作用于多個程序,則傳回其中優先級最高的(最小的 nice 值)。who 參數選擇感興趣的一個或多個程序。如果 who 為 0,表示調用程序、程序組或者使用者(取決于 which 參數的值)。value 參數會增加到 NZERO 上,然後變為新的 nice 值。

下面這個程式度量了排程程序 nice 值的效果:兩個程序并行運作,各自增加自己的計數器。父程序使用了預設的 nice 值,子程序以調整後的 nice 值運作 10s 後,兩個程序都列印各自的計數器并終止。通過比較不同 nice 值的程序的計數值的差異就可以了解 nice 值是如何影響程序排程的。

執行程式兩次:一次用預設的 nice 值,另一次用最高有效 nice 值(最低排程優先級)。程式運作在單處理器 Linux 系統上,以顯示排程程式如何在不同 nice 值的程序間進行 CPU 的共享。否則,對于有空閑資源的系統(如多處理器系統或多核 CPU),兩個程序可能無需共享 CPU(運作在不同的處理器上),就無法看出具有不同 nice 值的兩個程序的差異。

繼續閱讀