iOS GCD实现

来源:互联网 发布:理水 鲁迅公知 编辑:程序博客网 时间:2024/05/23 13:11

GCD的Disaptch Queue是如何实现的呢

1.用于管理追加Block的的c语言层实现的FIFO队列

2.Atomic函数中实现用于拍他控制轻量级的信号

3.用于管理线程的c语言层实现的一些容器

GCD实现需要使用以上这些工具。但是如果仅仅这些内容可以实现,那内核要用来干嘛的了。

苹果官方说明:

通常,应用程序中编写的线程管理用的代码要在系统及实现。这句话表达的意思是iOS的核心XNU内核级上实现。因此不论程序猿如何去管理自己的代码,在性能方面不可能胜过基于XNU内核实现的GCD

用于实现Disaptch Queue而使用的软件组件

  组件名称      提供技术

 libdispatch    Disaptch Queue

 Libc(pthreads)     pthreads_workqueue 

  XNU内核     workqueue  

Block并不是直接加入FIFO队列,而是先加入Dispatch Continution,这一dispatch_continution_t类型的结构体中,然后加入FIFO队列,该Dispatch Continution用于记录block所属的Dispatch Continution,和其它的一些信息,相当于一般常说的执行上下文


Global Dispatch Queue优先级有如下8中;

Global Dispatch Queue (High Priority)

Global Dispatch Queue (Default Prority)

Global Dispatch Queue (Low Priority)

Global Dispatch Queue (Background Priorty)

Global Dispatch Queue (High Overcommit Priority)

Global Dispatch Queue (Default Overcommit Prority)

Global Dispatch Queue (Low Overcommit Priority)

Global Dispatch Queue (Background Overcommit Priorty)

优先级有Overcommit的Global Dispatch Queue使用serial Dispatch Queue中,如Overcommit这个名称,不管系统状态如何都会强制生成线程的Dispatch Queue。

这个8中Global Dispatch Queue各使用一个pthread_workqueue

Pthread_workqueue包含在libc提供的pthreads API中,其使用的bsdthreads_register和workq_open系统调用,在初始化workqueue之后获取workqueue信息。

XNU内核持有4种workqueue。

WORKQUEUE_HIGH_PRIOQUEUE

WORKQUEUE_LOW_PRIOQUEUE

WORKQUEUE_BG_PRIOQUEUE

WORKQUEUE_DEFAULT_PRIOQUEUE

0 0