Android 线程调度
一、线程调度方案
- 线程优先级nice值。
- cgroup线程分组策略。
二、线程优先级nice值
-
- nice值是在Process类中定义的。
- nice值越小,优先级越高。
- THREAD_PRIORITY_DEFAULT = 0。
- 线程优先级具有继承性。
Android中UI线程的优先级是TTHREAD_PRIORITY_DEFAULT=0,在Android中线程还有哪些优先级:
public static final int THREAD_PRIORITY_LOWEST = 19; /** * Standard priority background threads. This gives your thread a slightly * lower than normal priority, so that it will have less chance of impacting * the responsiveness of the user interface. * Use with {@link #setThreadPriority(int)} and * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal * {@link java.lang.Thread} class. */ public static final int THREAD_PRIORITY_BACKGROUND = 10; /** * Standard priority of threads that are currently running a user interface * that the user is interacting with. Applications can not normally * change to this priority; the system will automatically adjust your * application threads as the user moves through the UI. * Use with {@link #setThreadPriority(int)} and * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal * {@link java.lang.Thread} class. */ public static final int THREAD_PRIORITY_FOREGROUND = -2; /** * Standard priority of system display threads, involved in updating * the user interface. Applications can not * normally change to this priority. * Use with {@link #setThreadPriority(int)} and * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal * {@link java.lang.Thread} class. */ public static final int THREAD_PRIORITY_DISPLAY = -4; /** * Standard priority of the most important display threads, for compositing * the screen and retrieving input events. Applications can not normally * change to this priority. * Use with {@link #setThreadPriority(int)} and * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal * {@link java.lang.Thread} class. */ public static final int THREAD_PRIORITY_URGENT_DISPLAY = -8; /** * Standard priority of video threads. Applications can not normally * change to this priority. * Use with {@link #setThreadPriority(int)} and * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal * {@link java.lang.Thread} class. */ public static final int THREAD_PRIORITY_VIDEO = -10; /** * Standard priority of audio threads. Applications can not normally * change to this priority. * Use with {@link #setThreadPriority(int)} and * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal * {@link java.lang.Thread} class. */ public static final int THREAD_PRIORITY_AUDIO = -16; /** * Standard priority of the most important audio threads. * Applications can not normally change to this priority. * Use with {@link #setThreadPriority(int)} and * {@link #setThreadPriority(int, int)}, <b>not</b> with the normal * {@link java.lang.Thread} class. */ public static final int THREAD_PRIORITY_URGENT_AUDIO = -19; /** * Minimum increment to make a priority more favorable. */ public static final int THREAD_PRIORITY_MORE_FAVORABLE = -1; /** * Minimum increment to make a priority less favorable. */ public static final int THREAD_PRIORITY_LESS_FAVORABLE = +1;
三、CGroup
即使,线程使用nice值优先级策略,在多线程环境下,后台线程线程的CPU占用时间总和,可能比前台线程占用CPU时间多。所以,Android除了线程优先级策略,还有CGroup,严格模式的线程群组策略。
-
- CGroup采用严格的群组调度策略。
- 群组策略保证Android前台线程能够获得跟多的CPU时间。
Android中定义哪些线程群组:
/** * Default thread group - * has meaning with setProcessGroup() only, cannot be used with setThreadGroup(). * When used with setProcessGroup(), the group of each thread in the process * is conditionally changed based on that thread's current priority, as follows: * threads with priority numerically less than THREAD_PRIORITY_BACKGROUND * are moved to foreground thread group. All other threads are left unchanged. * @hide */ public static final int THREAD_GROUP_DEFAULT = -1; /** * Background thread group - All threads in * this group are scheduled with a reduced share of the CPU. * Value is same as constant SP_BACKGROUND of enum SchedPolicy. * @hide */ public static final int THREAD_GROUP_BACKGROUND = 0; /** * Foreground thread group - All threads in * this group are scheduled with a normal share of the CPU. * Value is same as constant SP_FOREGROUND of enum SchedPolicy. * Not used at this level. * @hide **/ private static final int THREAD_GROUP_FOREGROUND = 1; /** * System thread group. * @hide **/ public static final int THREAD_GROUP_SYSTEM = 2; /** * Application audio thread group. * @hide **/ public static final int THREAD_GROUP_AUDIO_APP = 3; /** * System audio thread group. * @hide **/ public static final int THREAD_GROUP_AUDIO_SYS = 4; /** * Thread group for top foreground app. * @hide **/ public static final int THREAD_GROUP_TOP_APP = 5; /** * Thread group for RT app. * @hide **/ public static final int THREAD_GROUP_RT_APP = 6; /** * Thread group for bound foreground services that should * have additional CPU restrictions during screen off * @hide **/ public static final int THREAD_GROUP_RESTRICTED = 7;
四、总结
- 线程优先级具有继承性。
- Android中线程调度策略开发者只能调整nice值,即线程优先级。
- Android中线程优先级nice值越小,优先级越高。nice值不像Java线程优先级只能设置1~10,Android线程优先级可以设置负数。
- Android线程调度策略还采用了严格的群组调度策略,保证Android在多线程环境下,前台线程有足够的CPU时间。
- Android中,开发只能修改线程的优先级nice值。