关键在于调度行为与硬件执行是否重叠:单核下多进程轮流获时间片为进程级并发,多核下不同进程线程分驻不同核心才为进程级并行;物理线程数决定并行上限,仅当≥2任务被调度至≥2物理线程时才发生真并行。
区分操作系统中进程与物理线程的并行与并发,关键在于看“谁在什么时候、以什么方式占用cpu资源”。不是看开了几个程序或写了几个线程,而是看调度行为和硬件执行是否真正重叠。
进程层面的并发 vs 并行
进程是资源分配单位,本身不直接执行。它的“并发”或“并行”表现,取决于其内部线程如何被调度:
- 单核 CPU 上,多个进程轮流获得时间片——宏观上像同时运行,微观上串行切换,这是进程级并发;
- 多核 CPU 上,不同进程的主线程(或各自的一个线程)被调度到不同核心上同时运行——此时是进程级并行;
- 即使只有 1 个进程,只要它创建了多个线程,且这些线程被分派到不同物理核心,也构成并行——但这是线程级并行,不是进程本身的并行能力。
物理线程(硬件线程)决定并行上限
现代 CPU 的一个物理核心常支持 2 个逻辑处理器(如 Intel 超线程),每个逻辑处理器就是一个物理线程(hardware thread)。它是真正能同时取指、译码、执行的最小硬件单元:
- 操作系统看到的“CPU 数量”,其实是物理线程总数(例如 8 核 16 线程,就对应 16 个可调度的物理线程);
- 只有当两个任务被调度到两个不同的物理线程上,才可能真正同时执行——这是并行发生的物理基础;
- 如果两个线程被调度到同一个物理核心的两个逻辑线程上,它们共享部分执行单元,性能提升有限,仍属于轻量级并行,但不如跨核心稳定。
并发是调度策略,而并行是硬件事实
操作系统通过调度器把任务(进程/线程)映射到可用的物理线程上。这个过程决定了最终呈现的是并发还是并行:
- 并发体现为:任务就绪队列中有多个可运行实体,系统有能力在短时间内轮转它们——无论单核还是多核都支持;
- 并行体现为:调度器实际将 ≥2 个任务同时放在 ≥2 个物理线程上运行——这需要硬件支持,且受调度策略、亲和性设置、负载均衡影响;
- 一个进程内有 4 个线程,在 4 核机器上未必真并行——若调度器把它们全压在一个核心的两个逻辑线程上,那仍是并发;反之,若分散到 4 个物理线程,则是真并行。
怎么看自己系统的真实情况?
不靠猜,靠工具验证:
- Linux 下用 top 或 htop,观察 CPU 使用率是否多核同时活跃;
- 用 ps -T -p
查看某进程的线程数及其状态(R=运行、S=休眠); - 用 lscpu 确认物理核心数和逻辑线程数;
- 写一段多线程程序(如 Java 的 ForkJoinPool 或 C++ std::thread),配合 perf 或 /proc/
/stat 观察线程是否真实分布在不同 CPU 上运行。











