进程 vs 线程

独立内存 vs 共享内存,fork / thread

商用

◎学完你会

1进程独立内存,线程共享内存

进程有独立地址空间(彼此隔离),线程共享同一进程的地址空间(含全局数据)。

进程:独立内存、独立 PID
线程:共享内存、同进程内
看进程与线程的差别。

2关键命令

写法含义
fork()Unix 创建子进程(复制父进程地址空间,返回两次)
std::thread t(f);在同一进程内创建线程,共享内存(见 33.1)
getpid() / getppid()取当前 / 父进程 PID
ps / top查看系统进程
✅ 进程之间默认不共享数据(改不了对方的全局变量),要跨进程传数据得靠 IPC(见 34.4);线程天然共享,但要用锁防竞态(见 33.2)。

3进程 vs 线程:怎么选

维度进程线程
地址空间独立共享(同进程)
隔离性强(一方崩溃不影响其他进程)弱(线程崩溃常拖垮整个进程)
开销大(复制/独立资源)小(轻量)
通信需 IPC(管道/共享内存等)直接共享内存(需锁)
创建fork()std::thread
经验:需要强隔离/可靠性(浏览器标签页、崩溃不影响主程序)用进程;需要高性能共享数据(高频协作计算)用线程,但务必处理好锁。

!易错点

① 以为线程间数据默认安全——共享是默认的,但无锁就会竞态。
② fork 后以为子进程能改父进程变量——进程地址空间独立,改的是各自的副本。
③ fork 在多线程程序里用——子进程只保留调用线程,易出问题,慎用。
④ 用进程做高频小任务——进程创建开销大,适合重型隔离任务。

?跨学科:进程与线程,像"独立房间"与"合租室友"

进程 像每个人住独立房间(独立地址空间):各用各的桌子、柜子,互不干扰,一人着火不影响别人(隔离强),但想借东西得走公共通道(IPC),且搬家成本高(开销大)。

线程 像同一套房合租的室友(共享地址空间):共用客厅和厨房(共享数据),沟通方便高效,但有人乱动公共东西(无锁竞态)就会吵起来(崩溃拖垮全屋)。选独立房间还是合租,看你要安全隔离还是高效共享。

✎练一练

关于进程,下列说法正确的是?
进程拥有独立地址空间、彼此隔离;要传数据须用 IPC(管道/共享内存等)。
与进程相比,线程的特点通常是?
线程共享地址空间、更轻量、通信高效,但共享需锁防竞态,隔离性弱于进程。
优先选进程而非线程的典型场景是?
需要强隔离/可靠(崩溃不影响其他部分)时用进程;高频共享数据或轻量任务更适合线程。