天天看點

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。