免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3058 | 回复: 2

cfs问题(三) [复制链接]

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
发表于 2011-12-08 22:23 |显示全部楼层
30可用积分
linux 2.6.29

cfs调度器中出现的buddy不知是什么,谁给我科普一下啊:
  1. 722static void __clear_buddies(struct cfs_rq *cfs_rq, struct sched_entity *se)
  2. 723{
  3. 724        if (cfs_rq->last == se)
  4. 725                cfs_rq->last = NULL;
  5. 726
  6. 727        if (cfs_rq->next == se)
  7. 728                cfs_rq->next = NULL;
  8. 729}
复制代码
  1. 1368static void set_next_buddy(struct sched_entity *se)
  2. 1369{
  3. 1370        if (likely(task_of(se)->policy != SCHED_IDLE)) {
  4. 1371                for_each_sched_entity(se)
  5. 1372                        cfs_rq_of(se)->next = se;
  6. 1373        }
  7. 1374}
复制代码
不知是不是指cfs_rq->next和cfs_rq->last?
还有这两个是神马意思啊?

最佳答案

查看完整内容

pick_next_entity的代码,它选择进程的规则较书上说的已经有了一些改进。原本cfs总是选择rb树最左边的进程,也就是虚拟时钟最落后的进程。现在又在这个规则之上加入了buddy这个概念:(看函数注释)1、优先选择next buddy指向的进程。如果实在希望某个进程优先被调度,就让next buddy指向它。比如如下的情况: 1.1、cfs组调度的情况下,总是先选中一个组,再选中组内的一个进程。如果这个被选中的进程睡眠了(在未用完它的配额 ...

论坛徽章:
0
发表于 2011-12-08 22:23 |显示全部楼层
  1. /*
  2. * Pick the next process, keeping these things in mind, in this order:
  3. * 1) keep things fair between processes/task groups
  4. * 2) pick the "next" process, since someone really wants that to run
  5. * 3) pick the "last" process, for cache locality
  6. * 4) do not run the "skip" process, if something else is available
  7. */
  8. static struct sched_entity *pick_next_entity(struct cfs_rq *cfs_rq)
  9. {
  10.         struct sched_entity *se = __pick_first_entity(cfs_rq);
  11.         struct sched_entity *left = se;

  12.         /*
  13.          * Avoid running the skip buddy, if running something else can
  14.          * be done without getting too unfair.
  15.          */
  16.         if (cfs_rq->skip == se) {
  17.                 struct sched_entity *second = __pick_next_entity(se);
  18.                 if (second && wakeup_preempt_entity(second, left) < 1)
  19.                         se = second;
  20.         }

  21.         /*
  22.          * Prefer last buddy, try to return the CPU to a preempted task.
  23.          */
  24.         if (cfs_rq->last && wakeup_preempt_entity(cfs_rq->last, left) < 1)
  25.                 se = cfs_rq->last;

  26.         /*
  27.          * Someone really wants this to run. If it's not unfair, run it.
  28.          */
  29.         if (cfs_rq->next && wakeup_preempt_entity(cfs_rq->next, left) < 1)
  30.                 se = cfs_rq->next;

  31.         clear_buddies(cfs_rq, se);

  32.         return se;
  33. }
复制代码
pick_next_entity的代码,它选择进程的规则较书上说的已经有了一些改进。原本cfs总是选择rb树最左边的进程,也就是虚拟时钟最落后的进程。现在又在这个规则之上加入了buddy这个概念:(看函数注释)
1、优先选择next buddy指向的进程。如果实在希望某个进程优先被调度,就让next buddy指向它。比如如下的情况:
    1.1、cfs组调度的情况下,总是先选中一个组,再选中组内的一个进程。如果这个被选中的进程睡眠了(在未用完它的配额之前),运行权应该交回这个组,再选择组内的其他进程。这时候就将组对应的se置为next buddy;
    1.2、一个进程被唤醒,会调用到check_preempt_wakeup检查它能否抢占current。如果能,则在resched之前将该进程设为next buddy,从而确保resched能调度到它;
    1.3、yield_to函数实现了让某个指定的进程得到运行的功能,也是通过将指定的进程设为next buddy来实现的;
2、第二优先选择last buddy指向的进程。last buddy表示上一次运行的进程,在该进程被另一个刚唤醒的进程抢占时,会让last buddy指向它。为了充分利用cache,希望这个进程能尽快回来继续运行;
3、skip buddy是调度器不应该选择的进程。在yield_to的时候会用到,将current设为skip buddy,避免指定要运行的那个进程抢占不了它。

此外,选择next buddy或last buddy还有一个前提条件,就是通过wakeup_preempt_entity比较它与rb树最左边的进程。这个buddy进程可以比rb树最左边的进程差一些,但不能差太多。

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
发表于 2011-12-08 22:39 |显示全部楼层
大哥,调度这块我也不懂啊.你发站短我也帮不了你啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP