文章目录
Dispatch Queue
Dispatch Queue的本质是其实是添加Block并执行block
Dispatch Queue的组成
Dispatch Queue 是通过结构体和链表实现的FIFO(先进先出)队列,FIFO队列主要负责管理通过dispatch_async等函数添加的block。可以理解成在程序从上到下追加了一组的Blocks,排除延迟dispatch_after其内部过程是个FIFO的过程。
Block的添加
Block不是直接添加进FIFO对列的。Block先加入Dispatch Continuation(dispatch_continuation_t 类结构体)中,再加入FIFO中。Dispatch Continuation用于记忆Block所属的信息,即执行上下文。
Dispatch Queue执行Block的过程
在这之前要介绍一下Dispatch Queue实现的软件组件
组件名称 | 提供技术 |
---|---|
libdispatch | Dispatch Queue |
Libc(pthread) | pthread_workqueue |
XNU内核 | workqueue |
- XNU内核
1. XNU内核是Mac和iOS的核心,有三个主要部分组成的一个分层体系结构;内核XNU是Darwin的核心,也是整个OS X的核心。 - Libc
1. libc是Linux下的ANSI C的函数库。 - libdispatch
1. 包含GCD的C语言的库
通知XNU过程
Global Dispatch Queue中执行Block时,libdispatch会从FIFO中抽取出Dispatch Continuation,调用pthread_workqueue_additem_np函数,将该Global Dispatch Queue自身以及符合优先级的workqueue信息等传递给参数。
pthread_workqueue_additem_up函数使用workq_kernreturn系统调用。通知workqueue增加应当执行的项目,而XNU内核根据系统状态判断是否要生成线程。如果是OverCommit优先级的Global Dispatch Queue则始终生成线程
Global Dispatch Queue的种类(8)
- Global Dispatch Queue(High (Overcommit)Priority)
- Global Dispatch Queue(Default (Overcommit)Priority)
- Global Dispatch Queue(Low (Overcommit)Priority)
- Global Dispatch Queue(Background(Overcommit) Priority)
优先级中加入了Overcommit的会强制生成线程。
相对的XUN中也有四中优先级的workqueue
- WORKQUEUE_HIGH_PRIORITY
- WORKQUEUE_DEFAULT_PRIORITY
- WORKQUEUE_LOW_PRIORITY
- WORKQUEUE_BG_PRIORITY
执行Block过程
XNU中的workqueue的线程执行pthread_workqueue函数,调用libdispatch的回调函数,在该回调函数中执行Block。
结束
Block执行结束之后,通知Dispatch Group结束、释放Dispatch Continuation等,开始准备执行加入到Global Dispatch Queue中的下一个Block。