文章目錄
- 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所屬的資訊,即執行上下文。

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。