linux内核编程4部曲之三:修改O(1)调度算法
2016-02-16 10:04
337 查看
一、实验目的
修改O(1)调度程序,使交互性非常强的程序(IO密集型)在时间片用完后,不放置到活动数组,而放入过期数组(与O(1)调度实现相反),并测试cpu密集型和IO密集型进程的调度性能。
二、修改调度程序
该调度逻辑在2.6.12内核中,是在kernel/sched.c文件里的scheduler_tick()函数里实现的,进入该函数,定位到如下代码:
if (!TASK_INTERACTIVE(p) || EXPIRED_STARVING(rq)) {
enqueue_task(p, rq->expired);
if (p->static_prio < rq->best_expired_prio)
rq->best_expired_prio = p->static_prio;
} else
enqueue_task(p, rq->active);
}
第一个if判断里就是判断CPU消耗和IO消耗的,去掉if判断,使在时间片用完时,系统直接将进程不加判断直接加入过期队列,修改后的代码如下:
enqueue_task(p, rq->expired);
if(p->static_prio < rq->best_expired_prio)
rq->best_expired_prio = p->static_prio
三、编译内核,修改grub引导程序
该内核重新编译,并修改grub启动选项,从而可以使实验在两个O(1)调度程序下运行,如下图。如我们要测试更改前的调度,就引导第三个系统选项,如果要测试更改后的,则引导第一个(默认)。
四、性能测试
1、测试修改调度前后cpu密集程序和IO密集程序前后性能变化
A、测试cpu密集程序前后性能的程序cpu_app_test.cpp关键代码为:
B、测试IO密集型前后性能对比程序io_app_test.cpp关键代码为:
C、将两个程序分别编译成可执行文件:cpu_app_test、io_app_test
D、编写测试程序性能的调用脚本auto_test.sh
E、分别在修改调度的系统和未修改调度的系统,调用测试脚本,auto_test.sh,并且查看记录文件cpu_app_test.log和io_app_test.log
未修改调度的系统cpu密集程序结果
修改了调度的cpu密集程序结果
未修改调度的IO密集型程序结果
修改了调度的IO密集型程序结果
2、测试修改前后cpu密集程序与IO密集型程序性能比较
A、在测试基础上,修改cpu_app_test.cpp和io_app_test.cpp程序,将子进程的时间间隔打印功能注释掉
B、屏蔽掉子进程的时间间隔功能后,我们可以专注于整个程序(cpu密集或IO密集)所有子进程完成后的总时间,分别在两个系统中利用auto_test.sh脚本,测试运行20次。
C、分别在两个系统中查看日志文件,io_app_test.log、cpu_app_test.log
D、对比结果
修改调度前的结果:
修改调度后的结果
修改O(1)调度程序,使交互性非常强的程序(IO密集型)在时间片用完后,不放置到活动数组,而放入过期数组(与O(1)调度实现相反),并测试cpu密集型和IO密集型进程的调度性能。
二、修改调度程序
该调度逻辑在2.6.12内核中,是在kernel/sched.c文件里的scheduler_tick()函数里实现的,进入该函数,定位到如下代码:
if (!TASK_INTERACTIVE(p) || EXPIRED_STARVING(rq)) {
enqueue_task(p, rq->expired);
if (p->static_prio < rq->best_expired_prio)
rq->best_expired_prio = p->static_prio;
} else
enqueue_task(p, rq->active);
}
第一个if判断里就是判断CPU消耗和IO消耗的,去掉if判断,使在时间片用完时,系统直接将进程不加判断直接加入过期队列,修改后的代码如下:
enqueue_task(p, rq->expired);
if(p->static_prio < rq->best_expired_prio)
rq->best_expired_prio = p->static_prio
三、编译内核,修改grub引导程序
该内核重新编译,并修改grub启动选项,从而可以使实验在两个O(1)调度程序下运行,如下图。如我们要测试更改前的调度,就引导第三个系统选项,如果要测试更改后的,则引导第一个(默认)。
四、性能测试
1、测试修改调度前后cpu密集程序和IO密集程序前后性能变化
A、测试cpu密集程序前后性能的程序cpu_app_test.cpp关键代码为:
B、测试IO密集型前后性能对比程序io_app_test.cpp关键代码为:
C、将两个程序分别编译成可执行文件:cpu_app_test、io_app_test
D、编写测试程序性能的调用脚本auto_test.sh
E、分别在修改调度的系统和未修改调度的系统,调用测试脚本,auto_test.sh,并且查看记录文件cpu_app_test.log和io_app_test.log
未修改调度的系统cpu密集程序结果
修改了调度的cpu密集程序结果
未修改调度的IO密集型程序结果
修改了调度的IO密集型程序结果
2、测试修改前后cpu密集程序与IO密集型程序性能比较
A、在测试基础上,修改cpu_app_test.cpp和io_app_test.cpp程序,将子进程的时间间隔打印功能注释掉
B、屏蔽掉子进程的时间间隔功能后,我们可以专注于整个程序(cpu密集或IO密集)所有子进程完成后的总时间,分别在两个系统中利用auto_test.sh脚本,测试运行20次。
C、分别在两个系统中查看日志文件,io_app_test.log、cpu_app_test.log
D、对比结果
修改调度前的结果:
修改调度后的结果
相关文章推荐
- linux 自动化运维工具ansible的使用详细教程
- linux内核编程4部曲之二:增加linux内核系统调用
- linux内核编程4部曲之一:linux内核编译
- Linux服务器中木马(肉鸡)手工清除方法
- linux内核的编译
- linux mail 命令 (收发邮件)
- Linux平台Boost的编译方法
- 基于AT91SAM9X35EK的嵌入式Linux+UBI根文件系统移植成功
- Linux中强大的top命令
- linux进程的后台运行、查看、关闭等命令
- Linux 磁盘空间操作
- linux之sed命令
- linux常用命令
- ubuntu挂载新磁盘到指定目录
- Centos 安装fastcgi详解与用例
- win7下eclipse插件连接linux下hdfs单机伪集群 hadoop 2.6
- Linux常用命令
- linux学习一天一个命令(15)[tar命令]
- linux学习一天一个命令(13)[head命令]
- linux学习一天一个命令(12)[less命令]