天天看点

iOS中Dispatch Queue的实现Dispatch Queue

文章目录

  • Dispatch Queue
    • Dispatch Queue的组成
      • Block的添加
    • Dispatch Queue执行Block的过程
      • 通知XNU过程
        • Global Dispatch Queue的种类(8)
      • 执行Block过程
      • 结束

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所属的信息,即执行上下文。

iOS中Dispatch Queue的实现Dispatch Queue

Dispatch Queue执行Block的过程

在这之前要介绍一下Dispatch Queue实现的软件组件

组件名称 提供技术
libdispatch Dispatch Queue
Libc(pthread) pthread_workqueue
XNU内核 workqueue
  1. XNU内核

    1. XNU内核是Mac和iOS的核心,有三个主要部分组成的一个分层体系结构;内核XNU是Darwin的核心,也是整个OS X的核心。

  2. Libc

    1. libc是Linux下的ANSI C的函数库。

  3. 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)

  1. Global Dispatch Queue(High (Overcommit)Priority)
  2. Global Dispatch Queue(Default (Overcommit)Priority)
  3. Global Dispatch Queue(Low (Overcommit)Priority)
  4. 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。