第三章 3.3.1 Dispatch Queue

下面主要是了解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。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Objective-C高级编程-GCD部分 Grand Central Dispatch(GCD)是异步执行任务的...
    wilsonhan阅读 406评论 0 1
  • iOS多线程实践中,常用的就是子线程执行耗时操作,然后回到主线程刷新UI。在iOS中每个进程启动后都会建立一个主线...
    jackyshan阅读 1,483评论 2 12
  • 章节目录 什么是GCD? 如何在多条路径中执行CPU命令列? 即使多线程存在很多问题(如数据竞争、死锁、线程过多消...
    DrunkenMouse阅读 883评论 1 13
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,615评论 8 265
  • GCD的API 1. Dispatch Queue Dispatch Queue分为两种 如何得到Dispatch...
    Shorebloom_59f6阅读 340评论 0 2