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;

 

四、总结

  1. 线程优先级具有继承性。
  2. Android中线程调度策略开发者只能调整nice值,即线程优先级。
  3. Android中线程优先级nice值越小,优先级越高。nice值不像Java线程优先级只能设置1~10,Android线程优先级可以设置负数。
  4. Android线程调度策略还采用了严格的群组调度策略,保证Android在多线程环境下,前台线程有足够的CPU时间。
  5. Android中,开发只能修改线程的优先级nice值。
posted @ 2021-12-14 11:21  naray  阅读(615)  评论(0编辑  收藏  举报