免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4755 | 回复: 8
打印 上一主题 下一主题

[进程管理] check_preempt_tick函数学习的时候遇到的一个困惑 [复制链接]

求职 : 通讯/电信开
论坛徽章:
2
2015亚冠之鹿岛鹿角
日期:2015-07-08 11:58:2615-16赛季CBA联赛之佛山
日期:2015-12-21 17:28:04
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-06-19 15:24 |只看该作者 |倒序浏览
各位前辈,小弟在学习linux内核时候遇到一个问题:在check_preempt_tick函数的最后有如下语句:
  1.         if (delta > ideal_runtime)
  2.                         resched_task(rq_of(cfs_rq)->curr);
复制代码
可是我很不理解的是delta=curr->vruntime - se->vruntime;是虚拟时钟而ideal_runtime确是真实时钟,二者直接这么相比较什么意思?我查了好多资料,也有人反应过这个问题,但始终没解决说是说明这么做的目的,还请各位多多指教,不甚感激。

  1. /*
  2. * Preempt the current task with a newly woken task if needed:
  3. */
  4. //检查能否抢占当前进程
  5. static void
  6. check_preempt_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr)
  7. {
  8.         unsigned long ideal_runtime, delta_exec;

  9.         ideal_runtime = sched_slice(cfs_rq, curr);
  10.         delta_exec = curr->sum_exec_runtime - curr->prev_sum_exec_runtime;
  11.              /*
  12.          * ideal_runtime: 应当要运行的时间, 由sched_slice()计算而来
  13.          * delta_exec: 进程运行的时间
  14.          * sum_exec_runtime: 进程执行的总时间
  15.          * prev_sum_exec_runtime: 进程在切换进CPU时的sum_exec_runtime值
  16.          */
  17.         if (delta_exec > ideal_runtime) {
  18.                 //如果进程占用CPU时间超过了ideal_runtime,则放弃这个进程,即设置标志TIF_NEED_RESCHED
  19.                 resched_task(rq_of(cfs_rq)->curr);
  20.                 /*
  21.                  * The current task ran long enough, ensure it doesn't get
  22.                  * re-elected due to buddy favours.
  23.                  */
  24.                 clear_buddies(cfs_rq, curr);
  25.                 return;
  26.         }

  27.         /*
  28.          * Ensure that a task that missed wakeup preemption by a
  29.          * narrow margin doesn't have to wait for a full slice.
  30.          * This also mitigates buddy induced latencies under load.
  31.          */
  32.         if (!sched_feat(WAKEUP_PREEMPT))
  33.                 return;

  34.         if (delta_exec < sysctl_sched_min_granularity)
  35.                 return;

  36.         if (cfs_rq->nr_running > 1) {
  37.                 //如果还有其他进程在运行,则选择其他进程调度
  38.                 struct sched_entity *se = __pick_next_entity(cfs_rq);
  39.                 s64 delta = curr->vruntime - se->vruntime;

  40.                 if (delta < 0)
  41.                         return;

  42.                 if (delta > ideal_runtime)
  43.                         resched_task(rq_of(cfs_rq)->curr);
  44.         }
  45. }
复制代码

论坛徽章:
8
羊年新春福章
日期:2015-03-19 02:03:312015亚冠之北京国安
日期:2015-06-16 22:04:45程序设计版块每日发帖之星
日期:2015-06-23 22:20:00每日论坛发贴之星
日期:2015-06-23 22:20:002015亚冠之首尔
日期:2015-06-24 19:18:072015亚冠之广州恒大
日期:2015-08-06 10:29:442015亚冠之柏太阳神
日期:2015-11-02 11:21:0515-16赛季CBA联赛之辽宁
日期:2015-12-09 15:05:02
2 [报告]
发表于 2015-06-22 12:33 |只看该作者
本帖最后由 firocu 于 2015-06-22 12:35 编辑

我靠内核什么时候变得这么恶心了, 尽然直接删注释了.
好吧,可能是代码的涵义变了... 当时看得不深刻, 现在全忘了.


楼主,看下原始commit的
  1. +       /*
  2. +        * ideal_runtime is compared against sum_exec_runtime, which is
  3. +        * walltime, hence do not scale.
  4. +        */
  5. +       ideal_runtime = max(sysctl_sched_latency / cfs_rq->nr_running,
  6. +                       (unsigned long)sysctl_sched_min_granularity);
  7. +
  8. +       /*
  9. +        * If we executed more than what the latency constraint suggests,
  10. +        * reduce the rescheduling granularity. This way the total latency
  11. +        * of how much a task is not scheduled converges to
  12. +        * sysctl_sched_latency:
  13. +        */
  14. +       delta_exec = curr->sum_exec_runtime - curr->prev_sum_exec_runtime;
  15. +       if (delta_exec > ideal_runtime)
  16. +               granularity = 0;
复制代码
回复 1# 九阳神功爱喝茶


   

论坛徽章:
0
3 [报告]
发表于 2015-08-26 18:43 |只看该作者
回复 1# 九阳神功爱喝茶

sched_slice 哪里是实际时钟了,它有针对 sched_entity 的 load 进行 加权的:

static u64 sched_slice(struct cfs_rq *cfs_rq, struct sched_entity *se)
{
        u64 slice = __sched_period(cfs_rq->nr_running + !se->on_rq);

        for_each_sched_entity(se) {
                struct load_weight *load;
                struct load_weight lw;

                cfs_rq = cfs_rq_of(se);
                load = &cfs_rq->load;

                if (unlikely(!se->on_rq)) {
                        lw = cfs_rq->load;

                        update_load_add(&lw, se->load.weight);
                        load = &lw;
                }
                slice = __calc_delta(slice, se->load.weight, load);   《====       这里做加权
        }
        return slice;
}



   

求职 : 通讯/电信开
论坛徽章:
2
2015亚冠之鹿岛鹿角
日期:2015-07-08 11:58:2615-16赛季CBA联赛之佛山
日期:2015-12-21 17:28:04
4 [报告]
发表于 2015-09-03 16:00 |只看该作者
谢谢,最近放暑假回家了,现在再来看看回复 3# l4rmbr


   

论坛徽章:
0
5 [报告]
发表于 2016-03-18 17:42 |只看该作者
回复 3# l4rmbr


    就是因为加权了,所以才是物理时间。CFS的公平体现在vruntime上,而不是物理时间的公平。
如果仅仅是物理时间的公平,那么优先级等等就没有任何意义了。load_weight是一个跟优先级相关的变量。

论坛徽章:
0
6 [报告]
发表于 2016-03-18 17:42 |只看该作者
回复 3# l4rmbr


    哪里?那里?

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2018-02-07 10:53 |只看该作者
同问。。。

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2018-02-07 20:54 来自手机 |只看该作者
同问!感觉这里就是一个bug~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP