1. 计算当前task在这个tick周期实际用时delta_exetime, 更新当前task的vruntime;
  2. 根据权重,重新计算调度period,计算当前task的应得时间片slice(idle_runtime,实际时间片);
  3. 若delta_exetime大于slice,则设置切换标志;否则继续检查4;
  4. 若delta_exetime小于最小调度粒度:0.75ms(sysctl_sched_min_granularity),则不设置切换标志;否则继续检查5;
  5. 取出run queue的rq_se(__pick_first_entity),比较curr_se和rq_se的vruntime,若curr_se->vruntime小于rq_se->vruntime,则不设置切换标志,否则继续检查6;
  6. 若curr_se->vruntime - rq_se->vruntime 大于 slice, 则设置切换标志;
  7. 在中断返回时,进行任务抢占,先通过pick_next_entity找出next,将“即将运行的进程”移出rq,“被抢占的进程”重新加入rq;

为啥第6点直接用 “虚拟时间差值” 与 “实际时间片” 作比较???是否会有误差?

----由git log提交信息来看,是为了让nice > 0的进程更容易被抢占,即虚拟时间走得比实际时间快的进程更容易被抢占;

调用schedule tick有两个路径,一个是系统HZ tick,一个hrtimer tick,什么时候会启用hrtimer tick呢?

参考:http://www.wowotech.net/process_management/452.html

内核代码:fair.c -> check_preempt_tick()

即将运行的进程会被移出rq,对应的代码pick_next_task->pick_next_task_fair->set_next_entity->__dequeue_entity

总的来说,调度点有两种:

一是curr主动让出cpu,调用schedule,此时next会被移出运行队列,而curr本来就不在rq;

二是tick/中断/异常(系统调用)等,当返回用户空间时,检查抢占标志,进行任务调度;若开启抢占,则返回内核空间时同样可以抢占;

LINUX CFS 调度tick逻辑,即check_preemt_tick解析的更多相关文章

  1. Linux CFS调度器之唤醒抢占--Linux进程的管理与调度(三十)

    我们也讲解了CFS的很多进程操作 table th:nth-of-type(1){ width: 20%; } table th:nth-of-type(2){ width: 20% ; } 信息 函 ...

  2. Linux CFS调度器之pick_next_task_fair选择下一个被调度的进程--Linux进程的管理与调度(二十八)

    1. CFS如何选择最合适的进程 每个调度器类sched_class都必须提供一个pick_next_task函数用以在就绪队列中选择一个最优的进程来等待调度, 而我们的CFS调度器类中, 选择下一个 ...

  3. Linux CFS调度器之虚拟时钟vruntime与调度延迟--Linux进程的管理与调度(二十六)

    1 虚拟运行时间(今日内容提醒) 1.1 虚拟运行时间的引入 CFS为了实现公平,必须惩罚当前正在运行的进程,以使那些正在等待的进程下次被调度. 具体实现时,CFS通过每个进程的虚拟运行时间(vrun ...

  4. Linux CFS调度器之负荷权重load_weight--Linux进程的管理与调度(二十五)

    1. 负荷权重 1.1 负荷权重结构struct load_weight 负荷权重用struct load_weight数据结构来表示, 保存着进程权重值weight.其定义在/include/lin ...

  5. linux cfs调度器_理论模型

    参考资料:<调度器笔记>Kevin.Liu <Linux kernel development> <深入Linux内核架构> version: 2.6.32.9 下 ...

  6. Linux CFS调度器之队列操作--Linux进程的管理与调度(二十七)

    1. CFS进程入队和出队 完全公平调度器CFS中有两个函数可用来增删队列的成员:enqueue_task_fair和dequeue_task_fair分别用来向CFS就绪队列中添加或者删除进程 2 ...

  7. Linux CFS调度器之task_tick_fair处理周期性调度器--Linux进程的管理与调度(二十九)

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

  8. linux cfs调度器_模型实现

    调度器真实模型的主要成员变量及与抽象模型的对应关系 I.cfs_rq结构体    a) struct sched_entity *curr        指向当前正在执行的可调度实体.调度器的调度单位 ...

  9. linux cfs调度器

    在抽象模型中vruntime决定了进程被调度的先后顺序,在真实模型中决定被调度的先后顺序的参数是由函数entity_key决定的.   static inline s64 entity_key(str ...

随机推荐

  1. IntersectionObserver API,观察元素是否进入了可视区域

    网页开发时,常常需要了解某个元素是否进入了"视口"(viewport),即用户能不能看到它. 上图的绿色方块不断滚动,顶部会提示它的可见性. 传统的实现方法是,监听到scroll事 ...

  2. 品Spring:注解终于“成功上位”

    历史还是抛弃了XML,当它逐渐尝到注解的甜头之后. 尤其是在Spring帝国,到处充满着注解的气息. 注解从一个提供附属信息的“门客”,蜕变为颇具中流砥柱的“君侯”. 注解成功登上了帝国的舞台,定会像 ...

  3. yii2 提示

    控制器中: Yii::$app->getSession()->setFlash('success', "描述!"); Yii::$app->getSession( ...

  4. 线程池API总结

    1.Executor:线程池顶级接口,只有一个方法 2.ExecutorService:真正的线程池接口 1) void execute(Runnable command) :执行任务/命令,没有返回 ...

  5. 一起学Android之ContentProvider

    本文主要讲解在Android开发中ContentProvider的常规用法,仅供学习分享使用,如有不足之处,还请指正. 访问一个ContentProvider 在Android开发中,应用程序通过Co ...

  6. 在线程中显示一个窗口(多个UI线程)

    多数耗时操作可以异步执行,推荐async/await. 但和UI相关的部分仅能在UI线程执行,这时UI线程的耗时操作,导致界面卡死,不够友好. 我们可以创建一个单独的UI线程显示一个正在加载的窗口,可 ...

  7. js调用网络摄像头

    不支持IE浏览器(需要使用flash插件), 支持移动端, 未经过完全测试 PC端使用的时候, HTML页面需要预留video标签, canvas标签 移动端使用的时候, HTML页面需要预留file ...

  8. PostgreSQL 表字段起别名

    使用Postgreq Sql 表字段起别名时注意要用双引号,使用单引号会出现语法错误,执行结果如图

  9. 在vue组件中设置定时器和清除定时器

    由于项目中难免会碰到需要实时刷新,无论是获取短信码,还是在支付完成后轮询获取当前最新支付状态,这时就需要用到定时器.但是,定时器如果不及时合理地清除,会造成业务逻辑混乱甚至应用卡死的情况,这个时就需要 ...

  10. Sql之for update

    for updateselect * from xxxxxxx where namemc='筛查' for update那是一种行级锁,一旦用户对某个行施加了行级加锁,则该用户可以查询也可以更新被加锁 ...