高階程序管理之程序優先順序

2021-05-22 11:46:27 字數 2215 閱讀 3461

linux不會隨意對程序進行排程。事實上,應用程式會被指派優先順序,優先順序會對程序何時執行以及執行多久造成影響。以往,unix將優先順序成為友善值(nice value),因為友善值背後的概念是通過調低乙個程序的優先順序來「善待」系統上的其他程序,這讓其他程序可以使用較多的處理器空間。

友善值可控制乙個程序何時執行。linux會按照優先順序(從最高到最低)的順序來對執行程序進行排程:優先順序較高的程序會比優先順序較低的程序先執行。友善值還可控制乙個程序的時間片大小。

友善值的有效範圍從-20到19,而且預設值是0。你可能會有點困惑,乙個程序的友善值越低,則它的優先順序就越高,而且它的時間片也越大;反過來說,友善值越高,程序的優先順序越低,而且它的時間片越小。因此掉高乙個程序的友善值就等於善待系統上的其他程序。但是以數字來看的確令人混淆。當我們說乙個程序具有「高優先順序」時,我們的意思是說,相較於優先順序較低的程序,排程程式會更快安排它執行,而且會讓它執行更長時間。

linux提供了若干可用於取得以及設定的程序友善值的系統呼叫。nice()是其中最簡單的乙個:

#include

int nice (int nic);

執行成功,nice()會使用inc來掉高乙個程序的友善值,而且會返回剛才所更新的值.只有具備cap_sys_nice能力的程序(實際上就是root所擁有的程序)可以對inc提供乙個負值來調低它的友善值,因而會掉高它的優先順序.因此,擁有者非root的程序只能調低它們的優先順序.

發生錯誤時,nice()會返回-1。然後,因為nice會返回新的友善值,所以-1也是執行成功時的返回值.為了有所區別,呼叫nice之前,你可以先將errno清為0並在事後檢查它的值.例如

發生錯誤時,linux只會返回單一錯誤**eperm,這表示進行呼叫的程序掉高了它的優先順序,但是它並不具備cap_sys_nice能力.當讓如inc的友善值超越有效值的範圍時,有的系統還會返回einval,但是linux不會.事實上,有需要時,linux會將無效的inc自動調整至此限度所允許的範圍之內.

往往乙個程序會想要設定乙個攫奪的友善值,而不是設定乙個相對增加的友善值.

乙個更好的解決方案就是使用getpriority()和setpriority()系統呼叫,它們提供了較多的控制能力,但是它們的操作也更為複雜:

#include

#include

int getpriority(int which, int who);

int setpriority(int which, int who);

這兩個系統呼叫可用於操作程序、程序組或使用者,可以通過which或who來指定。which的值必須是prio_processs、prio_prgp、prio_user其中之一,在此情況下,who可分別用於指定程序id、程序組id、或使用者id。

getpriority()會返回指定的任何程序中優先順序最高者。而setprotity()會將所指定的任何程序的優先順序設定為prio。如同nice(),只有具備cap_sys_nice能力的程序可以調高程序的優先順序。此外,只有具備此能力的程序可以調高或調低非進行呼叫的使用者所擁有的程序的優先順序。

如同nice(),發生錯誤是,getprioriy()會返回-1。因為執行成功時也會返回此值,如果程式設計者想要處理錯誤情況,則進行呼叫之前,它們應該先清除errno的值。setpriority()並沒有這個問題,執行成功時,setpriority()總是會返回0,發生錯誤時,則會返回-1。

下面的程式**會返回當前程序的優先順序:

下面的程式**會將當前程序組中的所有程序的優先順序設定成10:

發生錯誤時,這兩個函式會將errno設定成下面的其中乙個值eaccess、einval、eprrm、esrch

除了排程優先順序,linux還允許程序指定i/o優先順序,此值會影響程序i/o請求的相對優先順序。核心的排程程式在服務來自i/o優先順序較低的請求之前,會先服務來自i/o優先順序較高程序的請求。

預設情況下,i/o排程程式會使用程序的友善值來確定i/o優先順序,因此,設定友善值會自動變更i/o優先順序。然而linux核心額外提供了兩個系統呼叫,可用於顯示設定和取得與友善值無關的i/o優先順序:

int ioprio_get(int which, int who);

int ioprio_set(int which, int who, int ioprio);

並未所有的i/o排程程式都支援i/o優先順序。特別的是,完全公平佇列(complete fair queuing,cfq) i/o排程程式就支援i/o優先順序;就目前而言,其他的標準排程程式並不支援i/o優先順序。如果當前i/o排程程式不支援i/o優先順序,它們會默默予以忽略。

程序優先順序

程序的優先順序可以通過setpriority nice修改優先順序。程序分為普通程序和實時程序。實時程序的優先順序比普通程序的優先順序高。nice的值 20 19值越小優先順序越高。預設為0 不同程序的執行緒優先順序?執行緒會繼承程序的優先順序,核心的排程是執行緒。所以先看程序是普通程序還是實時程序...

程序優先順序

用top或者ps命令會輸出pri pr ni ni nice這三種指標值,這些到底是什麼東西?先給出大概的解釋如下 pri 程序優先權,代表這個程序可被執行的優先順序,其值越小,優先順序就越高,越早被執行 ni 程序nice值,代表這個程序的優先值 nice 改變過優先順序的程序的占用cpu的百分比...

程序優先順序

1動態優先順序 因為高優先順序的程序總比低優先順序的程序先被排程,為防止有多個高優先順序且一直占用cpu資源,導致其它程序不能占用cpu,所以引用動態優先順序概念.2互動式的程序 如果某個程序被認為是互動式的,那麼將被賦予較高的優先權,例如 鍵盤輸入.互動式的程序從來不被搶占,並且占用cpu很少,它...