CPU 与核心
物理核
物理核数量=cpu 数(机子上装的 cpu 的数量)*每个 cpu 的核心数
虚拟核
所谓的 4 核 8 线程,4 核指的是物理核心。通过超线程技术,用一个物理核模拟两个虚拟核,每个核两个线程,总数为 8 线程。
- 在操作系统看来是 8 个核,但是实际上是 4 个物理核。
通过超线程技术可以实现单个物理核实现线程级别的并行计算,但是比不上性能两个物理核。
单核 cpu 和多核 cpu
都是一个 cpu,不同的是每个 cpu 上的核心数
- 多核 cpu 是多个单核 cpu 的替代方案,多核 cpu 减小了体积,同时也减少了功耗
-
进程和线程
理解
进程是操作系统进行资源(包括 cpu、内存、磁盘 IO 等)分配的最小单位
- 线程是 cpu 调度和分配的基本单位
- 我们打开的微信,浏览器都是一个进程
- 进程可能有多个子任务,比如微信要接受消息,发送消息,这些子任务就是线程。
- 资源分配给进程,线程共享进程资源。
对比
| 对比 | 进程 | 线程 | | —- | —- | —- | | 定义 | 进程是程序运行的一个实体的运行过程,是系统进行资源分配和调配的一个独立单位 | 线程是进程运行和执行的最小调度单位 | | 系统开销 | 创建撤销切换开销大,资源要重新分配和收回 | 仅保存少量寄存器的内容,开销小,在进程的地址空间执行代码 | | 拥有资产 | 资源拥有的基本单位 | 基本上不占资源,仅有不可少的资源(程序计数器,一组寄存器和栈) | | 调度 | 资源分配的基本单位 | 独立调度分配的单位 | | 安全性 | 进程间相互独立,互不影响 | 线程共享一个进程下面的资源,可以互相通信和影响 | | 地址空间 | 系统赋予的独立的内存地址空间 | 由相关堆栈寄存器和和线程控制表 TCB 组成,寄存器可被用来存储线程内的局部变量 |
线程切换
- cpu 给线程分配时间片(也就是分配给线程的时间),执行完时间片后会切换都另一个线程。
- 切换之前会保存线程的状态,下次时间片再给这个线程时才能知道当前状态。
- 从保存线程 A 的状态再到切换到线程 B 时,重新加载线程 B 的状态的这个过程就叫上下文切换。
-
线程开销
上下文切换消耗
- 线程创建和消亡的开销
-
串行,并发与并行
串行
多个任务,执行时一个执行完再执行另一个。
-
并发
多个线程在单个核心运行,同一时间一个线程运行,系统不停切换线程,看起来像同时运行,实际上是线程不停切换。
-
并行
每个线程分配给独立的核心,线程同时运行。
-
多核下线程数量选择
计算密集型
程序主要为复杂的逻辑判断和复杂的运算。
cpu 的利用率高,不用开太多的线程,开太多线程反而会因为线程切换时切换上下文而浪费资源。
IO 密集型
程序主要为 IO 操作,比如磁盘 IO(读取文件)和网络 IO(网络请求)。
因为 IO 操作会阻塞线程,cpu 利用率不高,可以开多点线程,阻塞时可以切换到其他就绪线程,提高 cpu 利用率。
总结
提高性能的一种方式:提高硬件水平,处理速度或核心数。
- 另一种方式:根据场景,合理设置线程数,软件上提高 cpu 利用率。