linux内核编程4部曲之一:linux内核编译(2.6.12版本)图文解说
linux内核编程4部曲之二:增加linux内核系统调用
linux内核编程4部曲之三:修改O(1)调度算法
linux内核编程4部曲之四:模块编程
一、实验目的
修改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、对比结果
修改调度前的结果:
修改调度后的结果
阅读(724) | 评论(0) | 转发(0) |