关于android进程调度,线程调度的使用总结
一 java层的调用流程
上层关于调度主要用到的接口(ams,pms,SchedulingPolicyService等):
setThreadScheduler
setThreadGroupAndCpuset
setThreadGroup
setProcessGroup
setProcessFrozen
调用到native对应的实现:
android_os_Process_setProcessGroup//设置内部所有线程的sched
android_os_Process_setThreadGroup//设置线程的sched
android_os_Process_setThreadGroupAndCpuset
android_os_Process_setThreadGroupAndCpuset//设置单个线程的cpuset
调用到libprocessgroup库 对应的接口:SetTaskProfiles
这里分别对应的是修改 sche:调度策略系统 和 cpuset:资源分配系统
即调用AddTidToCgroup将线程号写到对应的fd里面去
setProcessFrozen 对应的是freezer子系统 就是直接调用AddTidToCgroup将线程号写到对应的fd里面去
io相关的一个没有,这里有欠缺,可考虑增加对于的子系统的支持
二 native层的调用流程
native往往直接用set_sched_policy,set_cpuset_policy ->SetTaskProfiles来设置(surfaceflinger,audiotrack等等)
三 两个系统的说明
sched系统是一种调度策略:一个是按优先级划分不同等级的规则算法
cpuset是一个cgroup子系统:一个资源限制或隔离系统,一个是按文件夹方式隔离,分配cpu和内存,io等资源。
setThreadScheduler和 另一个接口:setThreadPriority功能比较相似, setThreadScheduler主要是用来调整几个调度策略的等级(实时与非实时的调整),不同等级对应不同区间的nice值
setThreadPriority 主要是调整 普通线程的nice值
具体的两个系统划分等级:
* cpuset profile array for:
* 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)
* sched profile array for:
* 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)