[转]cfs 调度】的更多相关文章

首先需要思考的问题是:什么是调度器(scheduler)?调度器的作用是什么?调度器是一个操作系统的核心部分.可以比作是CPU时间的管理员.调度器主要负责选择某些就绪的进程来执行.不同的调度器根据不同的方法挑选出最适合运行的进程.目前Linux支持的调度器就有RT scheduler.Deadline scheduler.CFS scheduler及Idle scheduler等.我想用一系列文章呈现Linux 调度器的设计原理. 注:文章代码分析基于Linux-4.18.0. 什么是调度类 从…
我们也讲解了CFS的很多进程操作 table th:nth-of-type(1){ width: 20%; } table th:nth-of-type(2){ width: 20% ; } 信息 函数 描述 进程入队/出队 enqueue_task_fair/dequeue_task_fair 向CFS的就读队列中添加删除进程 选择最优进程(主调度器) pick_next_task_fair 主调度器会按照如下顺序调度 schedule -> __schedule -> 全局pick_nex…
1. CFS如何选择最合适的进程 每个调度器类sched_class都必须提供一个pick_next_task函数用以在就绪队列中选择一个最优的进程来等待调度, 而我们的CFS调度器类中, 选择下一个将要运行的进程由pick_next_task_fair函数来完成 之前我们在将主调度器的时候, 主调度器schedule函数在进程调度抢占时, 会通过__schedule函数调用全局pick_next_task选择一个最优的进程, 在pick_next_task中我们就按照优先级依次调用不同调度器类…
1 虚拟运行时间(今日内容提醒) 1.1 虚拟运行时间的引入 CFS为了实现公平,必须惩罚当前正在运行的进程,以使那些正在等待的进程下次被调度. 具体实现时,CFS通过每个进程的虚拟运行时间(vruntime)来衡量哪个进程最值得被调度. CFS中的就绪队列是一棵以vruntime为键值的红黑树,虚拟时间越小的进程越靠近整个红黑树的最左端.因此,调度器每次选择位于红黑树最左端的那个进程,该进程的vruntime最小 虚拟运行时间是通过进程的实际运行时间和进程的权重(weight)计算出来的. 在…
1. 负荷权重 1.1 负荷权重结构struct load_weight 负荷权重用struct load_weight数据结构来表示, 保存着进程权重值weight.其定义在/include/linux/sched.h, v=4.6, L1195, 如下所示 struct load_weight { unsigned long weight; /* 存储了权重的信息 */ u32 inv_weight; /* 存储了权重值用于重除的结果 weight * inv_weight = 2^32 *…
关键词: 目录: Linux进程管理 (1)进程的诞生 Linux进程管理 (2)CFS调度器 Linux进程管理 (3)SMP负载均衡 Linux进程管理 (4)HMP调度器 Linux进程管理 (5)NUMA调度器 Linux进程管理 (6)EAS绿色节能调度器 Linux进程管理 (7)实时调度 Linux进程管理 (8)最新更新与展望 Linux进程管理 (篇外)内核线程 根据进程的特性可以将进程划分为:交互式进程.批处理进程.实时进程. O(N)调度器从就绪队列中比较所有进程的优先级,…
参考资料:<调度器笔记>Kevin.Liu <Linux kernel development> <深入Linux内核架构> version: 2.6.32.9 下文中对于红黑树或链表组织的就绪队列,统称为用队列组织的就绪队列.                                                   linux中用struct rq将处于ready状态的进程组织在一起.    struct rq结构体包含cfs和rt成员,分别表示两个就绪队列…
一.前言 随着内核版本的演进,其源代码的膨胀速度也在递增,这让Linux的学习曲线变得越来越陡峭了.这对初识内核的同学而言当然不是什么好事情,满腔热情很容易被当头浇灭.我有一个循序渐进的方法,那就是先不要看最新的内核,首先找到一个古老版本的内核(一般都会比较简单),将其吃透,然后一点点的迭代,理解每个版本变更背后的缘由和目的,最终推进到最新内核版本. 本文就是从2.4时代的任务调度器开始,详细描述其实现并慢慢向前递进.当然,为了更好的理解Linux调度器设计和实现,我们在第二章给出了一些通用的概…
CFS调度分析(内核版本:2.6.34) 1.时间记账 CFS不再有时间片的概念,他维护的是每个进程运行的时间记账 使用调度器实体结构来追踪进程运行记账: <linux/sched.h> 无数统计变量… …,但是算法核心就是围绕vruntime设计. 调度器实体,作为进程的一个名为se的成员变量. 2.虚拟实时 CFS使用vruntime变量来记录一个程序到底运行了多长时间以及他要应该运行多久. <kernel/sched_fair.c> 中,up_date_curr()实现这个功…
CFS调度器的原理明白了但是有个地方,搜遍了整个网络也没找到一个合理的解释: if (delta > ideal_runtime) resched_task(rq_of(cfs_rq)->curr); 这出代码是在patch:f685ceaca sched: Strengthen buddies and mitigate buddy induced latencies patch中描述和是LAST_BUDDY 和 wakeup preemption相关 buddy是什么意思?是调度队列中的而一…