马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
Thread优先级设置方式:
java:
- Process.setThreadPriority: android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_LOWEST、Process.THREAD_PRIORITY_URGENT_AUDIO、-20)
复制代码 c++:
- #include <sched.h>
- setpriority(
- 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企服之家,中国第一个企服评测及商务社交产业平台。 |