Chinaunix首页 | 论坛 | 博客
  • 博客访问: 504184
  • 博文数量: 184
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1172
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-21 13:40
个人简介

技术改变命运

文章分类

全部博文(184)

文章存档

2020年(16)

2017年(12)

2016年(156)

我的朋友

分类: LINUX

2016-09-23 12:35:20

 

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()函数里实现的,进入该函数,定位到如下代码:

  1. if (!TASK_INTERACTIVE(p) || EXPIRED_STARVING(rq)) {
  2. enqueue_task(p, rq->expired);
  3. if (p->static_prio < rq->best_expired_prio)
  4.  rq->best_expired_prio = p->static_prio;
  5. } else
  6.  enqueue_task(p, rq->active);
  7. }

 第一个if判断里就是判断CPU消耗和IO消耗的,去掉if判断,使在时间片用完时,系统直接将进程不加判断直接加入过期队列,修改后的代码如下:

  1.     enqueue_task(p, rq->expired);
  2. if(p->static_prio < rq->best_expired_prio)
  3. 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、对比结果
   修改调度前的结果:
   
   修改调度后的结果
   

阅读(1356) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~