Android Thread优先级和调度算法

打印 上一主题 下一主题

主题 1005|帖子 1005|积分 3015

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Thread优先级设置方式:

java:
  1. Process.setThreadPriority: android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_LOWEST、Process.THREAD_PRIORITY_URGENT_AUDIO、-20)
复制代码
c++:
  1. #include <sched.h>
  2. setpriority(
  3. https://blog.csdn.net/yangming2466/article/details/83280643
复制代码
Linux历程优先级系统——设置实时历程优先级_schedule里面priority 0-CSDN博客
Thread优先级原理(Android)

priority和nice关系:PR(NI+20):将nice级别显示为映射到更大优先级队列,-20映射到0,+19映射到39



  • main,renderthread 在app启动过程修改优先级源码:
if (curSchedGroup == ProcessList.SCHED_GROUP_TOP_APP) { // do nothing if we already switched to RT if (oldSchedGroup != ProcessList.SCHED_GROUP_TOP_APP)
{ app.getWindowProcessController().onTopProcChanged();
if (mService.mUseFifoUiScheduling) { // Switch UI pipeline for app to     

SCHED_FIFO
state.setSavedPriority(Process.getThreadPriority(app.getPid()));      mService.scheduleAsFifoPriority(app.getPid(), true);
if (renderThreadTid != 0) {
    mService.scheduleAsFifoPriority(renderThreadTid, /* suppressLogs */true);      if (DEBUG_OOM_ADJ) { Slog.d("UI_FIFO", "Set RenderThread (TID " + renderThreadTid + ") to FIFO"); } } else {
    if (DEBUG_OOM_ADJ) { Slog.d("UI_FIFO", "Not setting RenderThread TID"); } } } else { // Boost priority for top app UI and render threads setThreadPriority(app.getPid(), THREAD_PRIORITY_TOP_APP_BOOST);
if (renderThreadTid != 0) { try {
setThreadPriority(renderThreadTid, THREAD_PRIORITY_TOP_APP_BOOST);
} catch (IllegalArgumentException e) { // thread died, ignore } } } } }

恢复:
else if (oldSchedGroup == ProcessList.SCHED_GROUP_TOP_APP && curSchedGroup != ProcessList.SCHED_GROUP_TOP_APP) { app.getWindowProcessController().onTopProcChanged();
if (mService.mUseFifoUiScheduling) {
try {// Reset UI pipeline to SCHED_OTHER
   setThreadScheduler(app.getPid(), SCHED_OTHER, 0);       setThreadPriority(app.getPid(), state.getSavedPriority());
if (renderThreadTid != 0) {
  setThreadScheduler(renderThreadTid, SCHED_OTHER, 0);
} } catch (IllegalArgumentException e) {
  Slog.w(TAG, "Failed to set scheduling policy, thread does not exist:\n" + e);
} catch (SecurityException e) {
  Slog.w(TAG, "Failed to set scheduling policy, not allowed:\n" + e); } } else { // Reset priority for top app UI and render threads                setThreadPriority(app.getPid(), 0);
} if (renderThreadTid != 0) {
  setThreadPriority(renderThreadTid, THREAD_PRIORITY_DISPLAY);
}


  • 可控制不继承设置线程优先级:android.os.Process.setCanSelfBackground(false 作用是不让反面再有线程将优先级设置为background-level的举动,如有设置则直接抛出非常)
Scheduler 调度

调度算法分3大类:
SCHED_OTHER 默认调度计谋线程优先级100~120
SCHED_FIFO 线程优先级11~99
SCHED_RR
此中 RR+FIFO 是实时线程优先级,它们之间的区别是RR在相同优先级的线程之间会公平轮询,FIFO会独占CPU直到阻塞为止
修改方法:
Process.setThreadScheduler(tid, Process.SCHED_FIFO,1)
Process.setThreadScheduler(tid, Process.SCHED_RR | Process.SCHED_RESET_ON_FORK
说明:
不加Process.SCHED_RESET_ON_FORK,Process所有线程会被设置成RR
加上Process.SCHED_RESET_ON_FORK,指定线程会被设置成RR
Android的schedule包含4个cgroups:foreground,background,top-app,rt
线程绑定焦点实现方案:
Process.setThreadGroupAndCpuset(renderThreadTid, 8)
Android中cpuset包含5个cgroups:foreground,background,system-background,restricted,top-app

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

花瓣小跑

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表