日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 單片機(jī) > 程序喵大人
[導(dǎo)讀]什么是調(diào)度?按照某種調(diào)度算法,從進(jìn)程的ready隊(duì)列中選擇進(jìn)程給CPU。

什么是調(diào)度?按照某種調(diào)度算法,從進(jìn)程的ready隊(duì)列中選擇進(jìn)程給CPU。
為什么要調(diào)度?為了最大限度的利用CPU。

調(diào)度相關(guān)結(jié)構(gòu)體

task_struct

我們先把task_struct中和調(diào)度相關(guān)的結(jié)構(gòu)拎出來:
struct task_struct {
......
/*
*調(diào)度類。用 sched_class 對(duì)調(diào)度器進(jìn)行抽象
*Stop調(diào)度器:stop_sched_class
*Deadline調(diào)度器:dl_sched_class
*RT調(diào)度器:rt_sched_class
*CFS調(diào)度器:cfs_sched_class
*IDLE-Task調(diào)度器:idle_sched_class
*/
const struct sched_class *sched_class;
//CFS調(diào)度實(shí)體
struct sched_entity  se;
//RT調(diào)度實(shí)體
struct sched_rt_entity  rt;
......
#ifdef CONFIG_CGROUP_SCHED
//任務(wù)組(在每個(gè)CPU上都會(huì)維護(hù)一個(gè)CFS調(diào)度實(shí)體、CFS運(yùn)行隊(duì)列; RT調(diào)度實(shí)體,RT運(yùn)行隊(duì)列)
struct task_group  *sched_task_group;
#endif
//DL調(diào)度實(shí)體
struct sched_dl_entity  dl;
......
/*
*進(jìn)程的調(diào)度策略,有6種。
*限期進(jìn)程調(diào)度策略:SCHED_DEADLINE。DL調(diào)度器
*實(shí)時(shí)進(jìn)程調(diào)度策略:SCHED_FIFO,SCHED_RR。RT調(diào)度器
*普通進(jìn)程調(diào)度策略:SCHED_NORMAL,SCHED_BATCH,SCHED_IDLE。CFS調(diào)度器
*/
unsigned int   policy;
......
}
  • struct sched_class 對(duì)調(diào)度器進(jìn)行抽象,一共分為5類
  1. Stop調(diào)度器:優(yōu)先級(jí)最高的調(diào)度類,可以搶占其他所有進(jìn)程,不能被其他進(jìn)程搶占;
  2. Deadline調(diào)度器:使用紅黑樹,把進(jìn)程按照絕對(duì)截止期限進(jìn)行排序,選擇最小進(jìn)程進(jìn)行調(diào)度運(yùn)行;
  3. RT調(diào)度器:為每個(gè)優(yōu)先級(jí)維護(hù)一個(gè)隊(duì)列;
  4. CFS調(diào)度器:采用完全公平調(diào)度算法,引入虛擬運(yùn)行時(shí)間概念;
  5. IDLE-Task調(diào)度器:每個(gè)CPU都會(huì)有一個(gè)idle線程,當(dāng)沒有其他進(jìn)程可以調(diào)度時(shí),調(diào)度運(yùn)行idle線程;
  • unsigned int policy 進(jìn)程的調(diào)度策略有6種,用戶可以調(diào)用調(diào)度器里的不同調(diào)度策略:
  1. SCHED_DEADLINE:使task選擇Deadline調(diào)度器來調(diào)度運(yùn)行
  2. SCHED_RR:時(shí)間片輪轉(zhuǎn),進(jìn)程用完時(shí)間片后加入優(yōu)先級(jí)對(duì)應(yīng)運(yùn)行隊(duì)列的尾部,把CPU讓給同優(yōu)先級(jí)的其他進(jìn)程;
  3. SCHED_FIFO:先進(jìn)先出調(diào)度沒有時(shí)間片,沒有更高優(yōu)先級(jí)的情況下,只能等待主動(dòng)讓出CPU;
  4. SCHED_NORMAL:使task選擇CFS調(diào)度器來調(diào)度運(yùn)行;
  5. SCHED_BATCH:批量處理,使task選擇CFS調(diào)度器來調(diào)度運(yùn)行;
  6. SCHED_IDLE:使task以最低優(yōu)先級(jí)選擇CFS調(diào)度器來調(diào)度運(yùn)行;
  • struct sched_entity se;采用CFS算法調(diào)度的普通非實(shí)時(shí)進(jìn)程的調(diào)度實(shí)體
  • struct sched_rt_entity rt;采用Roound-Robin或者FIFO算法調(diào)度的實(shí)時(shí)調(diào)度實(shí)體
  • struct sched_dl_entity dl;  采用EDF算法調(diào)度的實(shí)時(shí)調(diào)度實(shí)體

分配給CPU的task,作為調(diào)度實(shí)體加入到運(yùn)行隊(duì)列中
runqueue 運(yùn)行隊(duì)列
struct rq {
......

//三個(gè)調(diào)度隊(duì)列:CFS調(diào)度,RT調(diào)度,DL調(diào)度
struct cfs_rq cfs;
struct rt_rq rt;
struct dl_rq dl;

......
//idle指向空閑內(nèi)核線程, stop指向遷移內(nèi)核線程
struct task_struct *curr, *idle, *stop;
......
}
三個(gè)調(diào)度隊(duì)列:

  • struct cfs_rq cfs;  CFS調(diào)度隊(duì)列
  • struct rt_rq rt;  RT調(diào)度隊(duì)列
  • struct dl_rq dl;  DL調(diào)度隊(duì)列
每個(gè)CPU都有一個(gè)運(yùn)行隊(duì)列,每個(gè)運(yùn)行隊(duì)列中有三個(gè)調(diào)度隊(duì)列,task作為調(diào)度實(shí)體加入到各自的調(diào)度隊(duì)列中。

調(diào)度流程

調(diào)度的本質(zhì)就是選擇下一個(gè)進(jìn)程來運(yùn)行,調(diào)度的過程分為兩步:
  • 1. 設(shè)置調(diào)度標(biāo)記

為CPU上正在運(yùn)行的進(jìn)程thread_info結(jié)構(gòu)體里的flags成員設(shè)置TIF_NEED_RESCHED。
那么,什么時(shí)候設(shè)置TIF_NEED_RESCHED呢 ?
  1. scheduler_tick 時(shí)鐘中斷
  2. wake_up_process 喚醒進(jìn)程的時(shí)候
  3. do_fork 創(chuàng)建新進(jìn)程的時(shí)候
  4. smp_send_reschedule 負(fù)載均衡的時(shí)候
  5. set_user_nice 修改進(jìn)程nice值的時(shí)候
以上情況下都會(huì)通過 resched_curr 來設(shè)置進(jìn)程thread_info結(jié)構(gòu)體里的flags成員為TIF_NEED_RESCHED。以 scheduler_tick 和 wake_up_process 為例:
關(guān)于是否需要設(shè)置TIF_NEED_RESCHED的依據(jù)涉及到具體的調(diào)度算法,等我們講到具體調(diào)度器時(shí)再詳細(xì)講。
  • 2. 執(zhí)行調(diào)度

kernel判斷當(dāng)前進(jìn)程標(biāo)記是否為TIF_NEED_RESCHED,是的話調(diào)用 schedule 函數(shù)切換上下文,kernel空間是可以關(guān)搶占的,user空間是無法關(guān)搶占的。搶占可分為內(nèi)核態(tài)搶占和用戶態(tài)搶占
  1. 用戶態(tài)搶占
ret_to_user是系統(tǒng)調(diào)用,異常觸發(fā),中斷處理完成后都會(huì)調(diào)用的函數(shù)。
  1. 內(nèi)核態(tài)搶占

進(jìn)程切換上下文 context_switch

通過上面我們知道執(zhí)行調(diào)度的時(shí)候發(fā)生在 _schedule 函數(shù)里。
重點(diǎn)是其中的兩個(gè)函數(shù),一個(gè)是選擇需要切換任務(wù)的 pick_next_task,另外一個(gè)是完成進(jìn)程上下文切換 context_switch。
關(guān)于選擇task的策略涉及到不同的調(diào)度類,等我們講到具體調(diào)度器的時(shí)候再展開,這里重點(diǎn)講下上下文切換的函數(shù) context_switch,進(jìn)程上下文切換主要涉及到兩部分主要過程:進(jìn)程地址空間切換和處理器狀態(tài)切換:
  • 進(jìn)程的地址空間切換
將下一個(gè)進(jìn)程的pgd虛擬地址轉(zhuǎn)化為物理地址存放在ttbr0_el1中(這是用戶空間的頁表基址寄存器),當(dāng)訪問用戶空間地址的時(shí)候mmu會(huì)通過這個(gè)寄存器來做遍歷頁表獲得物理地址。完成了這一步,也就完成了進(jìn)程的地址空間切換,確切的說是進(jìn)程的虛擬地址空間切換。
  • 寄存器狀態(tài)切換
其中x19-x28是arm64 架構(gòu)規(guī)定需要調(diào)用保存的寄存器,可以看到處理器狀態(tài)切換的時(shí)候?qū)⑶耙粋€(gè)進(jìn)程(prev)的x19-x28,fp,sp,pc保存到了進(jìn)程描述符的cpu_contex中,然后將即將執(zhí)行的進(jìn)程(next)描述符的cpu_contex的x19-x28,fp,sp,pc恢復(fù)到相應(yīng)寄存器中,而且將next進(jìn)程的進(jìn)程描述符task_struct地址存放在sp_el0中,用于通過current找到當(dāng)前進(jìn)程,這樣就完成了處理器的狀態(tài)切換。
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉