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.h>

#include

#include.h>

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.h>

#include

#include.h>

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时的测试结果


 本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1274136


相关文章
|
2月前
|
Linux Shell 调度
操作系统实验一:进程和线程(1)
实验内容 一、进程的创建 编写一段源程序,使用系统调用fork()创建子进程,当此程序运行时,在系统中有父进程和子进程在并发执行。观察屏幕上的显示结果,并分析原因(源代码:forkpid.c)。
140 0
|
8天前
|
小程序 Linux
【编程小实验】利用Linux fork()与文件I/O:父进程与子进程协同实现高效cp命令(前半文件与后半文件并行复制)
这个小程序是在文件IO的基础上去结合父子进程的一个使用,利用父子进程相互独立的特点实现对数据不同的操作
|
2月前
|
算法 调度
【操作系统】处理机调度的基本概念和三个层次、进程调度的时机和方式、调度器、闲逛线程
【操作系统】处理机调度的基本概念和三个层次、进程调度的时机和方式、调度器、闲逛线程
180 3
|
1月前
|
算法 Unix Linux
进程之舞:操作系统中的启动、状态转换与唤醒艺术
进程之舞:操作系统中的启动、状态转换与唤醒艺术
18 0
|
2月前
|
Linux API
【操作系统】实验七 显示进程列表
【操作系统】实验七 显示进程列表
22 1
|
2月前
|
负载均衡 Linux 调度
Linux 进程调度器入门
Linux 进程调度器入门
37 0
|
12月前
|
Linux 测试技术
Linux操作系统实验十一 进程管理(下)
Linux操作系统实验十一 进程管理(下)
79 0
|
2月前
|
调度 数据库
操作系统实验一:进程和线程(2)
七、共享资源的互斥访问 创建两个线程来实现对一个数的递加 pthread_example.c 1、运行
57 0
|
8月前
|
Ubuntu Unix Linux
进程章节总结性实验
进程章节总结性实验
21 0
|
8月前
|
存储 算法 搜索推荐
操作系统实验四:进程调度
操作系统实验四:进程调度
119 0