下面主要是了解Dispatch Queue的实现。
应用程序编写的线程管理用的代码要在系统级实现。
用于实现Dispatch Queue而使用的软件组件:
组件名称 提供技术
libdispatch Dispatch Queue
Libc(pthreads) pthread_workqueue
XNU内核 workqueue
GCD的API全部为包含在libdispatch库中的C语言函数。
Dispatch Queue通过结构体和链表,被实现为FIFO队列。
FIFO队列管理是通过dispatch_async等函数所追加的Block。
Block不是直接加入FIFO队列,是先加入Dispatch Continuation这一dispatch_continuation_t类型结构体中,在加入FIFO队列。
Dispatch Continuation用于记忆Block所属的Dispatch Group和其他一些信息,相当于一般常说的执行上下文。
Main Dispatch Queue在RunLoop中执行Block。
Global Dispatch Queue有8种:
Global Dispatch Queue (High priority)
Global Dispatch Queue (Default priority)
Global Dispatch Queue (Low priority)
Global Dispatch Queue (Background priority)
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的Global Dispatch Queue使用在Serial Dispatch Queue中,不管系统整体如何,都会强制生成线程。
8中Global Dispatch Queue各使用1个pthread_workqueue。
使用pthread_workqueue_create_up函数生成pthread_workqueue。
pthread_workqueue包含在Libc提供的pthreads API中。其使用bsdthread_register和workq_open系统调用,在初始化XNU内核的workqueue之后获取workqueue信息。
XNU 内核有 4 种 workqueue:
WORKQUEUE_HIGH_PRIOQUEUE
WORKQUEUE_DEFAULT_PRIOQUEUE
WORKQUEUE_LOW_PRIOQUEUE
WORKQUEUE_BG_PRIOQUEUE
以上为4种执行优先级的workqueue,该优先级与Global Dispatch Queue的4种执行优先级相同。
Dispatch Queue 中执行 Block 的过程?
1、当在 Global Dispatch Queue 中执行Block时,libdispatch 从 Global Dispatch Queue 自身的 FIFO 队列取出 Dispatch Continuation,调用pthread_workqueue_additem_np 函数。
2、将该 Global Dispatch Queue 本身、符合其优先级的 workqueue 信息以及执行Dispatch Continuation的回调函数等传递给参数。
具体细节:
pthread_workqueue_additem_np 函数使用 workq_kernreturn 系统调用,通知 workqueue 增加应当执行的项目。根据该通知,XNU内核基于系统状态判断是否要生成线程。如果是 Overcommit 优先级的 Global Dispatch Queue ,workqueue 则始终生成线程。
因为 workqueue 生成的线程在实现用于 workqueue 的线程计划表中运行,他的上下文切换(shift context)与普通的线程有很大的不同。
workqueue 的线程执行 pthread_workqueue 函数,该函数调用libdispatch 的回调函数。在该回调函数中执行加入到Dispatch Continuation的Block。
Block执行结束后,进行通知Dispatch Group结束、释放Dispatch Continuation等处理,开始准备执行加入到 Global Dispatch Queue中 的下一个Block。