QoS(Quality of Service,服务质量)是 GCD 中用来 指示任务重要性和优先级 的机制,它不仅影响任务调度的优先级,还影响系统资源分配。下面详细解析。
1️⃣ QoS 的核心作用
QoS 用于告诉系统“这个任务有多重要”,GCD 根据 QoS 决定调度优先级、线程分配、CPU/IO 资源等,从而优化性能和响应时间。
- 提供 系统级优先级指导
- 优化 CPU、IO、能耗和响应时间
- 与传统的
DispatchPriority不同,QoS 是现代 iOS/macOS 统一调度策略
2️⃣ QoS 对调度的影响
2.1 调度优先级
- QoS 决定 GCD 任务在调度队列中的执行顺序
- 高 QoS → 优先分配线程 → 先执行
- 低 QoS → 系统尽量延迟执行,不抢占高 QoS 任务
2.2 线程管理
-
GCD 根据 QoS 调整 全局线程池中的线程数量和优先级
-
高 QoS 任务可能:
- 分配更多线程
- 占用 CPU 核心优先
-
低 QoS 任务可能:
- 在空闲线程执行
- 延迟 CPU 调度
2.3 系统资源和电量管理
-
QoS 还影响系统对能耗和资源的调节:
.userInteractive→ 响应 UI,保证高性能.background→ 低能耗,可能 CPU 限频
-
这让系统可以在后台低耗运行任务,而前台任务保持流畅
3️⃣ GCD 提供的 QoS 类别
| QoS 类型 | 优先级 | 典型用途 |
|---|---|---|
.userInteractive | 最高 | UI 渲染、动画、事件响应 |
.userInitiated | 高 | 用户触发任务,需快速完成 |
.default | 中 | 系统默认任务 |
.utility | 中低 | 长耗时任务,下载、计算、文件处理 |
.background | 最低 | 后台维护任务、备份、日志 |
.unspecified | 不定 | 不关心优先级的任务 |
4️⃣ QoS 影响的层面
-
任务调度层面
- 同一个队列内任务,如果 QoS 不同,系统会倾向先执行高 QoS 任务
-
线程池层面
- 高 QoS 任务可能触发创建更多线程
- 低 QoS 任务可能共用线程池中空闲线程
-
能耗与性能层面
- 系统可根据 QoS 动态调整 CPU 主频
- 后台任务不会影响前台 UI 性能
5️⃣ 注意事项
-
QoS 继承
- 异步提交到队列的任务会继承提交线程的 QoS
- 例如在
.userInitiated队列中 dispatch async,任务默认继承队列 QoS
-
不保证绝对顺序
- QoS 只影响 优先级调度,不是严格的 FIFO 顺序
-
合理使用
- 不要滥用高 QoS,避免抢占低 QoS 后台任务导致能耗增加
- 后台任务用
.background可以节约电量
6️⃣ 总结一句话
QoS 是 GCD 用来告诉系统任务重要性和优先级的机制,影响任务调度顺序、线程池资源分配和系统能耗管理,从而在前台保证响应速度,在后台优化性能与能耗。