热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

GCD的一点疑惑与自解

GCD其实已经了解了很久了,在实际工程中也会经常用,但是其实很多实践都是浅尝辄止。最近又在回头看这块儿的内容,有一些知识点,

GCD 其实已经了解了很久了,在实际工程中也会经常用,但是其实很多实践都是浅尝辄止。

最近又在回头看这块儿的内容,有一些知识点,原来不甚明白的,现在有了新的认识,刚好也记录下。

GCD 是一套方案,GCD 本身管理了一组线程池,GCD 负责线程池中的线程创建销毁、并且这种能力是动态化的,即可以充分利用当前 CPU 的多核特性。 添加到 GCD 队列中的任务,会由 GCD 来决定运行在哪一个线程上。也就是说,GCD Queue 是一个抽象概念, task 是添加到 Queue 中不假,但是实际仍然是运行在线程上的。

GCD Concurrent Queue 并行队列

GCD 的队列中的 task 遵循 FIFO (First In First Out)原则,但是 task 完成的顺序是不可测的。

上面的这段描述,是在当时阅读官方文档的时候,产生了疑惑,我的想法是,既然 task 是按照先后添加到 Queue 中的顺序进行执行的,那为啥完成时间就不一定了呢?

现在明白了,task 的执行压根和 Queue 关系不大,GCD 只是按照添加顺序从 Queue 中一个个拿出 task,扔到线程上去执行。有的 task 一会就完成了,有的需要比较长的时间,当然这个完成顺序就不一定了。

现在想想,当时应该是想当然的认为 GCD 只有在完成上一个任务后才会开启下一个任务,跟串行队列混淆了,从而导致疑惑的。

GCD 串行队列

串行队列就是只有完成上一个 task ,才会进行下一个 task 的执行。 所以完成顺序与添加顺序是相同的。

Objc GCD 队列疑惑

上图是摘录自 Objc.cn 中关于 GCD 队列的一张图。 但是在阅读时,我有下面几点疑惑:

  • 为什么 Custom Queues 这一层的关系如此复杂。
  • 为什么 Serial Queue 既指向了 Serial Queue ,又能指向 Concurrent Queue。
  • 最上面一层中的 Serial Queue 和 倒数第二层中的 Queues 有什么关系。

GCD 公开有 5 个不同的队列:运行在主线程中的 main queue,3 个不同优先级的后台队列,以及一个优先级更低的后台队列(用于 I/O)。 另外,开发者可以创建自定义队列:串行或者并行队列。自定义队列非常强大,在自定义队列中被调度的所有 block 最终都将被放入到系统的全局队列中和线程池中。

Objc 原文如上描述。

细细品味,其意思是,GCD Queues 有 5 大钦定的 Queue。 开发者当然也可以自定义 Queue(使用 dispatch_queue_create 函数), 前面说过,Queue 是一个抽象概念,只是简单的保存 task 而已,最终 task 还是要在 GCD Thread Pool 中完成的。

目标队列 Target Queue

之前讲过,task 最终是要从 Queue 中放到线程池中执行的。 其实还有一种情况,就是 task 可以从一个 Queue 中放到另一个 Queue 中。 需要设置当前 Queue 的 TargetQueue。 了解了这个概念,就能很清楚的明白上面的图了。

为了更加清楚的阐述这张图的表达意图,可以从这几条线说起:

S1 -> Main Queue

MainQueue 这个队列中的 task 最终都会放到主线程上执行。如果所示,MainQueue 是指向 Main Thread。 也就是说,如果自定义队列时,如果这个自定义串行队列的 Target Queue 是 Main Queue,那么这些 task 将都会放在主线程执行。

S3 -> Default Priority Queue

这里的意思很简单,自定义队列的默认 Target Queue 就是 Default Priority Queue,这也就是 Objc 所解释的 在自定义队列中被调度的所有 block 最终都将被放入到系统的全局队列中和线程池中 。 在 S3 队列中的任务,会一个接着一个地放入到 Global Queue 中,然后被执行。在前一个 task 完成之后,才会继续下一个 task。

C2 -> Default Priority Queue

同上,不过这里,会一咕噜的将 C2 中的 task 往 Global Queue 中放,不用管上一个 task 是否完成。

S2 -> S3

Serial Queue 的 target queue 同样是 Serial Queue

C1 + S4 -> C2

C1 的 Concurrent Queue 的 target queue = Concurrent Queue 这个就比较高级了。 在这个模式下,S4 中的 task 串行,C1 中的 task 并行。 但是最终它们这些任务都放在一个并发队列中。

最后

以上是个人对于 GCD 的一些见解,如有描述不对,还请及时指正。

转:https://juejin.im/post/5a30f24751882503dc53b3ab



推荐阅读
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 本文探讨了 Spring Boot 应用程序在不同配置下支持的最大并发连接数,重点分析了内置服务器(如 Tomcat、Jetty 和 Undertow)的默认设置及其对性能的影响。 ... [详细]
  • 微软Exchange服务器遭遇2022年版“千年虫”漏洞
    微软Exchange服务器在新年伊始遭遇了一个类似于‘千年虫’的日期处理漏洞,导致邮件传输受阻。该问题主要影响配置了FIP-FS恶意软件引擎的Exchange 2016和2019版本。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
author-avatar
倒霉熊丶JO_205
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有