吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

虛擬運行時間計算的代碼邏輯

麥辣雞腿堡 ? 來源:技術(shù)簡說 ? 作者:董旭 ? 2023-07-31 11:19 ? 次閱讀

代碼邏輯比較簡單:

1、確定就緒隊列的當前執(zhí)行的調(diào)度實體

/*  確定就緒隊列的當前執(zhí)行進程curr  */
struct sched_entity *curr = cfs_rq- >curr;

2、根據(jù)獲取的當前執(zhí)行進程,計算當前和上一次更新負荷權(quán)重時兩次的時間的差值

u64 now = rq_clock_task(rq_of(cfs_rq));
 u64 delta_exec;

 if (unlikely(!curr))
  return;

 delta_exec = now - curr- >exec_start;
 if (unlikely((s64)delta_exec <= 0))
  return;

3、重新更新啟動時間exec_start為now,以備下次計算時使用,最后將計算出的時間差加到先前的統(tǒng)計時間上。

/*  重新更新啟動時間exec_start為now  */
curr- >exec_start = now;

schedstat_set(curr- >statistics.exec_max,
              max(delta_exec, curr- >statistics.exec_max));

/*  將時間差加到先前統(tǒng)計的時間即可  */
curr- >sum_exec_runtime += delta_exec;
schedstat_add(cfs_rq, exec_clock, delta_exec);

這也是通過cat /proc/$pid/sched看到的一些統(tǒng)計信息

4、開始計算虛擬時間

curr- >vruntime += calc_delta_fair(delta_exec, curr);

5、計算虛擬時間函數(shù)calc_delta_fair如下,忽略舍入和溢出檢查,calc_delta_fair函數(shù)所做的計算如下:

/*
 * delta /= w
 */
static inline u64 calc_delta_fair(u64 delta, struct sched_entity *se)
{
 if (unlikely(se- >load.weight != NICE_0_LOAD))
  delta = __calc_delta(delta, NICE_0_LOAD, &se- >load);

 return delta;
}

圖片

其中NICE_0_LOAD的值為:1024,當進程的nice=0時,不需要進行加權(quán)處理,其虛擬時間就等于其實際運行時間。

# define SCHED_FIXEDPOINT_SHIFT  10
#define NICE_0_LOAD_SHIFT (SCHED_FIXEDPOINT_SHIFT)
#define NICE_0_LOAD  (1L < < NICE_0_LOAD_SHIFT)

?1024也就是Nice值為0對應(yīng)的權(quán)重值,權(quán)重值在內(nèi)核中是預(yù)先定義好的,如下所示:

const int sched_prio_to_weight[40] = {
 /* -20 */     88761,     71755,     56483,     46273,     36291,
 /* -15 */     29154,     23254,     18705,     14949,     11916,
 /* -10 */      9548,      7620,      6100,      4904,      3906,
 /*  -5 */      3121,      2501,      1991,      1586,      1277,
 /*   0 */      1024,       820,       655,       526,       423,
 /*   5 */       335,       272,       215,       172,       137,
 /*  10 */       110,        87,        70,        56,        45,
 /*  15 */        36,        29,        23,        18,        15,
};

通過公式和內(nèi)核預(yù)先設(shè)定的權(quán)重表,可以看出來:

Nice值越高(對應(yīng)的優(yōu)先級越低),權(quán)重越小,虛擬時間累加的越快(虛擬時間過得越快),Nice值越低(對應(yīng)的優(yōu)先級越高),權(quán)值越高,虛擬時間累加的越慢(虛擬時間過得越慢)。CFS的思想核心也就是這樣,讓每個調(diào)度實體的虛擬時間增加速度不同,使用虛擬時間來衡量調(diào)度實體在CPU上已經(jīng)執(zhí)行的時間。

總結(jié):

不同優(yōu)先級的進程以各自對應(yīng)的速度推進虛擬時間,只要保證在一個調(diào)度延遲內(nèi)虛擬時間的推進進展相同,就實現(xiàn)了完成公平,公平指的是相對公平,即按進程的權(quán)重給予不同的運行時間,虛擬時間越小,代表著受到了"不公平"對待,因此下一個參與調(diào)度的調(diào)度實體就是紅黑樹中的最左邊(虛擬時間最小)的節(jié)點,如此一來既能公平選擇進程,又能保證高權(quán)重進程獲得較多的運行時間。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11345

    瀏覽量

    210395
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4827

    瀏覽量

    69052
收藏 人收藏

    評論

    相關(guān)推薦

    如何縮短Vivado的運行時間

    在Vivado Implementation階段,有時是有必要分析一下什么原因?qū)е?b class='flag-5'>運行時間(runtime)過長,從而找到一些方法來縮短運行時間
    的頭像 發(fā)表于 05-29 14:37 ?1.4w次閱讀
    如何縮短Vivado的<b class='flag-5'>運行時間</b>

    如何檢查Linux服務(wù)器的運行時間

    Linux 中的 uptime 用于查看系統(tǒng)啟動后的運行時間。它是一個比較簡單的 Linux 命令,可以不帶參數(shù)直接運行
    發(fā)表于 11-25 15:25 ?1.5w次閱讀
    如何檢查Linux服務(wù)器的<b class='flag-5'>運行時間</b>

    stm32cubeIDE代碼運行時間如何查看?

    stm32cubeIDE 代碼運行時間,如何查看?就如 keil 調(diào)試時候那樣,可以測試代碼運行時間。但是在stm32cubeIDE 中,一直沒有找到這個功能,不知道哪位高人可以提示
    發(fā)表于 04-16 08:10

    請問6747如何測量代碼運行時間

    1. 我想用片上的硬件定時器的方法測量代碼運行時間,使用timer,加頭文件:csl_timer.h,但是6747沒有csl,我下載了6747的cslr package,發(fā)現(xiàn)里面也沒有
    發(fā)表于 07-28 10:25

    C語言教程之顯示程序運行時間

    C語言教程之顯示程序運行時間,很好的C語言資料,快來學習吧。
    發(fā)表于 04-25 16:09 ?0次下載

    如何用SysTick實現(xiàn)測量程序運行時間

    在實際的項目開發(fā)過程中,常常遇到需要得到一段代碼運行時間,通常的方法是用示波器來測量,這篇博文將用 SysTick 來實現(xiàn) 精確測量 程序運行時間。 STM32F4 的內(nèi)核定時
    的頭像 發(fā)表于 05-09 14:07 ?6118次閱讀
    如何用SysTick實現(xiàn)測量程序<b class='flag-5'>運行時間</b>

    KEIL的代碼運行時間功能

    郭老師說,這個時間單位是秒(sec),是從單片機運行第一條代碼開始計算的,但是當你真正用示波器驗證這個時間差(因為不知道單片機什么時候才開始
    的頭像 發(fā)表于 06-05 15:48 ?9016次閱讀
    KEIL的<b class='flag-5'>代碼</b><b class='flag-5'>運行時間</b>功能

    如何高效測量ECU的運行時間

    ,最終可能會引起運行時間方面的問題。這在項目后期需要大量的時間和金錢來解決。如果不能掌握系統(tǒng)的運行狀態(tài),則很難發(fā)現(xiàn)系統(tǒng)內(nèi)缺陷的根源。 解決方案 將TA軟件工具套件與VX1000測量標定硬件相結(jié)合,可同步分析 ECU內(nèi)部
    的頭像 發(fā)表于 10-28 11:05 ?2307次閱讀

    淺析STM32代碼運行時間的技巧

    前言 ????測試代碼運行時間的兩種方法: 使用單片機內(nèi)部定時器,在待測程序段的開始啟動定時器,在待測程序段的結(jié)尾關(guān)閉定時器。為了測量的準確性,要進行多次測量,并進行平均取值。 借助示波器的方法
    的頭像 發(fā)表于 11-09 09:52 ?3964次閱讀
    淺析STM32<b class='flag-5'>代碼</b><b class='flag-5'>運行時間</b>的技巧

    利用StopWatch監(jiān)控Java代碼運行時間和分析性能

    利用StopWatch監(jiān)控Java代碼運行時間和分析性能。
    的頭像 發(fā)表于 07-21 16:51 ?2931次閱讀

    AN021 測量MCU代碼運行時間的幾種方法

    AN021 測量MCU代碼運行時間的幾種方法
    發(fā)表于 02-27 18:23 ?0次下載
    AN021 測量MCU<b class='flag-5'>代碼</b><b class='flag-5'>運行時間</b>的幾種方法

    Linux虛擬運行時間計算

    虛擬運行時間計算 關(guān)于tick: tick是周期性的時鐘中斷,時鐘中斷驅(qū)動調(diào)度器runing,其周期間隔根據(jù)硬件頻率的設(shè)定相關(guān)(T=1/f),如下: T=1/250 = 4ms,也就說時鐘中斷以
    的頭像 發(fā)表于 07-31 11:15 ?781次閱讀
    Linux<b class='flag-5'>虛擬</b><b class='flag-5'>運行時間</b>的<b class='flag-5'>計算</b>

    ch32v307記錄程序運行時間

    ch32v307記錄程序運行時間 在程序開發(fā)中,很重要的一項任務(wù)就是對程序的運行時間進行評估。對于大型的程序系統(tǒng)來說,它們通常需要處理大量的數(shù)據(jù)或進行復(fù)雜的計算操作。因此,如果程序的運行時間
    的頭像 發(fā)表于 08-22 15:53 ?957次閱讀

    jvm運行時內(nèi)存區(qū)域劃分

    JVM是Java Virtual Machine(Java虛擬機)的縮寫,它是Java編程語言的運行環(huán)境。JVM的主要功能是將Java源代碼轉(zhuǎn)換為機器代碼,并且在
    的頭像 發(fā)表于 12-05 14:08 ?571次閱讀

    三菱plc累計運行時間怎么編程

    具有重要意義。本文將詳細介紹如何使用三菱PLC編程實現(xiàn)累計運行時間的統(tǒng)計功能。 一、概述 累計運行時間是指設(shè)備或系統(tǒng)在一定時間內(nèi)的總運行時間。在工業(yè)生產(chǎn)中,對設(shè)備的累計
    的頭像 發(fā)表于 06-20 11:31 ?2523次閱讀
    百家乐是娱乐场最不公平的游戏| 百家乐官网大赌场娱乐网规则| A8百家乐娱乐平台| 黎川县| 百家乐的赚钱原理| 香港六合彩信息| 澳门百家乐官网手机软件| bet365网站| 玩百家乐官网都是什么人| 太阳城巧克力| 百家乐官网网站赌钱吗| 威尼斯人娱乐城极好| 百家乐官网赌术大揭秘| 大发888真人真钱网址| 百家乐官网百家乐官网技巧| 大发888登不上| 网上百家乐官网试| 至尊娱乐城| 真人百家乐视频赌博| 百家乐官网路单破解软件| 百家乐博弈之赢者理论| 百家乐官网的弱点| 金宝博188| 新2百家乐娱乐城| 百家乐官网闲拉长龙| 老k百家乐的玩法技巧和规则| 百家乐官网英皇娱乐城| 大发888大发888官网| 百家乐玩法和技巧| 澳门百家乐官网网址| sz新全讯网网址2290| 缅甸百家乐官网赌场| 怀安县| 百家乐操作技巧| 贝博百家乐官网的玩法技巧和规则| 大发888官方网站指定开| 百家乐怎么玩能赢钱| 百家乐官网平台要多少钱| 皇冠现金网骗人| 海立方百家乐客户端| 百家乐官网黄金城游戏大厅|