Busybox: 在SMP系统中为应用划拨专属CPU

问题:

    在SMP的系统中,为保证某Application即使在其他进程都很忙的情况下都能够获得足够的CPU资源。


思路:

    1. 提高该Application对应的Process的优先级。

    2. 从SMP系统中专门划拨出一组CPU来处理该Application。


解决方案:

   第一种方法没啥可说的。


   第二种方法,有点替内核操心的感觉,但是就纯研究的角度来看,还是有点意思的。在SMP的环境中为某个应用制定专属CPU,换句话说就是只有这个应用才能在指定的CPU组上运行。再进一步:其他所有的应用都不能在指定的CPU组上运行。

    最先想到的就是CPU的亲缘性绑定,也就是说,把所有其他进程的CPU亲缘性绑定在指定CPU组的补集上。再将特定的应用绑定在指定的CPU组上,这就意味着所有的进程都需要加入CPU亲缘性绑定的逻辑。但是幸运的是,我们是在Linux系统上。Linux所有的用户态程序都是Init的子孙。而且这些子孙们都继承祖先的CPU亲缘性的特征。所以如果我们能够指定Init进程的CPU亲缘性,那么就可以影响到所有用户态进程的CPU亲缘性的设定。

    假设SMP系统中有2块CPU,分别是: CPU0和CPU1。我们希望某个Application只运行在CPU1上,而其他所有进程都运行在CPU0上。所以我们只需要修改Init的代码,在启动它的时候,绑定CPU亲缘性到CPU0上,这样系统中所有的进程就都只会在CPU0上运行。对于那个特别的应用,比如说APP1,我们只需要为它专门指定CPU1来运行就好了。设定亲缘性的代码如下:

    剩下的问题就是把这段代码放到Init中去。一般的发行版Linux,例如CentOS, Init程序的source code是由SysVInit*生成的。*表示不同版本的SysVInit.可以用rpm -qf /sbin/init来查询即可。然后找到相应的SysVInit版本的source code,加上上述的代码,编译后替换原有的init即可。


    但是对于非发行版Linux,包括广大的嵌入式Linux系统,多采用BusyBox来代替Init。我的环境也是这样,所以就需要稍微挖掘一下BusyBox的源码,找到Init的实现。我使用的BusyBox的版本是1.00版, Init的代码位于: BusyBox-1.00/init目录下,找到init.c文件,在init_main()函数首部添加以上逻辑,编译,替换到系统中即可。


    最后可以写一个小程序检测一下CPU亲缘性绑定的效果。

    在没有Patch过Busybox的系统中,程序运行的结果如下:

    cpu 0 is set

    cpu 1 is set

    在Patch过Busybox的系统中,程序运行结果如下:

    cpu 0 is set

    cpu 1 is unset

 

    备注:

    上述方法仅对用户态程序有效,对于系统本身的内核线程来说,其CPU亲缘性并不受init进程的影响。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值