主頁 > 軟體設計 > 淺析Linux行程和執行緒的調度與優先級

淺析Linux行程和執行緒的調度與優先級

2020-12-25 13:15:38 軟體設計

總述

為便于快速了解和復習,本節先給出結論性的大致概述,后面再詳細介紹相關內容,關于行程優先級和調度策略的大致資訊如下,

概念

行程優先級值越小,優先級越大,
行程優先級是PRI值不是Nice值,但是Nice值會影響優先級,
三類調度策略:RR調度和FIFO調度的行程屬于實時行程,以分時調度(OTHER)的行程是非實時行程
實時行程優先級高于普通行程,實時行程使用靜態優先級調度、非實時行程使用動態優先級調度,非實時行程動態優先級通過nice調整、可能受bonus影響,

方法

命令列/shell腳本中,可以通過 ps, top, chrt 來查看和修改調度和優先級屬性,

代碼中,通過系統呼叫 sched_setscheduler() 設定行程調度和優先級屬性(需要包含 sched.h),

代碼中,通過庫函式 pthread_attr_setschedpolicy() 設定執行緒調度和優先級屬性(需要包含 pthread.h),

原理

一般子行程會繼承父行程的調度策略,在Linux 2.6.32之后,可以使用 SCHED_RESET_ON_FORK 按位與引數的方式呼叫 sched_setscheduler(), 使用之后效果是:如果呼叫行程使用 SCHED_FIFO 或 SCHED_RR 調度策略,使用 SCHED_RESET_ON_FORK 后fork創建的子行程創建時將會自動重置為 SCHED_OTHER 調度策略;如果呼叫行程使用負值nice,那么使用 SCHED_RESET_ON_FORK 后fork創建的子行程創建時將會自動將其nice重置為0, 這個標記激活時只有當行程具有 CAP_SYS_NICE 標記時才能被重置,而這個 CAP_SYS_NICE 標記在使用fork()創建子行程后,在子行程中被禁止,

【文章福利】需要C/C++ Linux服務器架構師學習資料加群812855908(資料包括C/C++,Linux,golang技術,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒體,CDN,P2P,K8S,Docker,TCP/IP,協程,DPDK,ffmpeg等)
在這里插入圖片描述

行程優先級概念

行程優先級值越小,優先級越大,
linux下的行程調度優先級是從 -20 到 19 ,一共 40 個級別,數字越大,表示行程的優先級越低,默認時候,行程的優先級是0,

如果不是 root 權限,則侄只能降調度優先級而不能提高,即使是自己用戶的行程,自己把它調高了后,優先級也不能再被調會原來的值了,除非使用 root 用戶來調回去,

系統重啟后,對行程優先級的調整全部失效,所有行程的調度回到默認的初始級別,

行程優先級是 PRI 值不是 Nice 值,但是 Nice 值會影響優先級
PRI 也還是比較好理解的,即行程的優先級,或者通俗點說就是程式被 CPU 執行的先后順序,此值越小行程的優先級別越高,那 NI 呢?就是我們所要說的 nice 值了,其表示行程可被執行的優先級的修正數值,如前面所說, PRI 值越小越快被執行,那么加入 nice 值后,將會使得 PRI 變為: PRI(new)=PRI(old)+nice ,

到目前為止,更需要強調一點的是,行程的 nice 值不是行程的優先級,他們不是一個概念,但是行程 nice 值會影響到行程的優先級變化,

通過調整 nice 值,更改行程優先級, nice 調整范圍是 -20~19 ,

行程優先級與變動影響因素與原理

調度策略: RR 調度和 FIFO 調度的行程屬于實時行程,以分時調度( OTHER )的行程是非實時行程,
FIFO (先進先出)和 RR (時間片輪轉)用于實時行程, OTHER (分時調度)用于非實時行程;實時行程會搶占普通行程; FIFO 會導致同優先級實時行程始終占用 CPU , RR 會保證同優先級實時行程按時間片輪流執行,

參考:SCHED_OTHER,SCHED_FIFO,SCHED_RR

實時行程優先級高于普通行程,實時行程使用靜態優先級調度、非實時行程使用動態優先級調度,非實時行程動態優先級通過 nice 調整、可能受 bonus 影響,
Linux行程有兩種優先級:普通行程優先級(使用 SCHED_NORMAL 調度策略),以及實時行程優先級(使用 SCHED_FIFO 或 SCHED_RR 調度策略)

不同調度策略的實時行程只有在相同優先級時才有可比性,任何時候,實時行程的優先級都高于普通行程

Linux對實時行程使用靜態優先級調度,對普通的行程(非實時行程),根據動態優先級進行調度,

實時行程,只有靜態優先級(在 0~MAX_RT_PRIO-1 間,默認 MAX_RT_PRIO 為 100 ), 內核不會再根據休眠等因素對其靜態優先級做調整;

實時行程 0-99 號優先級每一個優先級對應一個優先級佇列(鏈表),先執行數值高的對應的鏈表(0號最低),可由后面所述的 chrt 以及 相應函式修改該優先級;

非實時行程靜態優先級可通過 nice 值( -20~19 )調整: static_prio=MAX_RT_PRIO + nice + 20 ,

nice 只影響非實時行程(靜態優先級在 100~139 之間), nice 越大靜態優先級值越大,優先級越低,

非實時行程動態優先級根據靜態優先級和 bonus 計算: dynamic_prio = max (100, min (static_prio - bonus + 5, 139))

bonus 反映行程平均睡眠時間(范圍 0~10 ),睡眠時間越多越可能是互動行程,每次輪到它運行時它就越可能不會使用完時間片再釋放 cpu ,

查看與設定優先級與行程執行緒資訊等的方法

通過 ps 查看行程資訊
ps -el 可查看行程優先級和nice值,命令執行結果:NI列顯示的每個行程的nice值(主要針對非實時行程),PRI是行程的優先級(如果是實時行程就是靜態優先級,如果是非實時行程,就是動態優先級),

通過 top 查看行程資訊
其中的優先級和ps的pri不一樣,ps中一般為0的行程,在top中為20,這個優先級應該對應于前面所說的實時行程優先級,實時行程只使用1-99號優先級佇列,序號越大優先級越高,0號留給普通行程使用,

chrt -p 查看行程屬性
通過 chrt 查看和修改行程調度和優先級屬性,它一般也是呼叫后面的 sched_setscheduler() 實作的,

注意: char -o pri command 設定為SCHED_OTHER調度方式優先級別值只能是0表示比任何實時優先級都低,非實時行程不使用該值決定調度行為,普通行程使用自己的調度策略,

參考: man chrt

通過 sched_setscheduler() 設定行程調度和優先級屬性
效果類似 chrt,

關于priority的注意:這里引數中的pri不是ps的nice也不是priority,而是代碼中的sched_priority,用于表示一系列可執行行程串列,實時行程中該值范圍為1-99越大表示優先級越高, 非實時只能是0表示始終比實時行程低,并且非實時行程的優先級不由此值確定而是由其內部動態優先級確定,chrt中的pri應該也類似含義,例如: chrt -f -p 10 pid 則ps中pri為-11, chrt -f -p 1 pid 則ps中pri為-2)為0,行程命令為command,其它可以根據選項引數設定,

關于prioriti的注意:一般子行程會繼承父行程的調度策略,在Linux 2.6.32之后,可以使用 SCHED_RESET_ON_FORK 按位與引數的方式呼叫 sched_setscheduler(), 使用之后效果是:如果呼叫行程使用 SCHED_FIFO 或 SCHED_RR 調度策略,使用 SCHED_RESET_ON_FORK 后fork創建的子行程創建時將會自動重置為 SCHED_OTHER 調度策略;如果呼叫行程使用負值nice,那么使用 SCHED_RESET_ON_FORK 后fork創建的子行程創建時將會自動將其nice重置為0, 這個標記激活時只有當行程具有 CAP_SYS_NICE 標記時才能被重置,而這個 CAP_SYS_NICE 標記在使用fork()創建子行程后,在子行程中被禁止,

參考: man sched_setscheduler

通過 pthread_attr_setschedpolicy() 設定執行緒調度和優先級屬性
效果類似 sched_setscheduler(), 但是用于執行緒而非行程,

參考: man pthread_attr_setschedpolicy

關注公眾號,分享更多你感興趣的互聯網技術內容!
在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/240149.html

標籤:其他

上一篇:互聯網面試六大常見問題及應對技巧,2021不再入坑!

下一篇:ssm搭建拍賣系統

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more