在我提交并自己打上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/200 上传截图 格式支持JPEG/PNG/JPG,图片不超过1.9M 如有误判或任何疑问,可联系 「小助手微信:cto51cto」申诉及反馈。
我知道了
|