1-23.【GCD】QoS 的作用是什么?它影响哪些层面?

3 阅读2分钟

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 影响的层面

  1. 任务调度层面

    • 同一个队列内任务,如果 QoS 不同,系统会倾向先执行高 QoS 任务
  2. 线程池层面

    • 高 QoS 任务可能触发创建更多线程
    • 低 QoS 任务可能共用线程池中空闲线程
  3. 能耗与性能层面

    • 系统可根据 QoS 动态调整 CPU 主频
    • 后台任务不会影响前台 UI 性能

5️⃣ 注意事项

  1. QoS 继承

    • 异步提交到队列的任务会继承提交线程的 QoS
    • 例如在 .userInitiated 队列中 dispatch async,任务默认继承队列 QoS
  2. 不保证绝对顺序

    • QoS 只影响 优先级调度,不是严格的 FIFO 顺序
  3. 合理使用

    • 不要滥用高 QoS,避免抢占低 QoS 后台任务导致能耗增加
    • 后台任务用 .background 可以节约电量

6️⃣ 总结一句话

QoS 是 GCD 用来告诉系统任务重要性和优先级的机制,影响任务调度顺序、线程池资源分配和系统能耗管理,从而在前台保证响应速度,在后台优化性能与能耗。