一、为什么需要进程 早期的计算机一次只能运行一个程序。程序运行到一半要等磁盘 I/O,CPU 就只能空转。为了让 CPU 不闲着,操作系统把「正在运行的程序」这个概念抽象出来,这就是进程。 进程是资源分配的基本单位:它拥有独立的虚拟地址空间、文件描述符表、信号处理表。进程之间默认互相隔离,一个进程崩溃通常不会影响另一个进程。 二、进程和线程的区别 线程是 CPU 调度的基本单位,它寄生在进程里。同一个进程内的多个线程共享地址空间和打开的文件,只各自持有栈、寄存器和程序计数器。
因此线程切换比进程切换便宜得多:进程切换要换页表、刷 TLB,线程切换基本只保存寄存器。代价是线程之间没有隔离,一个线程写坏了共享内存,整个进程都会遭殃。 三、并发不等于并行 并发指的是「一段时间内多个任务都在推进」,并行指的是「同一时刻多个任务真正同时执行」。单核 CPU 上只能并发:操作系统用时间片轮转,每几毫秒切换一次,宏观上看起来像同时在跑。 多核 CPU 上才谈得上并行。但并行也不是免费的:多个核心同时读写同一块数据,就必须用锁、原子操作或者无锁数据结构来保证正确性。 四、同步阻塞与同步非阻塞 同步阻塞:调用发起后,线程一直挂在那里等结果返回,期间什么也做不了。这是最简单也最符合直觉的模型。