CFS调度器中子进程被唤醒后的细节--实验和理论

在我提交并自己打上child-runs-first补丁之前,我做了一个实验,目的是验证一下我先前理论分析的结果,我觉得子进程无论如何抢占父进程的几率都会比不抢占要大些,当然前提是要有的,具体见下面的试验。空有理论是没有用的,理论上cfs调度器执行严格的归一化,然而实际上却不是那样的,实践结果永远比理论更加现实,因为不执行归一化丝毫影响不了cfs调度器选择最小vruntime的进程,这很简单,每一个进程按照自己的权值和当前的系统调度周期执行动态时间片的时间,同时按照不同的速率推进自己的虚拟时间,调度器只要能保证各个进程在运行按照其权值分给它们的不同时间片之后可以向前推进相同的虚拟时间就可以了,管他什么归一化呢?正是这样,cfs调度器运行的很好。

环境:单cpu,HZ=250,linux-2.6.28原始内核(没有打我的child_runs_first补丁)

内核配置与实验前提:sysctl_sched_child_runs_first=0,sysctl_sched_features=(仅打开AKEUP_PREEMPT),sysctl_sched_wakeup_granularity=0,sysctl_sched_latency_ns=20000000.

目的:在没有sysctl_sched_child_runs_first策略的情况下测试cfs调度器在子进程被唤醒时的行为

测试程序:

-------stub--------

/*模拟cpu进程,将cfs_rq的nr_running提高到一定数量*/

int main(int argc,char*argv[] )

{

nice(atoi(argv[1]));

int a = 1,b=0;

while(a++||1)

{

b+=a;

}

}

-------child_run_delay--------

/*父进程延迟一会再fork,避免托shell在fork父进程时给了父进程min_vruntime的福*/

#include

#include

#include

int main(int argc,char *argv[])

{

int v = atoi(argv[1]);

nice(v);

unsigned long i = 1000000;

while(i-->0)

{

v++;

}

if(fork() == 0)

{

printf("sub/n");

exit(0);

}

printf("main,%d/n",v);

}

-------child_run_nodelay--------

/*马上fork子进程,托父进程vruntime很小的福*/

#include

#include

#include

int main(int argc,char *argv[])

{

int v = atoi(argv[1]);

nice(v);

if(fork() == 0)

{

printf("sub/n");

exit(0);

}

printf("main/n");

}

测试过程:连续创建9个stub进程,nice值分散开来,然后以不同的nice值运行child_run_delay和child_run_nodelay。

结果:

测试代码中i=1000时的测试结果

分享至
一键收藏,随时查看,分享好友!
0人
了这篇文章
类别:未分类┆阅读( 0)┆评论( 0) ┆ 返回博主首页┆ 返回博客首页
上一篇 CFS调度器虚拟时钟归一化理想的破碎 下一篇 我提交的一个内核补丁―CFS的child-runs-first

职位推荐

  • 网络工程师
  • 前台兼人事助理
  • 运维工程师
  • 高级运维工程师
  • 初级运维工程师
  • 网络安全工程师
  • 运维工程师
  • 资深运维工程师
  • 系统运维工程师
  • 网络运维工程师

文章评论

 
 

发表评论            

昵  称:
登录  快速注册
验证码:

点击图片可刷新验证码请点击后输入验证码博客过2级,无需填写验证码

内  容:

同时赞一个

每日博报 精彩不止一点关闭

你可能感兴趣的:(shell,测试,活动,features,delay)