知识卡片

并发不是并行

普通读书笔记卡 · 1480.a

内容

并发描述任务结构,多个任务可以交替推进;并行描述物理同时执行。Go 让并发表达很轻,但是否并行还取决于 P 的数量、CPU 和阻塞状态。

参考来源

- 位置:《Go语言底层原理剖析》第14章《协程初探》14.4节《并发与并行》 - 结论依据:原文定义"并发指同时处理多个任务的能力……在单核处理器中,任意一个时刻只能执行一个具体的线程,而在一个时间段内,线程可能通过上下文切换交替执行。多核处理器是真正的并行执行,因为在任意时刻,可以同时有多个线程在执行",并说明"由于Go语言中的协程依托于线程……即便处理器运行的是同一个线程……这时协程是并发的。如果多个协程被分配给了不同的线程,而这些线程同时被不同的CPU核心处理,那么这些协程就是并行处理的",因此可以推出"并发是任务结构交替推进,并行是物理同时执行"的结论。 - 原始内容:在Go语言的程序设计中,有两个非常重要但容易被误解的概念,分别是并发(concurrency)与并行(parallelism)……在单核处理器中,任意一个时刻只能执行一个具体的线程,而在一个时间段内,线程可能通过上下文切换交替执行。多核处理器是真正的并行执行,因为在任意时刻,可以同时有多个线程在执行……如果多个协程被分配给了不同的线程,而这些线程同时被不同的CPU核心处理,那么这些协程就是并行处理的。