DispatchQueues 是如何在底层实现的?

Posted

技术标签:

【中文标题】DispatchQueues 是如何在底层实现的?【英文标题】:How DispatchQueues are implemented under the hood? 【发布时间】:2021-05-20 15:17:19 【问题描述】:

我很好奇 DispatchQueue 到底是什么,我尝试用谷歌搜索这些信息,但所有文档都相当抽象,并没有提供任何关于实现的真实信息。在我的理解中,DispatchQueue 是某种存在于某处的实体,能够存储代码块,并由内核直接控制(由嵌入内核的 GCD),它能够将这些块注入到选择中(由 GCD /内核)线程。这是 DispatchQueue 的正确愿景,还是我误解了什么?

【问题讨论】:

【参考方案1】:

你误解了,至少在某些方面。 GCD 不是“嵌入内核”,它是一个运行在 POSIX 线程之上的库,POSIX 线程是具有内核支持的操作系统级原语。 GCD 只是一组 API,可让开发人员更轻松地在多个线程上工作,而无需自己管理线程。

对于它的价值,您可以查看 GCD 的源代码。它在这里:https://opensource.apple.com/tarballs/libdispatch/ 也就是说,它充满了利用晦涩的编译器功能(分支预测指令和类似的东西)的微优化,即使对于经验丰富的系统程序员来说,它通常也很难阅读和理解。

对 GCD 内部工作的完整详细解释超出了 *** 答案的范围,但我会尝试编写一两段解释。

GCD 在后台管理一些 POSIX 线程,用于以所需的方式执行工作。它还维护许多数据结构来组织该工作,例如“队列”,可以将其视为“要完成的工作块的列表”。还有一些组,允许您在工作项列表完成时收到通知。还有各种 IO 机制允许使用这些工作项为异步 IO 提供服务。它可能(也可能不)使用各种内核服务(如线程、kqueue 等)来管理其部分工作负载,但这些并不特定于 GCD。

不过,归根结底,GCD 并没有什么“特别”或“祝福”。事实上,有多个 GCD 端口可以连接到其他各种操作系统,例如 Linux 的这个:http://nickhutchinson.github.io/libdispatch/,这应该说明它不是特定于 Darwin 内核的东西。换句话说,您可以从头开始编写自己的 GCD 版本,而无需重新编译内核。

【讨论】:

以上是关于DispatchQueues 是如何在底层实现的?的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 调度队列和 U/I 串行运行

synchronized 底层如何实现?啥是锁的升级,降级

ES6 映射是如何在底层实现的?

如何使用 dispatchQueue 创建引用循环?

HTTP长连接是啥?底层是如何工作的?Tomcat是如何实现长连接的?

快速查找,插入有序,从源码分析 Python 底层如何实现字典的这些特性