我正在尝试理解Grand Central Dispatch的概念。我想理解Vandad关于并发编程的书中的这些引语。
GCD的真正用途是将任务分派给多个内核,而不会让程序员担心哪个内核执行哪个任务。
和
GCD的核心是调度队列。调度队列是线程池。
最后
您将不会直接使用这些线程。您将只使用分派队列,将任务分派到这些队列,并请求队列调用您的任务。
我已将关键术语加粗。
多核和队列一样吗?一个队列由许多线程组成吗?每个线程都执行一个任务吗?
所以多核和队列一样?
不完全是。队列是一种编程抽象,核心是处理器中的物理资源。队列和核心之间没有唯一的关系,尽管在任何给定的时间点,可以说给定的队列正在给定的核心上执行给定的任务。
一个队列由许多线程组成?
队列由任务组成。任务由队列管理系统在执行该任务时分配给线程。线程是操作系统资源,分配给内核,内核有效地运行它们,并且不知道任务是什么(超线程 CPU 除外)。
如果不考虑硬件多线程(例如,超线程),在任何给定的时间点,内核都在运行特定的线程;当需要运行不同的线程时,该内核会发生上下文切换。如果考虑硬件多线程,您可以让多个线程运行在同一个物理内核中托管的虚拟内核上。
队列和线程之间的关系是不透明的。队列可以同时管理多个线程,或者一次管理多个线程,或者一直只管理一个线程;在第一种情况下,您有一个并行队列,能够在同时的线程上执行并行任务;在第二种和第三种情况下,您有一个串行队列。
每个线程执行一个任务?
在任何给定的时间点,线程都在执行任务。您可以让线程产生、执行任务并死亡;或者您可以有执行多个任务的长时间运行的线程(即主线程)。
也许一开始就很费解,您可能需要阅读一些有关操作系统的信息,也许还需要高级处理器体系结构才能完全理解这一点。
GCD旨在让您完全用抽象术语进行推理:即,根据任务和队列,忘记线程和内核,它们被视为一种“实现手段”,或者您可以留给系统有效使用的低级细节。
队列只是要执行的任务列表,内核取决于处理器,您可以有 1 个或多个内核。队列是可配置的,您可以决定是否可以并发执行任务,如果队列中允许并发,则队列中的任务可以在不同的内核中同时执行。
我不确定这些报价是否真的符合GCD的正义。例如,要依次获取每个报价:
> < li>
即使您只有一个可用的内核,GCD也不仅仅是可用的(和有用的),因为无论有多少可用的物理CPU内核,多线程的某些任务在计算机科学中都占有一席之地。最好把它看作是显式管理线程的一种替代方法——GCD将进行线程管理,因此您不必这样做,您(作为程序员)只需考虑队列以及某些相关任务是必须串行完成还是可以并发完成。
调度队列不是“线程池”。调度队列是“工作单元聚合”,应该这样考虑。这项工作是如何由一个线程或多个线程实际执行的,这不是程序员关心的问题,事实上,程序员对这一点的假设越少越好,因为GCD非常努力地提高效率,尽可能少地使用线程,同时仍然有效地利用硬件资源。
第三个引用很好——这是一个合适的习语。只需将您的工作(无论是块还是函数/上下文元组)提交到适当的队列,根据需要创建队列以与需要同步的资源相关联,您就掌握了GCD的要点。