91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解Linux之進程優先級PR和NI

發布時間:2021-10-12 09:39:52 來源:億速云 閱讀:602 作者:iii 欄目:編程語言

本篇內容主要講解“如何理解Linux之進程優先級PR和NI”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何理解Linux之進程優先級PR和NI”吧!

    JDK中線程有優先級,0-10,10表示優先級最大,而在Linux中則值最小表示優先級最高,優先級高的占用CPU的時間多。

    Linux中有PR和NI,在top命令的結果中就可以看到,如下圖1是top的結果,可以看到NI和PR的列值:

如何理解Linux之進程優先級PR和NI

                  圖1

    先來搞清楚PR(priority)和NI(nice)值的區別

nice值

    這是一個反應進程優先級狀態的值,范圍在-20到19,即總共有40個值,值最小,優先級最高,默認值是0

nice值雖然不是priority值,但是它可以影響進程優先級

    nice值越低的進程搶占CPU的能力越強,而nice值越高的進程搶占CPU的能力越弱

    在原來O1調度的Linux上,nice值也叫靜態優先級,一旦設置了,除非手動renice修改值,否則不會改變;在priority值在O1調度的Linux上,值是會變的,所以也叫動態優先級。

    在linux上,renice  10  pid,這樣就可以將pid的那個進程的優先級設置為10,renice設置值的時候只能設置為值更大的值,比如之前的值是5,之后的值設置為10是可以的,但是設置為-10是不可以的,會報沒有權限的錯誤,除非使用root用戶。 

實時操作系統

    實時操作系統需要保證相關的實時進程在較短的時間內響應,不會有較長的延時,并且要求最小的中斷延時和進程切換延時。對于這樣的需求,一般的進程調度算法,無論是O1還是CFS都是無法滿足的,所以內核在設計的時候,將實時進程單獨映射了100個優先級,這些優先級都要高于正常進程的優先級(nice值),而實時進程的調度算法也不同,它們采用更簡單的調度算法來減少調度開銷。

    由于實時進程,無論是O1還是CFS調度,都滿足不了,所以給它們分配0-100的值優先級,使用簡單的調度算法,來減少開銷。

    實時進程和非實時進程的區分是通過優先級來區分的,0-99的都是實時進程,而100-139的都是非實時進程,NICE的-20~19對應著100~139,如果PR列中看到的是'rt',那么說明這個任務/進程是realtime進程,即實時進程,有時候會看到PR的值不是數值,而是rt的。

    如下List-1中所示,policy options部分,系統給進程5種調度策略,這5中調度策略是給倆中進程使用的,實時進程:SCHED_FIFO、SCHED_RR,而對于非實時進程則是:SCHED_OTHER、SCHED_OTHER、SCHED_IDLE。

    List-1

mjduan@dmj:/mnt/sdb1/doc/minedoc$ chrt --help
Show or change the real-time scheduling attributes of a process.

Set policy:
 chrt [options] <priority> <command> [<arg>...]
 chrt [options] --pid <priority> <pid>

Get policy:
 chrt [options] -p <pid>

Policy options:
 -b, --batch          set policy to SCHED_BATCH
 -d, --deadline       set policy to SCHED_DEADLINE
 -f, --fifo           set policy to SCHED_FIFO
 -i, --idle           set policy to SCHED_IDLE
 -o, --other          set policy to SCHED_OTHER
 -r, --rr             set policy to SCHED_RR (default)

Scheduling options:
 -R, --reset-on-fork       set SCHED_RESET_ON_FORK for FIFO or RR
 -T, --sched-runtime <ns>  runtime parameter for DEADLINE
 -P, --sched-period <ns>   period parameter for DEADLINE
 -D, --sched-deadline <ns> deadline parameter for DEADLINE

Other options:
 -a, --all-tasks      operate on all the tasks (threads) for a given pid
 -m, --max            show min and max valid priorities
 -p, --pid            operate on existing given pid
 -v, --verbose        display status information

 -h, --help           display this help
 -V, --version        display version

For more details see chrt(1).

    系統的整體調度策略:

  1.     如果系統中存在要執行的實時進程,那么執行實時進程

  2.     直到實時進程退出或者主動讓出CPU時,才會調度執行非實時進程

sched_fifo: 是實時進程的調度策略之一,使用FIFO的策略,在優先級一樣的情況下,誰先進入隊列那么那個先被調度

sched_rr: 是實時進程調度策略之一,使用時間分片的策略,默認是100ms,這種策略簡單,適合實時進程延時小的特點

    Linux上更麻煩的是非實時調度策略,linux上很多進程都是非實時進程,它們的主要調度算法是O1和CFS調度策略

O1調度策略

    是2.6內核版本引入的,到2.6.63就被替換為CFS了

    命名為O1是因為它算法的時間復雜度是O1,使用時間分片思路來,將cpu的時間分為一小段一小段,每個進程占用一段時間分片,對于多核的來說,對每個cpu進行這樣時間分片即可。優先級是怎么處理的呢:優先級高的時間分片占用多,反之占用少

CFS完全公平調度

    O1對多核、多CPU支持的不好,性能不好,此外linux內核還要加上cgroup的功能,所以被替換為了CFS,Linux在2.6.23之后開始啟用CFS作為對一般優先級(SCHED_OTHER)進程調度方法

    CFS調度策略會收集虛擬時間,然后構建紅黑樹red-block tree,虛擬時間就是紅黑樹的key,所以虛擬時間越短的會在紅黑樹的最左邊,查詢的時間復雜度是Log(N)。

    大致是這樣的,會根據當前進程的優先級和執行時間,來生成一個虛擬時間,對每個進程都是如此,最后構建紅黑樹,紅黑樹中左邊的進程表示虛擬時間值小,表示大部分時候在占用cpu,而右邊的進程表示虛擬時間大,當一個虛擬時間小的進程在占用cpu時,如果此時一個虛擬時間大的進程變得可運行,那么這個虛擬時間大的就會搶占cpu,即系統總是調度虛擬時間比較小的進程

 如何理解Linux之進程優先級PR和NI

                                                              圖2

    多核cpu情況下,CFS是怎么優化性能的,每個cpu會維護一個調度隊列,避免使用全局隊列而出現爭搶的鎖問題,但是每個cpu一個隊列之后,就有可能出現負載不均衡,所以系統需要定期對各個cpu隊列進行平衡

    如下List-2中,使用chrt命令查看進程的優先級是0,調度算法是CFS

    List-2

mjduan@dmj:/mnt/sdb1/doc/minedoc$ jps
26960 Main
12642 Jps
27090 Main
890 RemoteJdbcServer
31980 Launcher
mjduan@dmj:/mnt/sdb1/doc/minedoc$ chrt -p 27090
pid 27090's current scheduling policy: SCHED_OTHER
pid 27090's current scheduling priority: 0
mjduan@dmj:/mnt/sdb1/doc/minedoc$ chrt -p 890
pid 890's current scheduling policy: SCHED_OTHER
pid 890's current scheduling priority: 0
補充

    如果需要調度的進程個數為n,那么平均每個進程占用的CPU時間為sched_latency_ns/n。顯然,每個進程實際占用的CPU時間會因為n的增大而減小。但是實現上不可能讓它無限的變小,所以sched_min_granularity_ns的值也限定了每個進程可以獲得的執行時間周期的最小值

    List-3

mjduan@dmj:/mnt/sdb1/doc/minedoc$ cat /proc/sys/kernel/sched_latency_ns 
3000000
mjduan@dmj:/mnt/sdb1/doc/minedoc$ cat /proc/sys/kernel/sched_min_granularity_ns 
300000
注意:

    對于普通進程而言,PR=nice+20,所以默認情況下,創建的進程nice值是0,而PR值是20,比如默認的情況下java應用的PR就是20.

    對于rt進程,即實時進程,PR=-1-用戶視角,所以有時候看到PR值是-51的進程,那么它實際對應的優先級是50,有時候看到PR的值是rt而不是數值,這種對應的優先級是99

到此,相信大家對“如何理解Linux之進程優先級PR和NI”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新龙县| 泽库县| 富宁县| 沧州市| 万安县| 望奎县| 汉川市| 南阳市| 四会市| 贵定县| 枣阳市| 黎川县| 宽城| 礼泉县| 雅安市| 泗洪县| 泾川县| 望江县| 旬邑县| 莎车县| 郑州市| 凯里市| 锡林郭勒盟| 白城市| 安吉县| 宜黄县| 南城县| 龙川县| 西充县| 莱西市| 泰兴市| 扬中市| 固安县| 丰原市| 姚安县| 城口县| 偃师市| 卫辉市| 察哈| 张家界市| 修武县|