提问者:小点点

在Grand Central Dispatch中使用术语“队列”、“多核”和“线程”


我正在尝试理解Grand Central Dispatch的概念。我想理解Vandad关于并发编程的书中的这些引语。

GCD的真正用途是将任务分派给多个内核,而不会让程序员担心哪个内核执行哪个任务。

GCD的核心是调度队列。调度队列是线程池。

最后

您将不会直接使用这些线程。您将只使用分派队列,将任务分派到这些队列,并请求队列调用您的任务。

我已将关键术语加粗。

多核和队列一样吗?一个队列由许多线程组成吗?每个线程都执行一个任务吗?


共3个答案

匿名用户

所以多核和队列一样?

不完全是。队列是一种编程抽象,核心是处理器中的物理资源。队列和核心之间没有唯一的关系,尽管在任何给定的时间点,可以说给定的队列正在给定的核心上执行给定的任务。

一个队列由许多线程组成?

队列由任务组成。任务由队列管理系统在执行该任务时分配给线程。线程是操作系统资源,分配给内核,内核有效地运行它们,并且不知道任务是什么(超线程 CPU 除外)。

如果不考虑硬件多线程(例如,超线程),在任何给定的时间点,内核都在运行特定的线程;当需要运行不同的线程时,该内核会发生上下文切换。如果考虑硬件多线程,您可以让多个线程运行在同一个物理内核中托管的虚拟内核上。

队列和线程之间的关系是不透明的。队列可以同时管理多个线程,或者一次管理多个线程,或者一直只管理一个线程;在第一种情况下,您有一个并行队列,能够在同时的线程上执行并行任务;在第二种和第三种情况下,您有一个串行队列。

每个线程执行一个任务?

在任何给定的时间点,线程都在执行任务。您可以让线程产生、执行任务并死亡;或者您可以有执行多个任务的长时间运行的线程(即主线程)。

也许一开始就很费解,您可能需要阅读一些有关操作系统的信息,也许还需要高级处理器体系结构才能完全理解这一点。

GCD旨在让您完全用抽象术语进行推理:即,根据任务和队列,忘记线程和内核,它们被视为一种“实现手段”,或者您可以留给系统有效使用的低级细节。

匿名用户

队列只是要执行的任务列表,内核取决于处理器,您可以有 1 个或多个内核。队列是可配置的,您可以决定是否可以并发执行任务,如果队列中允许并发,则队列中的任务可以在不同的内核中同时执行。

匿名用户

我不确定这些报价是否真的符合GCD的正义。例如,要依次获取每个报价:

> < li>

即使您只有一个可用的内核,GCD也不仅仅是可用的(和有用的),因为无论有多少可用的物理CPU内核,多线程的某些任务在计算机科学中都占有一席之地。最好把它看作是显式管理线程的一种替代方法——GCD将进行线程管理,因此您不必这样做,您(作为程序员)只需考虑队列以及某些相关任务是必须串行完成还是可以并发完成。

调度队列不是“线程池”。调度队列是“工作单元聚合”,应该这样考虑。这项工作是如何由一个线程或多个线程实际执行的,这不是程序员关心的问题,事实上,程序员对这一点的假设越少越好,因为GCD非常努力地提高效率,尽可能少地使用线程,同时仍然有效地利用硬件资源。

第三个引用很好——这是一个合适的习语。只需将您的工作(无论是块还是函数/上下文元组)提交到适当的队列,根据需要创建队列以与需要同步的资源相关联,您就掌握了GCD的要点。