[英]How to increase thread priority in pthreads?
我在Linux中使用pthread。 我想通過設置參數sched_param.priority
來增加線程優先級。 但是,我無法從網上找到關於我可以設置的線程優先級范圍或線程優先級描述的信息。
另外,我想了解相對線程優先級,因為我不希望將線程優先級設置得太高並導致操作系統停止。 有人可以幫我嗎?
默認的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%(在我的情況下)。
編輯:引入nice
, SCHED_BATCH
, SCHED_IDLE
和chrt
工具。 為了准確! :)
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功能(通常是root,但不一定,請參閱http://man7.org/linux/man-pages/man7/capabilities.7.html和http://man7.org/linux/man-pages/man3 /cap_set_proc.3.html )。
事實上,SCHED_BATCH的設計與提問者要求的情況相反 :它專為CPU密集型,長時間運行的作業而設計,可以以較低的優先級生活。 它告訴調度程序略微懲罰線程的喚醒優先級。
也回答之前的評論之一(我還沒有足夠的聲譽來回應評論 - 這個答案的一些贊成將有助於:))。 是壞消息是POSIX.1規范說'nice'會影響進程,而不會影響單個線程。 好消息是Linux線程實現(NPTL和原始Linux線程)打破了規范並允許它影響單個線程。 我覺得很有趣的是,這通常在手冊頁的“BUGS”部分中提到。 我說這個bug是在POSIX.1規范中的,它應該允許這種行為,而不是在那些被迫提供它的實現中,盡管有規范並且故意和故意這樣做。 換句話說 - 不是錯誤。
其中大部分內容詳見sched(7)手冊頁(出於某種原因未在我的Fedora 20系統上提供): http : //man7.org/linux/man-pages/man7/sched.7.html
如果您真的想影響sched_priority,可以查看實時策略,例如SCHED_RR)。
POSIX定義了一個查詢,因此您可以向操作系統詢問有效的優先級范圍。
int sched_get_priority_max(int policy);
int sched_get_priority_min(int policy);
不要指望提高優先級來阻塞機器。 事實上,除非你已經使用了100%的CPU周期,否則不要指望它做任何事情。 如果查詢告訴您沒有優先級高於默認值,請不要感到驚訝。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.