1.4 线程、并发与并行
前置知识:进程与内存
预计时间:8–12 分钟
完成标志:能区分线程、并发和并行,并说明调度器在其中的作用
三个任务都已启动:一个等待网络,一个解析文件,一个计算结果。它们的生命周期可以重叠,但某一时刻真正占用单个逻辑 CPU 的可能只有一个。
“同时没做完”和“同一时刻都在执行”不是一回事。前者帮助我们理解并发,后者才是并行。
线程是调度单位
一个正常运行的用户进程通常至少有一个线程。线程是现代操作系统调度器安排执行的基本单位;同一进程内的线程共享地址空间和多数进程资源。共享让通信便宜,也让一个错误的写入有机会破坏其他线程正在使用的数据。
- 并发:多个任务的生命周期重叠,可以在一个逻辑 CPU 上交错推进。
- 并行:多个执行资源在同一时刻推进不同任务。
并发适合组织等待 I/O、处理多个请求或拆分独立工作;并行才会直接利用多个逻辑 CPU 同时计算。两者可以同时存在。
调度模型的边界
入门材料常说“每个核心一次只做一件事,系统每 30 毫秒切换一次”。真实情况更复杂:
- 调度器把可运行线程分配给逻辑 CPU;
- 线程会因 I/O、锁、睡眠、优先级或抢占而暂停;
- 调度间隔由内核、负载和策略决定,没有统一 30 ms;
- 流水线、乱序执行、向量单元和 SMT 让“核心一次一条指令”也只是近似。
对这章而言,只要记住:进程提供资源边界,线程执行工作,调度器决定可运行线程何时在哪个逻辑 CPU 上推进。
观察线程快照
ps -eLo pid,tid,psr,stat,%cpu,comm | head -20类型: runnable环境: Linux procps ps观察: PID 是进程号,TID 是线程号,PSR 是采样附近使用的逻辑 CPU。一次快照不能证明线程一直固定在该 CPU。
macOS 可以用活动监视器查看线程数,或根据本机 ps 帮助选择字段。Windows PowerShell 可运行 Get-Process | Select-Object -First 10 Name,Id,Threads,其中 Threads 是线程对象集合,不是 CPU 并行度。
两个常见误区
运行很多进程等于所有进程同时占用 CPU。 很多进程在等待输入、网络、锁或定时器,采样时并不可运行。
浏览器一个标签等于一个进程。 浏览器会按站点、渲染器、扩展、GPU 和安全策略拆分或复用进程,模型随版本和配置变化。
用一次观察收尾
找一个多线程应用,记录它的进程号和线程数量,再解释这张快照为什么不能证明所有线程都在并行。若你还能举出一个“任务交错推进、但只有一个逻辑 CPU”的例子,并发与并行的边界就算站稳了。
下一页的探索系统实验会把本章所有观察串起来。