公平调度(CFS)基本概念与性质

公平调度:每个进程能获得1/n的处理器时间,n指可运行的进程的数量;

(允许每个进程运行一段时间,循环轮转,选择运行最少的进程作为下一个运行进程。)

每个进程都按照它的权重在全部可运行的进程中所占比例的“时间片”来运行;nice值CFS中被作为进程获得的处理器运行比的权重;

调度周期越小,交互性越好;但是切换代价越高,系统总吞吐能力越差。

Linux调度的实现(CFS)

时间记账、进程选择、调度器入口、睡眠和唤醒;

时间记账:

调度器实体结构:CFS不再有时间片的概念,但要维护每个进程运行的时间记账;

struct task_struct {

·········

struct sched_entity se;

···········

};

struct sched_entity {

struct

load_weightload;se的权重

struct

rb_noderun_node;//在红黑树上的结点

struct list_headgroup_node;

unsigned

inton_rq;//是否在rq上

u64exec_start;

u64sum_exec_runtime;

u64vruntime;//存放进程的虚拟运行时间,以选择下一个可运行的进程

······

};

选择进程:CFS

使用红黑树来组织可运行的进程队列;红黑树节点的键值便是可运行进程的虚拟运行时间(最左侧叶子节点为最小);

每个进程一个调度周期内分配的时间(类似于传统的“时间片”)跟三个因素有关:进程总数,优先级,调度周期。

简单说vruntime就是该进程的运行时间,但这个时间是通过优先级和系统负载等加权过的时间,而非物理时钟时间,按字面理解为虚拟运行时间,也很恰当。

每个进程的调度实体se都保存着本进程的虚拟运行时间。

虚拟时间计算:

有关记账函数的调用关系:

update_curr()->__update_curr()->calc_delta_fair()->calc_delta_mine()

(1)、

//update_curr用来更新run-time的统计数据,系统会根据这些数据最终决定调度哪个进程。

static void update_curr(struct cfs_rq *cfs_rq)

{

struct sched_entity *curr =

cfs_rq->curr;

u64 now =

rq_of(cfs_rq)->clock_task;

unsigned long delta_exec;

if (unlikely(!curr))

return;

//

delta_exec获得最后一次修改后,当前进程所运行的实际时间

delta_exec = (unsigned long)(now -

curr->exec_start);

if (!delta_exec)//没有运行直接返回

return;

__update_curr(cfs_rq, curr, delta_exec);

curr->exec_start = now;

if (entity_is_task(curr))

{//(!se->my_q)

struct task_struct *curtask = task_of(curr);

trace_sched_stat_runtime(curtask, delta_exec,

curr->vruntime);

cpuacct_charge(curtask, delta_exec);

account_group_exec_runtime(curtask,

delta_exec);

}

}

(2)、

//__update_curr()更新当前任务的运行时间统计数据,跳过不在我们调度类的当前的任务。

static inline void __update_curr(struct cfs_rq *cfs_rq,

struct sched_entity *curr,

unsigned

long delta_exec)

{

unsigned long delta_exec_weighted;

//保存运行最久的时间

schedstat_set(curr->exec_max,

max((u64)delta_exec, curr->exec_max));

curr->sum_exec_runtime +=

delta_exec;//更新进程真实运行时间

schedstat_add(cfs_rq, exec_clock,

delta_exec);//(rq)->field +=

(amt);

delta_exec_weighted

=calc_delta_fair(delta_exec,

curr);

curr->vruntime +=

delta_exec_weighted;//更新进程虚拟运行时间

//更新cfs_rq最小vruntime(保存所有进程中的最小vruntime)

update_min_vruntime(cfs_rq);

}

(3)、

//delta /= w

static inline unsigned long calc_delta_fair(unsigned long

delta, struct sched_entity *se)

{//

//如果该进程拥有nice为0的权重,这时他的虚拟时钟和真实时钟是一样速度的。

if (unlikely(se->load.weight !=

NICE_0_LOAD))

delta

=calc_delta_mine(delta, NICE_0_LOAD,

&se->load);

return delta;

}

(4)、

// delta *= weight / lw

static unsigned long calc_delta_mine(unsigned long

delta_exec, unsigned long weight,struct load_weight *lw)

{

u64 tmp;

if (!lw->inv_weight) {

if (BITS_PER_LONG > 32

&&

unlikely(lw->weight >=

WMULT_CONST))

lw->inv_weight = 1;

else

lw->inv_weight = 1 +

(WMULT_CONST-lw->weight/2)

/ (lw->weight+1);

}

tmp = (u64)delta_exec * weight;

if (unlikely(tmp > WMULT_CONST))

tmp = SRR(SRR(tmp, WMULT_SHIFT/2) *

lw->inv_weight,

WMULT_SHIFT/2);

else

tmp = SRR(tmp * lw->inv_weight,

WMULT_SHIFT);

return (unsigned long)min(tmp, (u64)(unsigned

long)LONG_MAX);

}

linux cfs时间,Linux调度的实现(CFS)——虚拟时间计算相关推荐

  1. 【Linux 内核】CFS 调度器 ① ( CFS 完全公平调度器概念 | CFS 调度器虚拟时钟 Virtual Runtime 概念 | 四种进程优先级 | 五种调度类 )

    文章目录 一.CFS 调度器概念 ( 完全公平调度器 ) 二.CFS 调度器虚拟时钟概念 ( Virtual Runtime ) 三.进程优先级 ( 调度优先级 | 静态优先级 | 正常优先级 | 实 ...

  2. linux cfs 参数设置,Linux CFS如何处理周期性调度器、CFS的周期性调度及总结

    1. CFS如何处理周期性调度器 周期性调度器的工作由scheduler_tick函数完成(定义在kernel/sched/core.c, line 2910), 在scheduler_tick中周期 ...

  3. Linux调度器及CFS调度器

    Linux调度器及CFS调度器 调度器 调度器类sched_class结构体 进程的优先级 调度策略 CFS调度器 实际运行时间 虚拟运行时间 调度器结构分析 调度器 ​ 调度:就算按照某种调度的算法 ...

  4. linux 标准vruntime,linux – CFS中vruntime的概念是什么

    vruntime是每线程;它是嵌套在task_struct中的成员. 本质上,vruntime是线程"运行时"的度量 – 它在处理器上花费的时间. CFS的重点是对所有人公平;因此 ...

  5. Kernel源码笔记之调度:3.CFS

    Kernel源码笔记目录 简介 主要介绍CFS(Completely Fair Scheduler)完全公平调度器. 代码基于4.19. 两个核心数据结构 // kernel/sched/sched. ...

  6. Linux 进程管理与调度

    引言 本文整理了 Linux 内核中进程管理与调度的相关知识.更多相关文章和其他文章均收录于贝贝猫的文章目录. 进程管理与调度 现代操作系统都能同时运行多个进程,至少从用户的角度来看是这个样子的.每一 ...

  7. CFS/FQ/PQ调度与WRR负载均衡

    动机 五一临近,四月也接近尾声,五一节乃小长假的最后一天.今天是最后一天工作日,竟然感冒了,半夜里翻来覆去无法安睡,加上窗外大飞机屋里小飞机(也就是蚊子)的骚扰,实在是必须起来做点有意义的事了!    ...

  8. Linux进程管理与调度-之-目录导航【转】

    转自:http://blog.csdn.net/gatieme/article/details/51456569 版权声明:本文为博主原创文章 && 转载请著名出处 @ http:// ...

  9. 【Linux 内核】实时调度类 ② ( 实时调度实体 sched_rt_entity 源码分析 | run_list、timeout、watchdog_stamp、time_slice 字段 )

    文章目录 一.sched_rt_entity 源码分析 1.run_list 字段 2.timeout 字段 3.watchdog_stamp 字段 4.time_slice 字段 5.back 字段 ...

最新文章

  1. 【React Native】iOS原生导航跳转RN页面
  2. 鸿蒙系统合适上线手机端,华为官方:鸿蒙系统2.0上线,手机能否搭载鸿蒙操作系统?...
  3. [LeetCode] Remove Duplicates from Sorted Array II
  4. VCL界面控件DevExpress VCL Controls发布v18.2.5|附下载
  5. 使用Git命令时出现fatal: this operation must be run in a work tree提示,该如何解决
  6. scala 异步调用_非阻塞异步Java 8和Scala的Try / Success / Failure
  7. ajax默认什么方法,ajax设置默认值ajaxSetup()方法
  8. MSP430F5529 DriverLib 库函数学习笔记(十三)认识低功耗模式
  9. codesys 串口通讯实例_常见的PLC程序实例,车库自动门的PLC控制!
  10. JSP自定义标签就是如此简单
  11. nginx反向代理解决跨域
  12. 【mysql】使用脚本对mysql状态进行监控
  13. 盒子模型及层模型【定位】
  14. 韩国人气组合H.O.T所有专辑下载《经典》
  15. Equinox 和 OSGI 介绍
  16. 《认知心理学》思维导图
  17. 互联网摸鱼日报(2022-12-15)
  18. BZOJ4864: [BeiJing 2017 Wc]神秘物质(Splay)
  19. char* p 和 char p[]区别及应用
  20. Chrome 用户数据配置文件夹保存路径在哪?(Mac OS X/Windows/Linux)

热门文章

  1. java面试技术准备
  2. 算法基础——蓝桥杯(python实现,实际上大多数用c++更明白易懂)(第一部分,共12个小题)
  3. Go语言系列——01-HelloWorld、02-命名规范、03-变量、04-类型、05-常量、06-函数(Function)、07-包、08-if-else语句、09-循环、10-switch语句
  4. FC4下安装plog快速指南(plog版本:1.01)
  5. 线性筛法求素数c语言,[算法]素数筛法(埃氏筛法线性筛法)
  6. SpringBoot集成ElasticSearch对API的实际应用封装(七)
  7. 叮咚!您有蜡笔射手等五个新的软件,请注意查收哦
  8. 微信小程序不显示base64位图片
  9. 功利性地去多读书(一年300本书)
  10. VMware Workstation 14打开虚拟机黑屏解决方法 —— 修复LSP