掘金 后端 ( ) • 2024-04-17 10:31

theme: fancy

并发是同一时间应对多件事情的能力——Rob Pike

并发编程是指在软件开发中处理多个任务或线程的方式。它涉及到同时执行多个任务,而不是一个接一个地执行。并发编程的目标是提高程序的效率和响应能力,使得程序能够更好地处理用户的请求,提高系统的吞吐量和并发性能

CPU 架构

CPU(Central Processing Unit)是计算机中的中央处理器,它是计算机的大脑,负责执行程序指令、进行算术和逻辑运算,控制数据传输和处理。

单核 CPU 与多核 CPU

单核CPU

  • 单核 CPU 是一种最基本的 CPU 架构,它只有一个处理器核心。
  • 单核 CPU 通常只能同时执行一个任务,因此在执行多个任务时,会进行任务的排队和切换,从而导致任务执行的不连续和效率低下。

单核CPU的优势在于价格低廉和简单的结构,一般适用于个人电脑、平板电脑和一些轻量级设备。

多核CPU

  • 多核 CPU 是一种具有多个处理器核心的 CPU 架构。
  • 多核 CPU 可以同时执行多个任务,提高了计算机的处理能力和性能。

单核 CPU 和多核 CPU 的区别及优势

区别

  • 单核 CPU 只有一个处理器核心,而多核 CPU 具有多个处理器核心。
  • 单核 CPU 只能同时执行一个任务,而多核 CPU 可以同时执行多个任务。
  • 单核 CPU 的处理能力相对较低,而多核 CPU 的处理能力更高。

优势

  • 多核 CPU 相比单核 CPU 具有更高的处理能力和性能,能够更好地利用系统资源,提高计算机的吞吐量和响应速度。
  • 多核 CPU 可以同时执行多个任务,提高了计算机的并发处理能力。
  • 多核 CPU 通过超线程技术可以提高单个任务的执行效率。
  • 多核 CPU 的价格相对较高,但对于需要高性能计算和多任务处理的场景,它是一个很好的选择。

多核CPU如何实现并行处理

在早期只有一个 CPU 核心时,我们的任务是怎么处理的呢?是的,并发解君愁。当然,这里还得提到操作系统的多线程,正是操作系统多线程 + CPU 核心,才实现了现代化的多任务操作系统。在 OS 级别,多线程负责管理我们的任务队列,你可以简单认为一个线程管理着一个任务队列,然后线程之间还能根据空闲度进行任务调度。我们的程序只会跟 OS 线程打交道,并不关心 CPU 到底有多少个核心,真正关心的只是 OS,当线程把任务交给 CPU 核心去执行时,如果只有一个 CPU 核心,那么它就只能同时处理一个任务

多核心并行

当 CPU 核心增多到 N 时,那么能够在同一时间就能有 N 个任务被处理,则并行度就是 N,相应的处理效率也变成了单核心的 N 倍。

多核心并发

当电脑的处理器核心增多时,操作系统需要处理的任务也会增多。这些任务被分成几个队列,然后交给处理器核心去执行。虽然看起来好像所有任务都在同时进行,但实际上,每个核心在同一时刻只能处理一个任务。所以,虽然任务都在同时进行,但实际上只有少数任务能够真正地同时被处理。

进程与线程

进程和线程是操作系统中用于执行任务的基本单位。它们之间有一些重要区别:

进程

  • 进程是程序的一次执行实例,拥有独立的内存空间和资源。
  • 每个进程都有自己的地址空间、文件描述符、环境变量等。
  • 进程之间通常是相互独立的,彼此不会影响。
  • 进程之间的通信需要使用 IPC(Inter-Process Communication)机制,如管道、消息队列、共享内存等。

线程

  • 线程是在进程内部执行的轻量级任务单元,共享进程的资源。
  • 线程共享相同的地址空间和文件描述符,可以直接访问进程的全局变量和数据。
  • 线程之间的切换比进程之间的切换更快速,因为不涉及地址空间的切换。
  • 线程之间的通信更容易,可以直接通过共享内存等方式进行通信。

并发与并行

  • 究竟什么是并发?
  • 它与并行有什么区别?

理解并发编程的关键是理解并发的概念。

  • 并发是指在同一时间处理多个任务;并发编程主要关注如何处理多个任务。
  • 并行是指真正同时执行多个任务;并行编程则关注如何真正同时执行多个任务。

Erlang 之父约瑟夫·莱斯利·阿姆斯特朗用一张很形象的图片解释了并发与并行的区别:

从上图可以看出:

  • 并发是多个队列使用同一个咖啡机,然后两个队列轮着使用(未必是1:1 轮换,也有可能是其他轮换规则),但最终每个人都能接到咖啡
  • 并行是每个队列都拥有一个咖啡机,最终也是每个人都能接到咖啡,但是效率更高,因为同时可以有两个人在接咖啡

并发和并行都是对“多任务”处理的描述,其中并发是轮流处理,而并行是同时处理。正如 Go 语言之父 Rob Pike 曾说过:并发不是并行,并发关乎结构,并行关乎执行