Tag: 并行计算

了解DispatchQueues

最初发布于 swiftrocks.com 。 这些“ DispatchQueues”到底是什么? 为什么必须使用它将UI代码发送到主线程? 如果我什么也不做,它显然仍然有效。 这些“服务质量”队列有什么意义? 我将.main用于所有内容,并且从未遇到问题。 如果调用DispatchQueue.main.sync,为什么会崩溃? 有什么意义呢? 到底这是什么主线程? 如果您要开发iOS应用程序超过几个星期,那么您之前可能已经处理过并发代码。 如果您没有操作系统的知识,那么您可能已经问过自己其中一个问题。 一般而言,多线程是很难完全理解的事情,但是了解CPU如何处理并发性是编写可以完成您期望的工作的优质快速代码的关键。 否则,您可能正在滥用用户的CPU,但认为一切都很好,因为它们太快了,您无法注意到问题所在。 在我们能够回答这些问题之前,我们需要退后一步,了解事情在幕后的运作方式。 流程的定义非常简单:它是一个正在运行的程序。 您的应用是一个过程,Slack是一个过程,Safari是一个过程,依此类推。 它包含指令列表(您的汇编格式代码),并位于磁盘上,直到用户希望运行它为止。 然后,操作系统将把该进程加载到内存中,启动一个指令指针 ,告诉我们当前正在执行该程序的哪条指令,然后让CPU顺序执行其指令,直到结束为止,从而终止该进程。 单线程进程的地址空间 |————————-|- | 说明| |——————————– | 全球数据 |——————————– | 分配的数据(引用类型)| |——————————– | 什么都没有(堆栈和malloc的数据向此处增长)| |——————————– | 堆栈(值类型(如果可能),参数,返回)| |——————————– 每个进程都有自己专用的物理内存部分。 他们不与其他进程共享这些地址。 不行 您正在经历的是一种幻想,它是由CPU所具有的荒谬速度造成的。 一个CPU不能同时做两件事。 对于具有多个内核的CPU,情况略有不同,但是为简单起见,我们假设只有一个CPU:发生的事情是它在Safari中执行某项,然后在Spotify中执行某项,然后在iOS中执行某项,然后在Safari中再次执行某项,依此类推上。 操作系统将把CPU为特定进程所做的任何事情保存在内存中(以寄存器和指针的形式),决定下一个要运行的进程,检索该进程正在做什么,让CPU运行该进程。一会儿,然后重复。 这称为上下文切换 ,它非常非常快地发生,给人的印象是它实际上可以一次运行多个操作。 (在具有多个内核的CPU中,可以将工作划分到各个内核之间,实际上一次执行多个操作。但是,在使用所有内核时,同样的原理也适用。) 操作系统决定下一步应该运行什么的确切方法相当复杂(如果您有兴趣,请阅读文章结尾的书),但是您应该知道,可以手动决定什么是“优先级” ”在我们的应用中。 (iOS的“服务质量”现在是否开始有意义?) 多线程程序具有一个以上的执行点,而不是从main()函数开始并在下面几行结束的某个exit()处结束的单线程进程的经典概念,执行)。 也许另一种思考方式是,每个线程都非常像一个单独的进程,只是有一个区别:它们共享相同的地址空间,因此可以访问相同的数据。 多线程进程的地址空间 […]