DispatchQueues是如何在后台实现的



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

您误解了,至少在某些方面是这样。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/这应该说明它不是达尔文内核特有的东西。换句话说,您可以从头开始编写自己版本的GCD,而无需重新编译内核。

相关内容

  • 没有找到相关文章

最新更新