一 哪些资源可以调度
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 使用这个这个超级组来加快传进来的进程或线程。
三 结束
未经验证,仅供参考,感觉这个添加流程,比我上次看同事添加的流程要顺畅很多 ,有空了更新下我的验证结果