android系统资源调度分析

server/2024/10/24 2:55:42/

一 哪些资源可以调度


   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方法


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


    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 使用这个这个超级组来加快传进来的进程或线程。

 
三 结束

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


http://www.ppmy.cn/server/134328.html

相关文章

2023年五一杯数学建模C题双碳目标下低碳建筑研究求解全过程论文及程序

2023年五一杯数学建模 C题 双碳目标下低碳建筑研究 原题再现&#xff1a; “双碳”即碳达峰与碳中和的简称&#xff0c;我国力争2030年前实现碳达峰&#xff0c;2060年前实现碳中和。“双碳”战略倡导绿色、环保、低碳的生活方式。我国加快降低碳排放步伐&#xff0c;大力推进…

【HTML】构建网页的基石

我的主页&#xff1a;2的n次方_ HTML 是一种超文本标记语言&#xff0c;不仅有文本&#xff0c;还能包含图片&#xff0c;音频等 1. HTML 的文件基本结构 html 标签是整个 html 文件的最顶层标签&#xff0c;head 标签中写页面的属性&#xff0c;body 标签是页面中显示的…

搜维尔科技:感受、握持、推动、连接和挤压虚拟物体,SenseGlove触觉反馈手套拥有先进的触觉技术、一流的可用性和功能

感受、握持、推动、连接和挤压虚拟物体&#xff0c;SenseGlove触觉反馈手套拥有先进的触觉技术、一流的可用性和功能 感受、握持、推动、连接和挤压虚拟物体&#xff0c;SenseGlove触觉反馈手套拥有先进的触觉技术、一流的可用性和功能

Spring Boot + Vue 前后端分离项目总结:解决 CORS 和 404 问题

Spring Boot Vue 前后端分离项目总结&#xff1a;解决 CORS 和 404 问题 在进行前后端分离的项目开发中&#xff0c;我们遇到了几个关键问题&#xff1a;跨域问题 (CORS) 和 404 路由匹配错误。以下是这些问题的详细分析和最终的解决方案。 问题描述 跨域请求被阻止 (CORS) 当…

SpringBoot中的RedisTemplate对象中的setIfAbsent()方法有什么作用?

文章目录 原子性操作用于分布式锁可选的过期时间 setIfAbsent() 方法是 Redis 中用于设置一个键值对的命令&#xff0c;只有在该键不存在时才会设置成功。它通常用于实现分布式锁的逻辑 主要功能: 原子性操作 setIfAbsent() 是一个原子性操作&#xff0c;意味着在执行该操作的…

Golang | Leetcode Golang题解之第500题键盘行

题目&#xff1a; 题解&#xff1a; func findWords(words []string) (ans []string) {const rowIdx "12210111011122000010020202" next:for _, word : range words {idx : rowIdx[unicode.ToLower(rune(word[0]))-a]for _, ch : range word[1:] {if rowIdx[unico…

张雪峰:如果你现在是计算机专业,一定要优先报网络安全,它是未来国家发展的大方向

&#x1f91f; 基于入门网络安全/黑客打造的&#xff1a;&#x1f449;黑客&网络安全入门&进阶学习资源包 前言 “计算机专业 一定要优先报 网络安全 它是未来国家发展的大方向” 为什么推荐学网络安全&#xff1f; “没有网络安全就没有国家安全。”当前&#xff…

全面了解 NGINX 的负载均衡算法

NGINX 提供多种负载均衡方法&#xff0c;以应对不同的流量分发需求。常用的算法包括&#xff1a;最少连接、最短时间、通用哈希、随机算法和 IP 哈希。这些负载均衡算法都通过独立指令来定义&#xff0c;每种算法都有其独特的应用场景。 以下负载均衡方法&#xff08;IP 哈希除…