国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

極簡cfs公平調(diào)度算法

這篇具有很好參考價值的文章主要介紹了極簡cfs公平調(diào)度算法。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1. 說明
1> linux內(nèi)核關(guān)于task調(diào)度這塊是比較復(fù)雜的,流程也比較長,要從源碼一一講清楚很容易看暈
2> 本篇文章主要是講清楚cfs公平調(diào)度算法如何將task在時鐘中斷驅(qū)動下切換調(diào)度,所以與此無關(guān)的代碼一律略過
3> 本篇只講最簡單的task調(diào)度,略過組調(diào)度,組調(diào)度在下一篇《極簡組調(diào)度-CGroup如何限制cpu》中講解
4> 本篇源碼來自CentOS7.6的3.10.0-957.el7內(nèi)核
?
2. 極簡task調(diào)度核心思想
1> linux采用cfs公平調(diào)度算法,其用vruntime記錄task運行的cpu時長,每次用重新調(diào)度時,總是選擇vruntime最小的task進(jìn)行調(diào)度
2> 所有Ready狀態(tài)的task會分配到不同cpu的rq隊列上,等待調(diào)度運行
3> 時鐘中斷中,++當(dāng)前task運行時間vruntime,并檢測當(dāng)前task運行時間是否超過一個時間片,或者其vruntime比當(dāng)前cpu rq隊列中最小的vruntime task大一個時間片,則設(shè)置resched標(biāo)記(但并不立馬進(jìn)行task切換,因為此時仍在中斷上下文中)
4> 所有中斷返回后(當(dāng)然也包括時鐘中斷),都會jump到ret_from_intr,這里會檢查resched標(biāo)記,如果置位,則調(diào)用schedule()選擇vruntime最小的task進(jìn)行調(diào)度
極簡cfs公平調(diào)度算法
?
3. 極簡task調(diào)度相關(guān)數(shù)據(jù)結(jié)構(gòu)

3.1 名詞解釋

?
全稱
說明
se schedule entity 調(diào)度實例,可以是一個task,也可以是一個group(當(dāng)使用組調(diào)度時),linux支持組調(diào)度后,將調(diào)度實例從原來的task,抽象為se
rq run queue cpu的運行隊列,每個cpu一個,處于Ready狀態(tài)的se掛在對應(yīng)的cpu運行隊列上后,才會被選擇投入運行?
cfs_rq cfs rq 公平調(diào)度運行隊列,因為一般進(jìn)程都是用cfs調(diào)度算法,一般進(jìn)程的se都是掛在rq.cfs_rq上的
vruntime virtual runtime se的一個重要成員,記錄調(diào)度實例的cpu運行時長,schedule時,cfs調(diào)度每次都選取vruntime最小的se投入運行,這就是cfs調(diào)度算法的核心原理

?
?
3.2 數(shù)據(jù)結(jié)構(gòu)
struct sched_entity
{
    unsigned int    on_rq;                           // se是否在rq上,不在的話即使task是Ready狀態(tài)也不會投入運行的
    u64             vruntime;                        // cpu運行時長,cfs調(diào)度算法總是選擇該值最小的se投入運行
};
 
struct task
{
    struct sched_entity se;                        // 調(diào)度實例
};
 
struct rq
{
    struct cfs_rq cfs;                          // 所有要調(diào)度的se都掛在cfs rq中
    struct task_struct* curr;                   // 當(dāng)前cpu上運行的task
};
 
struct cfs_rq
{
    struct rb_root tasks_timeline;              // 以vruntime為key,se為value的紅黑樹根節(jié)點,schedule時,cfs調(diào)度算法每次從這里挑選vruntime最小的se投入運行
    struct rb_node* rb_leftmost;                // tasks_timeline紅黑樹最左的葉子節(jié)點,即vruntime最小的se,直接取這個節(jié)點以加快速度
    sched_entity* curr;                         // cfs_rq中當(dāng)前正在運行的se
    struct rq* rq;                              /* cpu runqueue to which this  cfs_rq is attached */
    unsigned int nr_running;                    // cfs_rq隊列上有多少個se
};

?

3.3 數(shù)據(jù)結(jié)構(gòu)關(guān)系
極簡cfs公平調(diào)度算法
?
2.3 極簡task調(diào)度code
2.3.1 時鐘中斷
1> task調(diào)度的發(fā)動機時鐘中斷觸發(fā)后,會在smp_apic_timer_interrupt()中處理,經(jīng)過層層調(diào)用,最終會到entity_tick()
entity_tick()
{
    update_curr();
    // 如果當(dāng)前cfs_rq上的se大于1,則檢查是否要重新調(diào)度
    if (cfs_rq->nr_running > 1)
        check_preempt_tick(cfs_rq, curr);
}

2> update_curr()主要是++當(dāng)前task se的vruntime(當(dāng)然這里還對組調(diào)度進(jìn)行了處理,這里不講組調(diào)度,先略過)

void update_curr(struct cfs_rq* cfs_rq)
{
    struct sched_entity* curr = cfs_rq->curr;
    curr->vruntime += delta_exec;                   // 增加se的運行時間
}

?3>?check_preempt_tick()判定當(dāng)前運行的時間大于sched_slice時,即超過了時間片,或者其vruntime比當(dāng)前cpu rq隊列中最小的vruntime task大一個時間片,就會標(biāo)記resched,然后等中斷返回后會調(diào)用schedule()進(jìn)行task切換

void check_preempt_tick()
{
    // 如果運行時間大于sched_slice,則resched
    if (delta_exec > ideal_runtime)
        resched_task(rq_of(cfs_rq)->curr);
        
    // 如果比最小vruntime大一個sched_slice,則resched
    se = __pick_first_entity(cfs_rq);                // 選擇cfs.rb_leftmost的se,即vruntime最小的se
    delta = curr->vruntime - se->vruntime;
    if (delta > ideal_runtime)
        resched_task(rq_of(cfs_rq)->curr);
}

?4>?resched_curr()非常簡單,就是設(shè)置一個resched標(biāo)記位TIF_NEED_RESCHED

void resched_curr(struct rq* rq)
{
    struct task_struct* curr = rq->curr;
    set_tsk_thread_flag(curr, TIF_NEED_RESCHED);
}

?

2.3.2 schedule
1> 時鐘中斷返回后,會jump到ret_from_intr(有興趣可以去分析這段匯編),如果resched標(biāo)記被置位,就會調(diào)用schedule()進(jìn)行調(diào)度
void schedule()
{
    prev = rq->curr;
    put_prev_task_fair(rq, prev);        // 對當(dāng)前task進(jìn)行處理,如果該task屬于一個group,還要對組調(diào)度進(jìn)行處理,這里不展開
    // 選擇下一個task并切換運行
    next = pick_next_task(rq);           // 選擇一個vruntime最小的task進(jìn)行調(diào)度
    context_switch(rq, prev, next);
}

2>?pick_next_task() → pick_next_task_fair() → pick_next_entity() → __pick_first_entity(),__pick_first_entity()選擇vruntime最小的cfs_rq->rb_leftmost節(jié)點se進(jìn)行調(diào)度

struct sched_entity *__pick_first_entity(struct cfs_rq *cfs_rq)
{
    struct rb_node *left = cfs_rq->rb_leftmost;
    return rb_entry(left, struct sched_entity, run_node);
}

?文章來源地址http://www.zghlxwxcb.cn/news/detail-413453.html

?

到了這里,關(guān)于極簡cfs公平調(diào)度算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 01.4進(jìn)程原理和系統(tǒng)調(diào)用--->經(jīng)典的CFS調(diào)度器

    01.4進(jìn)程原理和系統(tǒng)調(diào)用--->經(jīng)典的CFS調(diào)度器

    進(jìn)程的一些正常狀態(tài) 什么是進(jìn)程 操作系統(tǒng)作為硬件的使用層,提供使用硬件資源的能力,進(jìn)程作為操作系統(tǒng)使用層, 提供使用操作系統(tǒng)抽象出的資源層的能力。 進(jìn)程:是指計算機中已運行的程序。進(jìn)程本身不是基本的運行單位,而是線程的容器。 程序本身只是指令、數(shù)據(jù)

    2024年02月10日
    瀏覽(15)
  • Linux--2.6內(nèi)核調(diào)度和環(huán)境變量

    Linux--2.6內(nèi)核調(diào)度和環(huán)境變量

    ??北塵_ :個人主頁 ??個人專欄 :《Linux操作系統(tǒng)》《經(jīng)典算法試題 》《C++》 《數(shù)據(jù)結(jié)構(gòu)與算法》 ??走在路上,不忘來時的初心 上圖是Linux2.6內(nèi)核中進(jìn)程隊列的數(shù)據(jù)結(jié)構(gòu),之間關(guān)系也已經(jīng)給大家畫出來,方便大家理解 如果有多個CPU就要考慮進(jìn)程個數(shù)的負(fù)載均衡問題 普通

    2024年02月05日
    瀏覽(22)
  • 《深入Linux內(nèi)核架構(gòu)》第2章 進(jìn)程管理和調(diào)度 (2)

    《深入Linux內(nèi)核架構(gòu)》第2章 進(jìn)程管理和調(diào)度 (2)

    目錄 2.4 進(jìn)程管理相關(guān)的系統(tǒng)調(diào)用 2.4.1 進(jìn)程復(fù)制 2.4.2 內(nèi)核線程 2.4.3 啟動新程序 2.4.4 退出進(jìn)程 本專欄文章將有70篇左右,歡迎+關(guān)注,訂閱后續(xù)文章。 1. _do_fork函數(shù) ????????fork vfork clone都最終調(diào)用_do_fork ????????????????clone:通過CLONE_XX標(biāo)志精確控制父子進(jìn)程共享哪

    2024年04月11日
    瀏覽(23)
  • Linux2.6內(nèi)核配置說明

    maturity level options 代碼成熟度選項 Prompt for development and/or incomplete code/drivers 顯示尚在開發(fā)中或尚未完成的代碼與驅(qū)動.除非你是測試人員或者開發(fā)者,否則請勿選擇 setup 常規(guī)設(shè)置 Local version - append to kernel release 在內(nèi)核版本后面加上自定義的版本字符串(小于64字符),可以用\\\"uname

    2024年02月14日
    瀏覽(48)
  • 【linux 多線程并發(fā)】多任務(wù)調(diào)度器,調(diào)度策略時間片輪轉(zhuǎn),先進(jìn)先出,多種實時任務(wù)的策略,內(nèi)核級最高優(yōu)先級調(diào)度策略

    ? 專欄內(nèi)容 : 參天引擎內(nèi)核架構(gòu) 本專欄一起來聊聊參天引擎內(nèi)核架構(gòu),以及如何實現(xiàn)多機的數(shù)據(jù)庫節(jié)點的多讀多寫,與傳統(tǒng)主備,MPP的區(qū)別,技術(shù)難點的分析,數(shù)據(jù)元數(shù)據(jù)同步,多主節(jié)點的情況下對故障容災(zāi)的支持。 手寫數(shù)據(jù)庫toadb 本專欄主要介紹如何從零開發(fā),開發(fā)的

    2024年02月03日
    瀏覽(32)
  • Linux 內(nèi)核調(diào)優(yōu)部分參數(shù)說明

    表示盡量使用內(nèi)存,減少使用磁盤 swap 交換分區(qū),內(nèi)存速度明顯高于磁盤一個數(shù)量級。 內(nèi)存分配策略,Redis 持久化存儲需設(shè)置值為1。 0:表示內(nèi)核將檢查是否有足夠的可用內(nèi)存供應(yīng)用進(jìn)程使用;如果有足夠的可用內(nèi)存,內(nèi)存申請允許;否則,內(nèi)存申請失敗,并把錯誤返回給應(yīng)

    2023年04月25日
    瀏覽(33)
  • 頻繁設(shè)置CGroup觸發(fā)linux內(nèi)核bug導(dǎo)致CGroup running task不調(diào)度

    頻繁設(shè)置CGroup觸發(fā)linux內(nèi)核bug導(dǎo)致CGroup running task不調(diào)度

    1. 說明 1 本篇是實際工作中l(wèi)inux上碰到的一個問題,一個使用了CGroup的進(jìn)程處于R狀態(tài)但不執(zhí)行,也不退出,還不能kill,經(jīng)過深入挖掘才發(fā)現(xiàn)是Cgroup的內(nèi)核bug 2發(fā)現(xiàn)該bug后,去年給RedHat提交過漏洞,但可惜并未通過,不知道為什么,這里就發(fā)我博客公開了 3 前面的2個帖子《極簡

    2023年04月15日
    瀏覽(19)
  • 【Linux內(nèi)核解析-linux-5.14.10-內(nèi)核源碼注釋】關(guān)于Linux同步機制知識點整理

    在Linux系統(tǒng)中,同步機制是操作系統(tǒng)中非常重要的一部分,以下是一些基本要點: 什么是同步機制?同步機制是一種操作系統(tǒng)提供的機制,用于協(xié)調(diào)多個進(jìn)程或線程之間的訪問共享資源,防止出現(xiàn)競態(tài)條件和死鎖等問題。 Linux中常用的同步機制有哪些?Linux中常用的同步機制

    2024年02月04日
    瀏覽(27)
  • 極簡組調(diào)度-CGroup如何限制cpu

    極簡組調(diào)度-CGroup如何限制cpu

    1. 說明 1 linux內(nèi)核關(guān)于task調(diào)度這塊是比較復(fù)雜的,流程也比較長,要從源碼一一講清楚很容易看暈,因此需要簡化,抓住主要的一個點,拋開無關(guān)的部分才能講清楚核心思想 2 本篇文章主要是講清楚在cfs公平調(diào)度算法中,CGroup如何限制cpu使用的主要過程,所以與此無關(guān)的代碼

    2023年04月15日
    瀏覽(18)
  • 編譯linux內(nèi)核模塊時的make -C M= modules的參數(shù)說明

    ????????在linux下編譯可加載內(nèi)核模塊形成.ko文件的makefile中的核心語句是: 這句是Makefile的規(guī)則:這里的 $(MAKE)就相當(dāng)于make ; -C 選項的作用是指將當(dāng)前工作目錄轉(zhuǎn)移到你所指定的位置,一般都是內(nèi)核源代碼目錄或者內(nèi)核headers目錄,如/usr/include/linux-5.1.1-headers/類似的位置

    2024年02月04日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包