DispatchQueues 的底层是如何实现的?

sta*_*809 1 macos grand-central-dispatch ios dispatch-queue

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

\n

ipm*_*mcc 5

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

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

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

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

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