RM新时代网站-首页

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

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

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

虛擬運(yùn)行時(shí)間計(jì)算的代碼邏輯

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

代碼邏輯比較簡單:

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

/*  確定就緒隊(duì)列的當(dāng)前執(zhí)行進(jìn)程curr  */
struct sched_entity *curr = cfs_rq- >curr;

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

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、重新更新啟動時(shí)間exec_start為now,以備下次計(jì)算時(shí)使用,最后將計(jì)算出的時(shí)間差加到先前的統(tǒng)計(jì)時(shí)間上。

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

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

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

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

4、開始計(jì)算虛擬時(shí)間

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

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

/*
 * 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,當(dāng)進(jìn)程的nice=0時(shí),不需要進(jìn)行加權(quán)處理,其虛擬時(shí)間就等于其實(shí)際運(yùn)行時(shí)間。

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

總結(jié):

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

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

    關(guān)注

    87

    文章

    11292

    瀏覽量

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

    關(guān)注

    30

    文章

    4779

    瀏覽量

    68521
收藏 人收藏

    評論

    相關(guān)推薦

    如何縮短Vivado的運(yùn)行時(shí)間

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

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

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

    stm32cubeIDE代碼運(yùn)行時(shí)間如何查看?

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

    請問6747如何測量代碼運(yùn)行時(shí)間?

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

    C語言教程之顯示程序運(yùn)行時(shí)間

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

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

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

    KEIL的代碼運(yùn)行時(shí)間功能

    郭老師說,這個(gè)時(shí)間單位是秒(sec),是從單片機(jī)運(yùn)行第一條代碼開始計(jì)算的,但是當(dāng)你真正用示波器驗(yàn)證這個(gè)時(shí)間差(因?yàn)椴恢绬纹瑱C(jī)什么時(shí)候才開始
    的頭像 發(fā)表于 06-05 15:48 ?8824次閱讀
    KEIL的<b class='flag-5'>代碼</b><b class='flag-5'>運(yùn)行時(shí)間</b>功能

    如何高效測量ECU的運(yùn)行時(shí)間

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

    淺析STM32代碼運(yùn)行時(shí)間的技巧

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

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

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

    AN021 測量MCU代碼運(yùn)行時(shí)間的幾種方法

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

    Linux虛擬運(yùn)行時(shí)間計(jì)算

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

    ch32v307記錄程序運(yùn)行時(shí)間

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

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

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

    三菱plc累計(jì)運(yùn)行時(shí)間怎么編程

    具有重要意義。本文將詳細(xì)介紹如何使用三菱PLC編程實(shí)現(xiàn)累計(jì)運(yùn)行時(shí)間的統(tǒng)計(jì)功能。 一、概述 累計(jì)運(yùn)行時(shí)間是指設(shè)備或系統(tǒng)在一定時(shí)間內(nèi)的總運(yùn)行時(shí)間。在工業(yè)生產(chǎn)中,對設(shè)備的累計(jì)
    的頭像 發(fā)表于 06-20 11:31 ?2277次閱讀
    RM新时代网站-首页