Dispatch Queue 之内存中常驻的几个结构
_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_invoke 和 do_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 之内存中常驻的几个结构的更多相关文章
- SQL Server 内存中OLTP内部机制概述(四)
----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...
- GCD: 基本概念和Dispatch Queue 【转】
什么是GCD? Grand Central Dispatch或者GCD,是一套低层API,提供了一种新的方法来进行并发程序编写.从基本功能上讲,GCD有点像 NSOperationQueue,他们都允 ...
- GCD介绍(一): 基本概念和Dispatch Queue
什么是GCD? Grand Central Dispatch或者GCD,是一套低层API,提供了一种新的方法来进行并发程序编写.从基本功能上讲,GCD有点像NSOperationQueue,他们都允许 ...
- GCD系列 之(一):基本概念和Dispatch Queue
参考学习https://www.dreamingwish.com/article/grand-central-dispatch-basic-1.html系列文章,貌似也是翻译自他处的.觉得非常完整,就 ...
- IOS开发 GCD介绍: 基本概念和Dispatch Queue
iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 ØN ...
- GCD 学习(二)dispatch_queue_create创建Dispatch Queue
摘录于: http://zhuyanfeng.com/archives/3042 dispatch_queue_create 用于创建用户线程队列.可以创建Serial/Concurrent Disp ...
- 深入GCD(一): 基本概念和Dispatch Queue
什么是GCD?Grand Central Dispatch或者GCD,是一套低层API,提供了一种新的方法来进行并发程序编写.从基本功能上讲,GCD有点像NSOperationQueue,他们都允许程 ...
- 装个蒜。学习下dispatch queue
dispatch queue的真髓:能串行,能并行,能同步,能异步以及共享同一个线程池. 接口: GCD是基于C语言的APT.虽然最新的系统版本中GCD对象已经转成了Objective-C对象,但AP ...
- 内存中 OLTP - 常见的工作负荷模式和迁移注意事项(一)
----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<In-Memory OLTP – Comm ...
随机推荐
- PyCharm2018 安装
PyCharm就是Python语言开发中一个很受欢迎的IDE,界面类似于visual studio,android studio,集成的功能也很多. 1>. 安装 首先要下载Pycharm这个软 ...
- Python开发【第七篇】:面向对象二
字段 class Foo: #静态字段(保存在类中) CC = 123 def __init__(self): #普通字段(保存在对象中) ...
- eclipse删除了文件,找回方法
本人通过eclipse在前段时间上传svn代码的时候,代码掉完了,导致的原因是:svn服务器上有有个一样的文件夹,只是大小写不同,但是svn会认为是一样的文件夹,导致svn[]判别不了传到哪个文件夹去 ...
- 用rekit创建react项目
第一步 先进入github.com 然后搜索rekit 往下滑 1 . 先全局安装 npm install -g rekit 2 . 进入自己想要创建项目文件的目录输入 rekit create / ...
- C# 检测证书是否安装、 安装证书
检测是否存在指定的证书: /// <summary> /// 检测是否存在指定的证书 /// </summary> /// <returns></return ...
- pc send instructor pc ad
1. #include <string.h> #include <intrins.h> // 加入此头文件后,可使用_nop_库函数 #define MAIN_Fosc 11 ...
- boost学习 泛型编程之traits 学习
traits使用的场景一般有三种 分发到不同处理流程 解决C++代码中某些无法编译的问题 比如一个图书馆的代码,接受书籍并收入到不同类别中 template<class T> // T表 ...
- 数据库-mysql语句-查
复习: 列类型: 数值类型: 20 '20' tinyint / smallint / int / bigint float / double / decimal(m,d) bool (TRU ...
- VM无法连接到虚拟机
The VMware Authorization Service is not running. 原因 虚拟机服务没有开启 解决方法 1. 我的电脑右击->管理 2. 打开服 ...
- Linux 下查看我们的不速之客
我们通过下面这个命令,可以查看 VPS 上还有谁在登陆: w 输出类似下列信息: 23:20:00 up 960 days, 4:29, 2 user, load average: 0.05, 0.0 ...