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. Mysql基本注入

    实验环境:墨者学院Mysql手工注入漏洞测试靶场 后台源码没有进行任何字符过滤. 首先进入靶场环境 先用admin登陆试试 果然不行,这时看到用户登录下方有一个停机维护通知,点进去瞅瞅 看到这里链接上 ...

  2. java调用py文件传参执行

    java执行的也是py文件主函数. 传参: String url="*********************"; String[] args1 = new String[] { ...

  3. Python常用的正则表达式处理函数

    Python常用的正则表达式处理函数 正则表达式是一个特殊的字符序列,用于简洁表达一组字符串特征,检查一个字符串是否与某种模式匹配,使用起来十分方便. 在Python中,我们通过调用re库来使用re模 ...

  4. 【洛谷5369】[PKUSC2018] 最大前缀和(状压DP)

    点此看题面 大致题意: 对于一个序列,求全排列下最大前缀和之和. 状压\(DP\) 考虑如果单纯按照题目中对于最大前缀和的定义,则一个序列它的最大前缀和是不唯一的. 为了方便统计,我们姑且规定,如果一 ...

  5. typescript与nodejs(一)最简单的webserver

    安装nodejs tsc cnpm vscode 这些略 如果网络慢,可以考虑使用CNPM 一. 基本WebServer模块环境 1. 命令行  npm init 初始化一个目录为nodejs项目 2 ...

  6. IT兄弟连 HTML5教程 CSS3揭秘 CSS常见的样式属性和值1

    CSS中的样式属性比较多,经常使用的属性可以分为这么几类:字体.文本.背景.位置.边框.列表,以及其他一些样式属性.每个类中的属性都可以单独使用:如果同一个类中多个属性一起使用,还可以将它们整合为一行 ...

  7. 【linux命令 】文件特殊权限(SUID、SGID、SBIT)

    chmod 2770 /home/admins,刚看到这个命令,有点不解,后边770分别表示用户,组,其他人,前面的2不知道代表的是什么意思.百度之后发现2是代表八进制数,也是一种权限,它的三个bit ...

  8. GO基础之Map

    go开发手册:   https://studygolang.com/pkgdoc 一.什么是map 有资料翻译成地图.映射或字典.但是大多数习惯上翻译成集合.1.map是Go中的内置类型,它将一个值与 ...

  9. HTML空元素

    什么是空元素? 首先空元素下是没有子级节点和内容的.然后空元素是在开始标签中关闭的,也就是说空元素没有闭合标签的. 在HTML中的空元素有以下几个: <area> <base> ...

  10. 团队项目之团队展示&选题

    团队博文:https://www.cnblogs.com/blackpanda/p/11734448.html 一. 团队展示 1.  队名: Black Panda 2.  队员: 郑伟金 3117 ...