安裝了帶實時補丁的linux內核後,就可以讓指定的進程或者線程擁有實時優先級。有一些系統調用可以在代碼中來精細控制線程和進程的優先級,如果不方便修改代碼,則可以通過chrt命令來達到這個目的。
關於實時優先級和實時調度算法,可以參考linux文檔:http://man7.org/linux/man-pages/man7/sched.7.html。簡而言之,linux中有五種調度策略:
非實時調度:SCHED_OTHER, SCHED_IDLE, SCHED_BATCH
實時調度:SCHED_FIFO, SCHED_RR
chrt這個命令只有在打了實時補丁的內核中可以使用,在非實時內核中運行會報類似no permission的錯。
1、查看進程的優先級和調度策略(應該顯示的是主線程的優先級和調度策略):
chrt -p [pid]
(這裏的非實時進程優先級爲0,實時進程優先級1~99,數值越大優先級越高)
2、查看進程的所有線程的優先級和調度策略:
chrt -a -p [pid]
3、查看每種調度策略對應的優先級範圍:
chrt -m
4、設置進程的調度策略(可以看到只有主線程變成了實時調度):
chrt -f -p [prio] [pid] // SCHED_FIFO
chrt -r -p [prio] [pid] // SCHED_RR
5、如果想把進程的所有線程都變成實時調度(https://stackoverflow.com/questions/13827791/raising-priority-sched-policy-of-all-thread-of-a-process-linux-chrt,該鏈接指出這樣做不會改變chrt之後生成的線程的優先級):
chrt -r -p -a [prio] [pid]
6、查看某個進程所有線程的優先級、nice值、調度策略:
ps -Lo pid,tid,pri,ni,policy [pid]
(這裏的優先級和chrt看到的優先級不一樣,這裏數值越大優先級越低)
7、直接指定優先級和調度策略來啓動一個進程(可以看到所有線程都變成了RR):
chrt --rr <priority between 1-99> <command> //SCHED_RR
其他參考:
https://askubuntu.com/questions/51283/how-to-run-a-program-with-sched-rr-policy-from-command-line