2010-09-06 97 views
43

我在Linux中使用pthread。我想通過設置參數sched_param.priority來提高線程優先級。但是,我無法從網絡中找到有關我可以設置的線程優先級範圍或有關線程優先級描述的更多信息。如何增加pthread中的線程優先級?

此外,我想知道相對線程優先級,因爲我不想將線程優先級設置得太高,導致操作系統停止。有人可以幫助我嗎?

回答

48

默認的Linux調度策略是SCHED_OTHER,它們沒有優先選擇,而是在策略內部調整nice級別。

你不得不改變使用功能pthread_setschedparam另一調度策略(見man sched_setscheduler

'正常' 的調度策略:(從sched_setscheduler(2)

SCHED_OTHER the standard round-robin time-sharing policy; 
    SCHED_BATCH for "batch" style execution of processes; and 
    SCHED_IDLE for running very low priority background jobs. 

實時調度策略:

SCHED_FIFO a first-in, first-out policy; and 
    SCHED_RR  a round-robin policy. 

在你的情況下,也許你可以使用SCHED_BATCH,因爲這不需要root權限。

警告:實時調度策略的錯誤使用可能會掛起您的系統。這就是爲什麼你需要root權限來執行這種操作。

只是爲了確保您的機器能夠做什麼,您可以使用 util-linux包裝中的chrt工具。
作爲一個例子:

$ chrt -m 
SCHED_OTHER min/max priority : 0/0 
SCHED_FIFO min/max priority  : 1/99 
SCHED_RR min/max priority  : 1/99 
SCHED_BATCH min/max priority : 0/0 
SCHED_IDLE min/max priority  : 0/0 

一個辦法浪費更短的時間(這是我經常使用):

alias batchmake='time chrt --batch 0 make --silent' 

雖然具有用戶權限住,這推動了make 15%(在我案件)。

編輯:引入niceSCHED_BATCHSCHED_IDLEchrt工具。爲了準確! :)

+0

re:'SCHED_OTHER',這個不完全正確,因爲好的等級仍然有效。 – Hasturkun 2010-09-07 22:55:30

+0

@Hasturkun:你說的沒錯,就是對調度程序的建議(不是調度程序的優先級!)。感謝準確! – levif 2010-09-08 08:40:29

+0

您實際上並不需要root權限,只需要設置rlimits,以便允許您設置的最大值> 0 – Spudd86 2010-11-22 20:05:32

23

POSIX定義了一個查詢,因此您可以詢問OS的有效範圍的優先級。

int sched_get_priority_max(int policy);

int sched_get_priority_min(int policy);

不要指望提出優先嗆機器。事實上,除非您已經使用100%的CPU週期,否則不要指望它做任何事情。如果查詢告訴您沒有高於默認值的優先級,請不要感到驚訝。

+2

+1好小費...... – 2011-10-19 13:36:53

22

從levif目前的答案(推薦SCHED_BATCH)是不正確的Linux上的電流NPTL線程執行(你可以檢查你的內核運行「getconf GNU_LIBPTHREAD_VERSION」的實現)。

在今天的內核中,只有實時調度策略允許設置sched_priority - 非RT策略(SCHED_OTHER,SCHED_BATCH和SCHED_IDLE)始終爲0。您的非RT政策的唯一選擇是設置'nice'值,例如通過setpriority()。然而,通過設置'nice'並沒有很好的確切的行爲規範,至少在理論上它可以從內核版本到內核版本有所不同。對於當前的Linux內核來說,'nice'具有與優先級類似的非常強大的效果,因此您可以非常多地互換使用它。爲了增加您的線程安排的頻率,您希望降低您的'不錯'價值。這需要CAP_SYS_NICE能力(通常爲根,儘管不一定,請參閱http://man7.org/linux/man-pages/man7/capabilities.7.htmlhttp://man7.org/linux/man-pages/man3/cap_set_proc.3.html)。

事實上SCHED_BATCH是專爲相反情況下,以什麼樣的提問要求:它是專爲CPU密集型的,長期運行的作業,可以用較低的優先生活。它告訴調度器略微懲罰線程的喚醒優先級。

同樣回答之前的評論之一(我還沒有足夠的聲望來回應評論 - 對這個答案的一些upvotes會幫助:))。是的壞消息是,POSIX.1規範說'好'會影響進程,而不是單個線程。好消息是,Linux線程實現(NPTL和原始Linux線程)破壞了規範並允許它影響單個線程。我覺得這很有趣,通常在手冊頁的「BUGS」部分中提到。我會說這個bug是在POSIX.1規範中,它應該允許這種行爲,而不是在規範中被迫提供它的實現中,並且是在故意和故意的情況下進行的。換句話說 - 不是一個錯誤。

這其中大部分是章附表(7)手冊頁(由於某種原因,是不是我的Fedora 20系統上發佈)上詳細: http://man7.org/linux/man-pages/man7/sched.7.html

如果你真的想影響sched_priority你可以看看實時策略,如SCHED_RR)。

+0

什麼是「當前的NPTL線程實現」?我需要一些東西來比較遺留目標上'getconf'的輸出。 – jhfrontz 2015-11-20 17:41:40

+3

NTPL(原生POSIX線程庫)是當前Linux線程實現的調用對象。它不同於使用多個進程來模擬多線程行爲的原始線程實現。 NTPL是在Linux 2.6中引入的。更多細節和歷史記錄在這裏:https://en.m.wikipedia。組織/維基/ Native_POSIX_Thread_Library – BobDoolittle 2015-11-21 19:31:45