从 CPU 说起的多核, 超线程, 多线程与多进程
中央处理器 Central Processing Unit (CPU) 的别名 [1]
- 主处理器 main processor
- 处理器 processor
CPU 的功能[1:1]
- 主要是解释计算机指令以及处理计算机软件中的数据 (顺嘴提一下它的兄弟: GPU[2] --- 主要用于图形处理和大量并行计算; FPU[3] --- 主要用于执行浮点数运算, 它可能集成在 CPU 中)
CPU 主要组成[1:2]
- 运算器
- 算术逻辑单元 Arithmetic Logic Unit (ALU), 用于进行二进制 (补码) 的算术运算
- 累加器
- 状态寄存器
- 通用寄存器组
- 控制器
- 控制单元 Control Unit (CU), 用于解释存储器中的指令, 并发出各种操作命令来执行指令
- 程序计数器
- 指令寄存器
- 指令译码器
- 时序产生器
- 操作控制器
CPU Die[4]
- 它是以半导体材料 (通常是硅) 制作的一块集成电路, 在其上可以包含任意数量的 CPU 内核
CPU 核心, 也称内核[5]
- 指在 CPU Die 上的独立处理单元, 它可以独立的执行计算机指令 (如果一个 CPU Die 包含多个核心, 那么它可以并行的执行指令, 加快程序的运行速度)
多核 CPU 与多 CPU[5:1]
- 多核处理器 (多核 CPU)
- 一 Die 多核, 指在单一集成电路 (Die) 中封装多个独立的处理器 (成本最高)
- 多 Die 多核 (一个 Die 上有多个核心) CPU, 但 Die 与Die 之间通过内部总线连接, 最终封装成一个 CPU Package (成本最低)
- 多处理器 (多 CPU) - 指在不同的集成电路 (Die) 上封装的独立的处理器
- 多 Die 多核 (一个 Die 上有多个核心) CPU, 但 Die 与Die 之间通过外部 (系统) 总线连接, 最终封装成多个 CPU Package (有几个 Die 就可以有几个 CPU Package) (成本较低)
如果还没懂可以参考知乎 多核 CPU 和多个 CPU 有何区别? 的回答
线程[6]
- 线程是操作系统能够进行运算调度的最小单位. 大部分情况下, 它被包含在进程中, 是进程中的实际运作单位
- 同一进程中的多条线程将共享该进程中的全部系统资源, 但同一进程中的多个线程有各自的调用栈 call stack, 自己的寄存器环境 register context,自己的线程本地存储 thread-local storage
- 一个进程可以有很多线程, 每条线程并行执行不同的任务. 每一个线程都代表一个进程内的一个独立执行上下文
- 多线程之间切换开销小且通信 (交换资源) 效率较高[7][8]
进程[9]
- 进程是操作系统进行资源分配和调度的基本单位, 是执行中的程序, 也是线程的容器
- 程序本身知识指令, 数据及其组织形式的描述, 进程才是程序 (那些指令和数据) 真正运行的实例 (实体)
- 若干进程有可能与同一个程序相关系 (执行在不同的数据集上就会成为不同的进程实例), 也即进程与程序是 n:1 的关系
- 多进程之间切换开销大且通信 (交换资源) 效率较低[7:1][8:1]
超线程 Hyper-Threading (HT)[10]
- 核心在运行指令时, 并不能完全利用所有的资源, 为了有效利用这些空闲资源, 干脆再增加一些资源来运行第二个线程, 让闲置的资源可以执行另一个线程. 因此, (增加了资源的) 核心内部可以复制足够两个逻辑线程同时运行的资源. 这样, 一个核心在单位时间内就可以模拟处理两个线程的工作
- 目的: 提高处理器吞吐量以及线程化软件的整体性能
多线程[11][12]
- 是指从软件或者硬件上实现多个线程并发执行的技术. 具有多线程能力的计算机如果硬件支持多线程, 则能够实现多个线程并行执行, 进而提升整体的处理性能
多进程[13][14]
- 是指从软件或硬件上实现多个进程并发执行的技术, 具有多核 CPU 或多 CPU 的计算机能够实现多个进程并行执行
多线程与多进程[15][16]
任务可以分为计算密集型和IO密集型,假设我们现在使用一个进程来完成这个任务,对计算密集型任务,可以使用【核心数】个线程,就可以占满cpu资源,进而可以充分利用cpu,如果再多,就会造成额外的开销;对于IO密集型任务(涉及到网络、磁盘IO的任务都是IO密集型任务),线程由于被IO阻塞,如果仍然用【核心数】个线程,cpu是跑不满的,于是可以使用更多个线程来提高cpu使用率
最后以 多线程与多进程的思考 中的一张图片结尾: