场景介绍
自多道程序及多任务操作系统问世以来,CPU、内存等有限的系统资源成为系统中所有任务的竞争对象。合理安排各个任务对系统的响应速度以及资源消耗都有非常重大的意义。相比操作系统,开发者更加清楚应用中各个任务的重要程度;根据重要程度对应用的任务进行分类,能帮助系统更好地进行任务的调度。通过本指导,开发者可以了解在HarmonyOS系统中,如何利用QoS特性及相关的接口调节任务在系统中的运行时间分配。
本文用于指导开发者基于QoS特性实现应用任务优先调度属性自定义。
基本概念
QoS
QoS(quality-of-service),即服务质量,在HarmonyOS中QoS特性主要指任务的优先调度属性。开发者可以利用QoS对要执行的工作进行分类,以指示其与用户交互的关联程度;系统则可以根据任务设置的QoS安排各任务的运行时间和运行次序
。例如,当系统中有多个任务需要同时执行时,一些与用户交互关联程度不高的后台下载任务可以推迟到更晚的时间执行,且每次执行时分配更少的时间;而用户感知明显的动效绘制等任务则需要立即执行,并分配更多的执行时间。
QoS等级定义
目前,HarmonyOS系统一共划分如下了6个QoS等级,从上到下与用户交互的关联程度依次递增,适用于多种不同的应用场景及负载特征情况。
QoS等级 | 使用场景 | 负载特征 |
---|---|---|
QOS_BACKGROUND | 后台且用户不可见任务,例如数据同步、备份。 | 任务完成需要几分钟甚至几小时。 |
QOS_UTILITY | 不需要立即看到响应效果的任务,例如下载或导入数据。 | 任务完成需要几秒到几分钟 |
QOS_DEFAULT | 默认。 | 任务完成需要几秒钟。 |
QOS_USER_INITIATED | 用户触发并且可见进展的任务,例如打开文档。 | 任务在几秒钟之内完成。 |
QOS_DEADLINE_REQUEST | 越快越好的关键任务,如页面加载。 | 任务几乎是瞬间完成的。 |
QOS_USER_INTERACTIVE | 用户交互任务(UI线程、刷新界面、动效)。 | 任务是即时的。 |
QoS等级定义为枚举类型QoS_level,如上表所示;枚举值定义如下。
QoS_Level声明
typedef enum QoS_Level {
/**
* 适用于数据同步等用户不可见的后台任务。
*/
QOS_BACKGROUND,
/**
* 适用于下载等不需要立即看到响应效果的任务。
*/
QOS_UTILITY,
/**
* 默认的QoS等级。
*/
QOS_DEFAULT,
/**
* 适用于打开文档等用户触发并且可以看到进展的任务。
*/
QOS_USER_INITIATED,
/**
* 适用于页面加载等越快越好的任务。
*/
QOS_DEADLINE_REQUEST,
/**
* 适用于动效绘制等用户交互任务。
*/
QOS_USER_INTERACTIVE,
} QoS_Level;
功能效果
QoS等级更高的任务相对等级更低的可能被分配更多的CPU时间。
下面将展示合理使用QoS对程序执行的优化效果。
QoS对线程执行的优化
优化前
线程1和线程2是某程序的两个关键线程,线程1在运行时会触发新任务线程2,等线程2执行完后会唤醒线程1继续执行。在未标记这两个线程的QoS等级之前,其优先执行顺序低于线程3和线程4;此时线程1和线程2的执行效果如上图所示:
-
线程1等待被线程2唤醒,而线程2优先级低,长时间被抢占,导致线程1长时间睡眠;
-
线程1优先级低,它被唤醒后等待运行时间长;
-
线程1优先级低,运行过程中长时间被其它线程抢占。
优化后
合理标记线程1和线程2的QoS等级后,两个线程的执行优化效果如上图所示:
- 线程2运行时间占比提高,线程1等待时间减少;
- 线程1被线程2唤醒后,等待的时间减少;
- 线程1运行实际占比提高,被抢占比例减少。
QoS对RN框架的优化
在RN框架中合理标记关键线程的QoS等级后,如下表所示,开源benchmark测试的性能提升了约13%。
验证场景 | 验证环境 | Hermes引擎段时间 | RN Common时间 | RN框架+ArkUI原生渲染共有指令执行时间 | 原生渲染段时间 | 总计 |
---|---|---|---|---|---|---|
benchmark 1500view | 无QoS优化 | 173.1 ms | 24.3 ms | 33.1 ms | 4.03 ms | 270.8 ms |
benchmark 1500view | 使用QoS优化 | 144.8 ms | 23.4 ms | 33.7 ms | 34.8 ms | 236.6 ms |
接口说明
接口名 | 描述 | 参数 | 返回值 |
---|---|---|---|
OH_QoS_SetThreadQoS(QoS_Level level) | 设置当前任务的QoS等级。 | QoS_Level level | 0或-1 |
OH_QoS_ResetThreadQoS() | 取消当前任务设置的QoS等级。 | 无 | 0或-1 |
OH_QoS_GetThreadQoS(QoS_Level *level) | 获取当前任务的QoS等级。 | QoS_Level *level | 0或-1 |
使用限制
- QoS接口只能设置本任务的QoS等级。
函数介绍
OH_QoS_SetThreadQoS
声明
int OH_QoS_SetThreadQoS(QoS_Level level);
参数
QoS_Level level
- 该参数用于描述要为任务设置的QoS等级。
返回值
- 若成功则返回0,失败则返回-1。
描述
为某个任务设置指定的QoS等级。
样例
#include <stdio.h>
#include "qos/qos.h"
int main()
{
// 设置当前任务的QoS等级为QOS_USER_INITIATED
int ret = OH_QoS_SetThreadQoS(QoS_Level::QOS_USER_INITIATED);
if (!ret) { // ret等于0说明设置成功
printf("set QoS Success.");
} else { // ret不等于0说明设置失败
printf("set QoS failed.");
}
return 0;
}
OH_QoS_ResetThreadQoS
声明
int OH_QoS_ResetThreadQoS();
参数
- 无。
返回值
- 若成功则返回0,失败则返回-1。
描述
取消某个任务设置的QoS等级。
样例
#include <stdio.h>
#include "qos/qos.h"
int main()
{
// 重置当前任务的QoS等级
int ret = OH_QoS_ResetThreadQoS();
if (!ret) { // ret等于0说明重置成功
printf("reset QoS Success.");
} else { // ret不等于0说明重置失败
printf("reset QoS failed.");
}
return 0;
}
OH_QoS_GetThreadQoS
声明
int OH_QoS_GetThreadQoS(QoS_Level *level);
参数
QoS_Level *level
- 该参数用于存储任务已经设置的QoS等级。
返回值
- 若成功则返回0,失败则返回-1。
描述
获取某个任务之前最近一次设置的QoS等级;如果之前未设置任何QoS等级,则返回-1。
样例
#include <stdio.h>
#include "qos/qos.h"
int main()
{
// 获取当前任务的QoS等级
QoS_Level level = QoS_Level::QOS_DEFAULT;
int ret = OH_QoS_GetThreadQoS(&level);
if (!ret) { // ret等于0说明获取成功
printf("get QoS level %d Success.", level);
} else { // ret不等于0说明获取失败
printf("get QoS level failed.");
}
return 0;
}
开发步骤
以下步骤描述了如何使用QoS特性提供的Native API接口,调整或查询任务的QoS等级。
添加动态链接库
CMakeLists.txt中添加以下lib:
libqos.so
示例
# the minimum version of CMake.
cmake_minimum_required(VERSION 3.4.1)
project(qos)
set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})
include_directories(${NATIVERENDER_ROOT_PATH}
${NATIVERENDER_ROOT_PATH}/include)
add_library(entry SHARED hello.cpp)
target_link_libraries(entry PUBLIC libqos.so)
头文件
#include "qos/qos.h"
调用QoS接口
开发者根据自身需求调用相应的QoS接口调整任务的QoS等级,或者查询任务的QoS等级。
鸿蒙全栈开发全新学习指南
之前总有很多小伙伴向我反馈说,不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以这里为大家准备了一份实用的鸿蒙(HarmonyOS NEXT)学习路线与学习文档用来跟着学习是非常有必要的。
针对一些列因素,整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、WebGL、元服务、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植等等)鸿蒙(HarmonyOS NEXT)技术知识点。
本路线共分为四个阶段:
第一阶段:鸿蒙初中级开发必备技能
第二阶段:鸿蒙南北双向高工技能基础:gitee.com/MNxiaona/733GH
第三阶段:应用开发中高级就业技术
第四阶段:全网首发-工业级南向设备开发就业技术:gitee.com/MNxiaona/733GH
《鸿蒙 (Harmony OS)开发学习手册》(共计892页)
如何快速入门?
1.基本概念
2.构建第一个ArkTS应用
3.……
开发基础知识:gitee.com/MNxiaona/733GH
1.应用基础知识
2.配置文件
3.应用数据管理
4.应用安全管理
5.应用隐私保护
6.三方应用调用管控机制
7.资源分类与访问
8.学习ArkTS语言
9.……
基于ArkTS 开发
1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.……
鸿蒙开发面试真题(含参考答案):gitee.com/MNxiaona/733GH
鸿蒙入门教学视频:
美团APP实战开发教学:gitee.com/MNxiaona/733GH
写在最后
- 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
- 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
- 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
- 想要获取更多完整鸿蒙最新学习资源,请移步前往小编:
gitee.com/MNxiaona/733GH