android系统资源调度分析

一 哪些资源可以调度


   cpu,mem,io,gpu
   在此之上linux又虚拟出了 cgroup子系统,这里列举常用的分类
   blkio 管理io输入输出限制的
   cpuset 控制cpu核的分配
   freezer 控制进程挂起
   memory 内存限制
   stune 控制cpu频率
   目前还没有gpu的控制方案
   android中还加如了timeslack,控制唤醒定时器间隔的值
   
   对应的android系统的实现在libprocessgroup.so里面
   大致流程:读取配置文件cgoup.xml创建好各个子节点,也可以在.rc文件创建
   on init
    mkdir /dev/cpuset/test
    chown system system /dev/cpuset/test
    chmod 0664 /dev/cpuset/test
    
    然后创建好节点后,开始读取taskprofile.json文件
    然后把里面读取的profile(也就是对应的是哪个子节点及其值)也配置好,然后上层调用
    这些profile时候将对应的线程号写入对应的子节点里面即可
    
    上层调用的地方主要是ams里面 processlist.java, processrecord.java,oomAdjuste.java
    这些地方使用。最后都会调用libprocessgroup.so里面的set_sched_policy方法


    二那么如何扩展这些功能呢

android系统资源调度分析


    1 cgroup 扩展节点 /dev/cpuset/highcpu
      里面全部是大核0-3
    2 cgroup 扩展节点 /dev/stune/fast 就是将频率直接跳到最高
     这两个调整主要是应对cpu不足的情况下,这样cpu核频率都是最佳
        
    3 增加两个profile 到task_profile.json
          {
      "Name": "bestCapacitycpuset",
      "Actions": [
        {
          "Name": "JoinCgroup",
          "Params":
          {
            "Controller": "highcpu",
            "Path": "/cpuset/highcpu"
          }
        }
      ]
    }
    "Name": "bestCapacitystoune",
      "Actions": [
        {
          "Name": "JoinCgroup",
          "Params":
          {
            "Controller": "highcpu",
            "Path": "/cpuset/highcpu"
          }
        }
      ]
    }
    
    
    增加一个 AggregateProfiles选项
    
    {
       "Name": "SCHED_SP_best",
       "Profiles": [ "bestCapacitycpuset","bestCapacitystoune", "LowIoPriority", "TimerSlackHigh" ]
     },
   
   4 代码中增加接口使用
   
   // system/core/libprocessgroup/include/processgroup/sched_policy.h
typedef enum {
    SP_DEFAULT = -1,
    SP_BACKGROUND = 0,
    SP_FOREGROUND = 1,
    SP_SYSTEM = 2, 
    SP_AUDIO_APP = 3,
    SP_AUDIO_SYS = 4,
    SP_TOP_APP = 5,
    SP_RT_APP = 6,
    SP_RESTRICTED = 7,
    SP_BEST = 8,
// system/core/libprocessgroup/sched_policy.cpp
int set_cpuset_policy(int tid, SchedPolicy policy) {
    if (tid == 0) {
        tid = GetThreadId();
    }
    policy = _policy(policy);
 
    switch (policy) {
        case SP_BACKGROUND:
            return SetTaskProfiles(tid,
                                   {"HighEnergySaving", "ProcessCapacityLow", "LowIoPriority",
                                    "TimerSlackHigh"},
                                   true)
                           ? 0
                           : -1;
        
        case SP_BEST:
            return SetTaskProfiles(tid, {"bestCapacitycpuset","bestCapacitystoune", "LowIoPriority", "TimerSlackHigh"}, true) ? 0 : -1;
        default:
            break;
   
   5 上层ams模块增加对应的使用接口
   
// frameworks/base/services/core/java/com/android/server/am/ProcessRecord.java
    void setCurrentSchedulingGroup(int curSchedGroup) {//这里传入上次定义的值 8 即可
        if (mTestApp && curSchedGroup < ProcessList.SCHED_GROUP_TOP_APP)
            curSchedGroup = ProcessList.SCHED_GROUP_TEST_APP;
        mCurSchedGroup = curSchedGroup;
        mWindowProcessController.setCurrentSchedulingGroup(curSchedGroup);
    }
// frameworks/base/services/core/java/com/android/server/am/OomAdjuster.java
    private final boolean applyOomAdjLocked(ProcessRecord app, boolean doingAll, long now,
            long nowElapsed) {
        final int curSchedGroup = app.getCurrentSchedulingGroup();
                int processGroup;
                switch (curSchedGroup) {
                    case ProcessList.SCHED_GROUP_BACKGROUND:
                        processGroup = THREAD_GROUP_BG_NONINTERACTIVE;
                        break;
                    case 8:
                        processGroup = 8;
                        break;
                    default:
                        processGroup = THREAD_GROUP_DEFAULT;
                        break;
                }
                mProcessGroupHandler.sendMessage(mProcessGroupHandler.obtainMessage(
                        0 /* unused */, app.pid, processGroup));
    }

    也可以在ams里面直接调用这个接口传入8 使用这个这个超级组来加快传进来的进程或线程。

 
三 结束

未经验证,仅供参考,感觉这个添加流程,比我上次看同事添加的流程要顺畅很多    ,有空了更新下我的验证结果    

版权声明:如无特殊标注,文章均来自网络,本站编辑整理,转载时请以链接形式注明文章出处,请自行分辨。

本文链接:https://www.shbk5.com/dnsj/72792.html