_dispatch_main_q

也就是主要主队列,一定运行在主线程里。

// 6618342 Contact the team that owns the Instrument DTrace probe before renaming this symbol
struct dispatch_queue_s _dispatch_main_q = {
.do_vtable = &_dispatch_queue_vtable, // 相关的操作函数在这里
.do_ref_cnt = DISPATCH_OBJECT_GLOBAL_REFCNT, //表示永远不会被释放
.do_xref_cnt = DISPATCH_OBJECT_GLOBAL_REFCNT, //表示永远不会被释放
.do_suspend_cnt = DISPATCH_OBJECT_SUSPEND_LOCK,
.do_targetq = &_dispatch_root_queues[DISPATCH_ROOT_QUEUE_COUNT / 2], .dq_label = "com.apple.main-thread",
.dq_running = 1,
.dq_width = 1, // 串行队列
.dq_serialnum = 1,
};

主队列的目标队列时全局队列其中之一。

对应的do_vtable: _dispatch_queue_vtable

即对应的操作函数。

static const struct dispatch_queue_vtable_s _dispatch_queue_vtable = {
.do_type = DISPATCH_QUEUE_TYPE,
.do_kind = "queue",
.do_dispose = _dispatch_queue_dispose,
.do_invoke = (void *)dummy_function_r0, //什么都不做,返回 0
.do_probe = (void *)dummy_function_r0, //什么都不做,返回 0
.do_debug = dispatch_queue_debug,
};

这样子,在调用do_invokedo_probe 时,会返回0.

_dispatch_root_queues

所有队列最终的target queue。
一共有6个 dispatch_queue_s

static struct dispatch_queue_s _dispatch_root_queues[] = {
{
.do_vtable = &_dispatch_queue_root_vtable,
.do_ref_cnt = DISPATCH_OBJECT_GLOBAL_REFCNT, //不会被释放
.do_xref_cnt = DISPATCH_OBJECT_GLOBAL_REFCNT,//不会被释放
.do_suspend_cnt = DISPATCH_OBJECT_SUSPEND_LOCK,
.do_ctxt = &_dispatch_root_queue_contexts[0], .dq_label = "com.apple.root.low-priority",
.dq_running = 2, //偶数,说明不是串行队列
.dq_width = UINT32_MAX, //最大并发数目
.dq_serialnum = 4,
},
....

对应的do_vtable: _dispatch_queue_root_vtable

static const struct dispatch_queue_vtable_s _dispatch_queue_root_vtable = {
.do_type = DISPATCH_QUEUE_GLOBAL_TYPE,
.do_kind = "global-queue",
.do_debug = dispatch_queue_debug,
.do_probe = _dispatch_queue_wakeup_global,
};

即当调用do_probe时,会调用 _dispatch_queue_wakeup_global 函数,把队列唤醒。

对应的 do_ctxt: _dispatch_root_queue_contexts

dispatch_root_queue_context_s 的定义如下

struct dispatch_root_queue_context_s {
pthread_workqueue_t dgq_kworkqueue;
uint32_t dgq_pending;
uint32_t dgq_thread_pool_size; // 还可以分配的线程池大小
dispatch_semaphore_t dgq_thread_mediator; // 信号量
};

生成时如下:

static struct dispatch_root_queue_context_s _dispatch_root_queue_contexts[] = {
{
.dgq_thread_mediator = &_dispatch_thread_mediator[0],
.dgq_thread_pool_size = MAX_THREAD_COUNT,
},

可见dgq_thread_mediator 对应于另一组常驻内存的变量。

static struct dispatch_semaphore_s _dispatch_thread_mediator[] = {
{
.do_vtable = &_dispatch_semaphore_vtable,
.do_ref_cnt = DISPATCH_OBJECT_GLOBAL_REFCNT,
.do_xref_cnt = DISPATCH_OBJECT_GLOBAL_REFCNT,
},

Dispatch Queue 之内存中常驻的几个结构的更多相关文章

  1. SQL Server 内存中OLTP内部机制概述(四)

    ----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...

  2. GCD: 基本概念和Dispatch Queue 【转】

    什么是GCD? Grand Central Dispatch或者GCD,是一套低层API,提供了一种新的方法来进行并发程序编写.从基本功能上讲,GCD有点像 NSOperationQueue,他们都允 ...

  3. GCD介绍(一): 基本概念和Dispatch Queue

    什么是GCD? Grand Central Dispatch或者GCD,是一套低层API,提供了一种新的方法来进行并发程序编写.从基本功能上讲,GCD有点像NSOperationQueue,他们都允许 ...

  4. GCD系列 之(一):基本概念和Dispatch Queue

    参考学习https://www.dreamingwish.com/article/grand-central-dispatch-basic-1.html系列文章,貌似也是翻译自他处的.觉得非常完整,就 ...

  5. IOS开发 GCD介绍: 基本概念和Dispatch Queue

    iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 ØN ...

  6. GCD 学习(二)dispatch_queue_create创建Dispatch Queue

    摘录于: http://zhuyanfeng.com/archives/3042 dispatch_queue_create 用于创建用户线程队列.可以创建Serial/Concurrent Disp ...

  7. 深入GCD(一): 基本概念和Dispatch Queue

    什么是GCD?Grand Central Dispatch或者GCD,是一套低层API,提供了一种新的方法来进行并发程序编写.从基本功能上讲,GCD有点像NSOperationQueue,他们都允许程 ...

  8. 装个蒜。学习下dispatch queue

    dispatch queue的真髓:能串行,能并行,能同步,能异步以及共享同一个线程池. 接口: GCD是基于C语言的APT.虽然最新的系统版本中GCD对象已经转成了Objective-C对象,但AP ...

  9. 内存中 OLTP - 常见的工作负荷模式和迁移注意事项(一)

    ----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<In-Memory OLTP – Comm ...

随机推荐

  1. 【原】The Linux Command Line - Processes

    ps - report a snapshot of current processes top - display tasks job - list active jobs bg - place a ...

  2. 干货|技术小白如何在45分钟内发行通证(TOKEN)并上线交易(附流程代码

    https://blog.csdn.net/HiBlock/article/details/80071478

  3. FlannBasedMatcher 立体匹配

    #include "opencv2/core/core.hpp" #include "opencv2/features2d/features2d.hpp" #i ...

  4. C++11 constexpr常量表达式

    常量表达式函数 要求: 函数体内只有单一的return返回语句 例如: constexpr int data() { const int i=1; //含有除了return以外的语句 return i ...

  5. POJ-1797.HeavyTransportation(最长路中的最小权值)

    本题思路:最短路变形,改变松弛方式即可,dist存的是源结点到当前结点的最长路的最小权值. 参考代码: #include <cstdio> #include <cstring> ...

  6. 堆优化dij

    #include<iostream> #include<cstdio> #include<queue> using namespace std; ],head[], ...

  7. 前后端跨域 _ cross domain

    1. 解决跨域既可以从前端, 也可以从后端. 参考好的网络资源: http://www.cnblogs.com/vajoy/p/4295825.html

  8. SQL Server 2008 R2 链接 Oracle

    参考网站: SP_addlinkedserver 小结 (oracle,sql server,access,excel) 64位SqlServer通过链接服务器与32位oracle通讯 SQL Ser ...

  9. 粒子动画——Pygame

    你是否也想做出下图这么漂亮的动态效果?想的话就跟着我一起做吧=.= 工具: Python--Pygame 仔细观察上图,你能发现哪些机制呢?再在下面对比一下是否跟你想的一样. 运行机制: 1.随机方向 ...

  10. js常用判断和语法

    1.js获取选中的redio元素 var version = $('.version input[name="input1"]:checked').val();//单选框默认选中& ...