当前位置: 首页 > article >正文

Android CPU核分配关联进程

系统在应用创建或者退出时,都会进行调整分类,根据分类不同,对应可以运行的CPU核心也有所不同。在 /dev/cpuset 路径下,可以看到相关分类

:/ # cd /dev/cpuset
:/dev/cpuset # ls
audio-app              cgroup.procs          effective_cpus  mem_hardwall             memory_spread_page  release_agent             system-background
background             cgroup.sane_behavior  effective_mems  memory_migrate           memory_spread_slab  restricted                tasks
camera-daemon          cpu_exclusive         foreground      memory_pressure          mems                sched_load_balance        top-app
cgroup.clone_children  cpus                  mem_exclusive   memory_pressure_enabled  notify_on_release   sched_relax_domain_level

常见的可能就是 background  foreground  top-app ,其中top-app优先级就是最高的一类,top-app默认可以运行在所有CPU核上面。

:/dev/cpuset # cat background/cpus
0-3
:/dev/cpuset # cat system-background/cpus
0-3
:/dev/cpuset # cat foreground/cpus
0-7
:/dev/cpuset # cat top-app/cpus
0-7

默认分配如上,后台的进程只会运行在0-3(小核)上面,foreground top-app运行在0-7,由系统自行调度大小核。如果再激进点,可以只分配(echo 4-7)大核给它,无论什么情形下都执行在大核上面,对应用性能有一点提升。

write /dev/cpuset/top-app/cpus 4-7

进程归纳为什么进程可以在创建或者调整中强制更改。例如如果是系统bin文件so库服务,可以在定义中配置 writepid 如下

service media.swcodec /apex/com.android.media.swcodec/bin/mediaswcodec
    class main
    user mediacodec
    group camera drmrpc mediadrm
    ioprio rt 4
    writepid /dev/cpuset/foreground/tasks

如果是应用类型的,系统会通过 OomAdjuster.java 动态调整应用的优先级同时会改变应用的分类。可以通过包名判断,调整为TOP APP等类型。如下

   @GuardedBy({"mService", "mProcLock"})
    private boolean computeOomAdjLSP(ProcessRecord app, int cachedAdj,
            ProcessRecord topApp, boolean doingAll, long now, boolean cycleReEval,
            boolean computeClients) {
        final ProcessStateRecord state = app.mState;

        if (state.getMaxAdj() <= FOREGROUND_APP_ADJ) {
... ...

            // 强制设置为TOP APP
            if ("com.xxx.xxxxxx".equals(app.processName)) {
                state.setCurrentSchedulingGroup(SCHED_GROUP_TOP_APP);
            }
            state.setCurRawProcState(state.getCurProcState());
            state.setCurAdj(state.getMaxAdj());
            state.setCompletedAdjSeq(state.getAdjSeq());
            // if curAdj is less than prevAppAdj, then this process was promoted
            return state.getCurAdj() < prevAppAdj || state.getCurProcState() < prevProcState;
        }


http://www.kler.cn/a/401935.html

相关文章:

  • 儿童玩具安全检测GB6675标准详细介绍
  • php消息路由
  • React 远程仓库拉取项目部署,无法部署问题
  • 2021 年 9 月青少年软编等考 C 语言三级真题解析
  • 25.UE5时间膨胀,慢动作,切换地图,刷BOSS
  • 小程序-基于java+SpringBoot+Vue的小区服务管理系统设计与实现
  • Java网络编程1 - 介绍网络编程、网络编程三要素
  • STM32设计防丢防摔智能行李箱-分享
  • ReactNative的环境搭建
  • POI和easyExcel的讲解和使用
  • 最少前缀操作问题--感受不到动态规划,怎么办怎么办
  • 动态Tab导航
  • STM32G4的数模转换器(DAC)功能介绍
  • Linux-shell实例手册-服务操作
  • 基于YOLOv8深度学习的智慧农业猪行为检测系统研究与实现(PyQt5界面+数据集+训练代码)
  • SpringSecurity+jwt+captcha登录认证授权总结
  • ARM CCA机密计算安全模型之简介
  • 网络IPC:套接字汇总整理
  • 2411rust,编译时自动检查配置
  • 贴代码框架PasteForm特性介绍之select,selects,lselect和reload
  • Python入门(9)--类与对象基础
  • 30. 并发编程
  • Go 编译代码-分平台编译
  • Kubernetes配置管理ConfigMap、Secret
  • 51单片机基础01 单片机最小系统
  • freemarker 读取template.xml ,通过response 输出文件,解决中文乱码问题