Linux採用兩種不同的優先級範圍,一種是nice值,另一種是實時優先級。
1.nice值
nice值得範圍是-20~19,默認值是0。越大的nice值意味着更低的優先級,也就是說nice值爲-20的優先級最高。
2.實時優先級
實時優先級的範圍是0~99,其值得意義與nice值相反。即:越高的實時優先級數值意味着進程優先級越高。Linux的進程可分爲普通進程和實時進程,實時進程都是一些對響應時間要求比較高的進程,因此實時進程的優先級比普通進程的優先級要高。
3.優先級比較
Linux中的這兩種優先級劃分,是不是難以理解?到底哪種優先級高?如果一個進程同時含有上述兩種優先級呢?
對於上述的兩個問題,最好的回答方式就是用代碼說話。
Linux 3.6內核中,關於進程的優先級,include/linux/sched.h文件中有如下的一段描述:
1597 /*
1598 * Priority of a process goes from 0..MAX_PRIO-1, valid RT
1599 * priority is 0..MAX_RT_PRIO-1, and SCHED_NORMAL/SCHED_BATCH
1600 * tasks are in the range MAX_RT_PRIO..MAX_PRIO-1. Priority
1601 * values are inverted: lower p->prio value means higher priority.
1602 *
1603 * The MAX_USER_RT_PRIO value allows the actual maximum
1604 * RT priority to be separate from the value exported to
1605 * user-space. This allows kernel threads to set their
1606 * priority to a value higher than any user task. Note:
1607 * MAX_RT_PRIO must not be smaller than MAX_USER_RT_PRIO.
1608 */
1610 #define MAX_USER_RT_PRIO 100
1611 #define MAX_RT_PRIO MAX_USER_RT_PRIO
1612
1613 #define MAX_PRIO (MAX_RT_PRIO + 40)
1614 #define DEFAULT_PRIO (MAX_RT_PRIO + 20)
通過上述的描述和代碼,我們可以看出:
1) 實時優先級的範圍是0~99,nice值得範圍是100~139。
2)實時優先級的優先級別要高於nice值。
那麼如果幾個進程同時含有上述兩種優先級會怎麼樣呢?
優先級,而普通進程對應的則是nice值。這樣的話,理論上就不會出現一個進程同時含有兩種不同的優先級。那事實是不是這樣的呢?再重複一遍上面的一句話:Linux中的進程分爲實時進程和普通進程。其中實時進程對應的就是實時優先級,而普通進程對應的則是nice值。這樣的話,理論上就不會出現一個進程同時含有兩種不同的優先級。那事實是不是這樣的呢?
可以使用如下命令來查看進程的優先級:
ps -eo state,uid,pid,ppid,rtprio,time,comm
在我的機器上執行結果爲:
[tuzhu@CentOS linux-3.6]$ ps -eo state,uid,pid,ppid,rtprio,ni,time,comm
S UID PID PPID RTPRIO NI TIME COMMAND
S 0 1 0 - 0 00:00:03 init
S 0 2 0 - 0 00:00:00 kthreadd
S 0 3 2 99 - 00:00:00 migration/0
S 0 4 2 - 0 00:00:00 ksoftirqd/0
S 0 5 2 99 - 00:00:00 migration/0
S 0 6 2 99 - 00:00:00 watchdog/0
S 0 7 2 99 - 00:00:00 migration/1
S 0 8 2 99 - 00:00:00 migration/1
S 0 9 2 - 0 00:00:00 ksoftirqd/1
S 0 10 2 99 - 00:00:00 watchdog/1
其中RTPRIO表示的是實時優先級,NI即nice值。我們可以很清楚的看出,實時優先級和nice值是絕對不會重複存在的。