type
status
date
slug
summary
tags
category
icon
password

并发和并行

中文真的很容易混淆,可以直接从英文上理解:
  • concurrency:并发
  • parallelism:并行
区别:
  • 经典打电话例子:
    • 💡
      • 你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这是串行。
      • 你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这是并发。
      • 你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这是并行。
      可以看到,完成「吃饭」和「接电话」两件事情所需要的时间,串行 == 并发 > 并行。计算机中,并发和并行无论是在底层设计还是上层编程中都是我们用于提高计算机处理效率以及性能的主要思想。看到这你可能会有这样一个疑惑:这并发也没让我们处理事情的效率变高啊,不还是和串行要用一样的时间吗?我们知道,计算机进行计算是需要资源的,这些资源包括但不限于 CPU 算力,内存以及网络 I/O 等,在有限的资源上完成更多的事情显然是我们的一个目标,而并发和并行分别从两个角度来达成这一目的:
      • 并发通过提高执行任务时的资源利用率来提高效率
      • 并行通过减少执行任务的耗时来提高效率。
  • 并发省下的是资源,而并行省下的是时间,有可能要实现并行还会增加资源的消耗

进程和线程

进程:
  • 将一个进程理解为一次程序的执行,CPU同一时刻只能执行一个进程
  • 是资源分配的基本单位
  • 单 CPU 计算机中,CPU 是不能被多个程序共享的,即该 CPU 同一时刻只能执行一个进程,操作系统调度器就是将 CPU 分为一个个时间片轮流分给不同的程序
  • 单CPU进行进程调度的时候,需要读取上下文+执行程序+保存上下文,即进程切换
线程:
  • 一个进程可以包含多个线程
  • 线程是 CPU 调度和分配的基本单位
  • 进程的不同线程间共享 CPU 和 上下文,即共享资源
  • 如果这个CPU是单核的话,那么在进程中的不同线程为了使用CPU核心,则会进行线程切换,但是由于共享了程序执行环境,这个线程切换比进程切换开销少了很多
    • 如果这个CPU是多核的话,那么进程中的不同线程可以使用不同核心,真正的并行出现了
💡
有句话说CPU只能看到线程,可以这么理解,假设我是CPU,我闭着眼,操作系统调度器将一个进程分配给我之后,我拿到进程睁开眼,我看到的是什么?我看到的是进程中的很多线程,那么我现在能调度和分配的是什么?进程?不行,因为我看不到其他进程,何来调度分配,只能调度我看到的那些线程,如果我是4核的话,把线程ABCD分配到核心1234,其他的线程依然要等待分配,至于等待多久,如何分配,暂不在本文讨论范围。于是线程是CPU调度和分配的基本单位。
因此可以看出来,CPU 被分成时间片给不同进程使用,这个是并发。多核 CPU 的情况下,多个线程可以同时使用 CPU,这个就是并行。

联系

  1. 单 CPU 中进程只能是并发,而多 CPU 中进程可以并行
  1. 单 CP U单核中线程只能并发,单 CPU 多核中线程可以并行
CS144-C++语法积累React&React Native
  • Giscus