linux cfs时间,Linux调度的实现(CFS)——虚拟时间计算
公平调度(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)——虚拟时间计算相关推荐
- 【Linux 内核】CFS 调度器 ① ( CFS 完全公平调度器概念 | CFS 调度器虚拟时钟 Virtual Runtime 概念 | 四种进程优先级 | 五种调度类 )
文章目录 一.CFS 调度器概念 ( 完全公平调度器 ) 二.CFS 调度器虚拟时钟概念 ( Virtual Runtime ) 三.进程优先级 ( 调度优先级 | 静态优先级 | 正常优先级 | 实 ...
- linux cfs 参数设置,Linux CFS如何处理周期性调度器、CFS的周期性调度及总结
1. CFS如何处理周期性调度器 周期性调度器的工作由scheduler_tick函数完成(定义在kernel/sched/core.c, line 2910), 在scheduler_tick中周期 ...
- Linux调度器及CFS调度器
Linux调度器及CFS调度器 调度器 调度器类sched_class结构体 进程的优先级 调度策略 CFS调度器 实际运行时间 虚拟运行时间 调度器结构分析 调度器 调度:就算按照某种调度的算法 ...
- linux 标准vruntime,linux – CFS中vruntime的概念是什么
vruntime是每线程;它是嵌套在task_struct中的成员. 本质上,vruntime是线程"运行时"的度量 – 它在处理器上花费的时间. CFS的重点是对所有人公平;因此 ...
- Kernel源码笔记之调度:3.CFS
Kernel源码笔记目录 简介 主要介绍CFS(Completely Fair Scheduler)完全公平调度器. 代码基于4.19. 两个核心数据结构 // kernel/sched/sched. ...
- Linux 进程管理与调度
引言 本文整理了 Linux 内核中进程管理与调度的相关知识.更多相关文章和其他文章均收录于贝贝猫的文章目录. 进程管理与调度 现代操作系统都能同时运行多个进程,至少从用户的角度来看是这个样子的.每一 ...
- CFS/FQ/PQ调度与WRR负载均衡
动机 五一临近,四月也接近尾声,五一节乃小长假的最后一天.今天是最后一天工作日,竟然感冒了,半夜里翻来覆去无法安睡,加上窗外大飞机屋里小飞机(也就是蚊子)的骚扰,实在是必须起来做点有意义的事了! ...
- Linux进程管理与调度-之-目录导航【转】
转自:http://blog.csdn.net/gatieme/article/details/51456569 版权声明:本文为博主原创文章 && 转载请著名出处 @ http:// ...
- 【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 字段 ...
最新文章
- 【React Native】iOS原生导航跳转RN页面
- 鸿蒙系统合适上线手机端,华为官方:鸿蒙系统2.0上线,手机能否搭载鸿蒙操作系统?...
- [LeetCode] Remove Duplicates from Sorted Array II
- VCL界面控件DevExpress VCL Controls发布v18.2.5|附下载
- 使用Git命令时出现fatal: this operation must be run in a work tree提示,该如何解决
- scala 异步调用_非阻塞异步Java 8和Scala的Try / Success / Failure
- ajax默认什么方法,ajax设置默认值ajaxSetup()方法
- MSP430F5529 DriverLib 库函数学习笔记(十三)认识低功耗模式
- codesys 串口通讯实例_常见的PLC程序实例,车库自动门的PLC控制!
- JSP自定义标签就是如此简单
- nginx反向代理解决跨域
- 【mysql】使用脚本对mysql状态进行监控
- 盒子模型及层模型【定位】
- 韩国人气组合H.O.T所有专辑下载《经典》
- Equinox 和 OSGI 介绍
- 《认知心理学》思维导图
- 互联网摸鱼日报(2022-12-15)
- BZOJ4864: [BeiJing 2017 Wc]神秘物质(Splay)
- char* p 和 char p[]区别及应用
- Chrome 用户数据配置文件夹保存路径在哪?(Mac OS X/Windows/Linux)
热门文章
- java面试技术准备
- 算法基础——蓝桥杯(python实现,实际上大多数用c++更明白易懂)(第一部分,共12个小题)
- Go语言系列——01-HelloWorld、02-命名规范、03-变量、04-类型、05-常量、06-函数(Function)、07-包、08-if-else语句、09-循环、10-switch语句
- FC4下安装plog快速指南(plog版本:1.01)
- 线性筛法求素数c语言,[算法]素数筛法(埃氏筛法线性筛法)
- SpringBoot集成ElasticSearch对API的实际应用封装(七)
- 叮咚!您有蜡笔射手等五个新的软件,请注意查收哦
- 微信小程序不显示base64位图片
- 功利性地去多读书(一年300本书)
- VMware Workstation 14打开虚拟机黑屏解决方法 —— 修复LSP