linux内核编程4部曲之三:修改O(1)调度算法

来源:互联网 发布:故宫 书目 知乎 编辑:程序博客网 时间:2024/05/01 23:12

 

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、对比结果
   修改调度前的结果:
   
   修改调度后的结果
   

<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(66) | 评论(0) | 转发(0) |
0

上一篇:linux内核编程4部曲之二:增加linux内核系统调用

下一篇:linux内核编程4部曲之四:模块编程

相关热门文章
  • linux 常见服务端口
  • xmanager 2.0 for linux配置
  • 【ROOTFS搭建】busybox的httpd...
  • openwrt中luci学习笔记
  • Linux里如何查找文件内容...
给主人留下些什么吧!~~