进程与线程

程序是静态的代码和数据;运行起来后,操作系统为它建立执行环境。

两种不同的关注点

概念关注点
进程地址空间、资源与隔离边界
线程进程中的执行路径,是常见的调度单元

同一进程内的线程通常共享地址空间和打开的文件等资源,但拥有各自的栈与寄存器执行状态。

并发与并行

并发强调多个任务在同一时间段内推进。即使只有一个 CPU 核心,也能通过切换任务实现并发。

并行强调多个任务在同一时刻执行,通常需要多个可用的执行资源。

共享状态带来的问题

对计数器执行 count = count + 1,概念上包含读取、计算、写回。两个线程交错执行,可能覆盖彼此的更新。

线程 A 读取 0      线程 B 读取 0
线程 A 计算 1      线程 B 计算 1
线程 A 写回 1      线程 B 写回 1

最终结果可能为 1,而不是期望的 2。具体行为还取决于语言内存模型;有些语言中的未同步数据竞争属于未定义行为。

同步思路

  • 用互斥锁保护需要保持一致的操作。
  • 对合适的简单操作使用语言提供的原子类型。
  • 尽量减少共享可变状态,采用消息传递或明确的数据所有权。

线程越多不一定越快。切换、协调和竞争也有成本,应结合任务类型进行测量。