主要观点:
- 多数编写在 macOS 机器上运行代码的人对操作系统及其独特功能和粗糙边缘不熟悉,此文针对此类程序员。
- 苹果将“语义标签”(服务质量类,QoS 类)分配给工作以优化能耗,有五个 QoS 类,从高到低分别为 User Interactive、User Initiated、Default、Utility、Background,在系统中应用广泛。
- 线程优先级存在风险,苹果平台有机制可通过特定同步原语解决优先级反转问题,如
pthread_mutex
、os_unfair_lock
、Dispatch 队列和工作循环、Mach 消息等,应避免使用读写锁等不可参与 QoS 继承的锁。 - 新建线程默认 QoS 类为 Default,应根据工作重要性为线程分配 QoS 类,对于像数据库类的线程,可使用 Dispatch 库创建工作循环来处理优先级问题,苹果框架常假设使用 Dispatch,应广泛使用它。
关键信息:
- 苹果处理器功耗动态范围大,确定代码在功耗尺度上的位置很重要。
- 不同 QoS 类的工作特点及应用场景,如 User Interactive 工作被抢占会导致应用界面卡顿等。
- 线程优先级相关风险及解决办法,如使用特定同步原语可避免优先级反转。
- 新建线程默认 QoS 类及如何为线程分配合适 QoS 类,Dispatch 库的优势及应用。
重要细节:
- 苹果在系统各方面广泛应用 QoS 类,如 CPU 调度、I/O 节流等,Background QoS 工作在 iOS 低功耗模式下会暂停等。
- 优先使用
os_unfair_lock
,避免使用读写锁等,Dispatch 可创建工作循环和队列,处理优先级问题更方便,苹果框架常假设使用 Dispatch。 - 存在第六个鲜为人知的 QoS 类 Maintenance,可通过 XPC 活动访问,但未测试。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。