线程和进程,还有多个进程,和多个线程之间的关系
用一个厨房做菜的比喻来帮你理解进程、线程、多进程和多线程之间的关系:
基础概念
进程 = 独立的厨房
- 每个厨房有独立的空间(内存)、全套厨具(资源)和菜谱(程序代码)
- 不同厨房之间食材不能直接传递(进程隔离),必须通过外卖员送餐(IPC进程通信)
线程 = 厨房里的厨师
- 同一厨房的多个厨师共享冰箱里的食材(共享进程内存)
- 厨师之间可以直接喊话沟通(线程通信成本低)
- 一个厨师烧糊了菜可能导致整个厨房停摆(线程崩溃影响整个进程)
场景演示
1️⃣ 单进程单线程
👉 场景:老王一个人在小厨房做宫保鸡丁
- 切菜 → 炒肉 → 炒花生米 → 混合调味(严格按顺序执行)
- 缺点:油锅空烧等肉切好,效率低下
2️⃣ 单进程多线程
👉 场景:老王雇了3个厨师在同一厨房协作
- 厨师A切菜 🔪
- 厨师B烧油锅 🔥
- 厨师C准备调料 🧂
- 优势:并行操作缩短总耗时(线程共享厨房资源)
- 风险:如果多个厨师同时抢酱油瓶会打翻(需互斥锁控制资源访问)
3️⃣ 多进程
👉 场景:连锁餐厅在不同城市开分店
- 北京店做烤鸭 🦆(进程1)
- 上海店做小笼包 🥟(进程2)
- 广州店煲汤 🍲(进程3)
- 优势:某个分店着火不会影响其他分店(进程间隔离性强)
- 成本:分店间交流需要总部协调(进程通信开销大)
关键对比表
| 维度 | 多进程 | 多线程 |
|---|---|---|
| 资源开销 | 每个进程独立内存空间,开销大 | 共享进程资源,开销小 |
| 通信成本 | 必须用IPC机制(管道、Socket等),速度慢 | 可直接读写共享内存,速度快 |
| 崩溃影响 | 一个进程崩溃不影响其他进程 | 一个线程崩溃可能导致整个进程终止 |
| 适用场景 | 需要高稳定性(如浏览器多标签页) | 需要高效协作(如游戏渲染+物理引擎计算) |
现代软件典型结构
🌐 浏览器架构(多进程+多线程结合)
- 进程级隔离:每个标签页单独进程 → 防止页面崩溃导致整个浏览器关闭
- 线程级并行:单个页面内:
- 渲染线程 🎨 负责DOM解析
- JS引擎线程 📜 执行脚本
- 网络线程 🌐 加载资源
- GPU线程 🖥️ 加速渲染
💻 视频处理软件(多线程优化)
- 线程1:解码视频流
- 线程2:实时添加滤镜特效
- 线程3:音频同步处理
- 线程4:进度预览渲染 通过线程池管理充分利用多核CPU
底层原理透视
- 进程切换成本高:需要保存/恢复整个内存映射表(约3-5微秒)
- 线程切换成本低:仅切换寄存器+栈(约0.5-1微秒)
- NUMA架构影响:跨CPU核心的线程通信会有更高延迟
开发者的抉择时刻
选择多进程当:
- 处理不可信代码(如浏览器运行第三方插件)
- 需要利用多台机器分布式计算
选择多线程当:
- 处理计算密集型任务(如3D渲染)
- 需要快速响应事件(如游戏引擎)
混合使用案例:数据库系统
- 进程级:每个客户端连接独立进程保证安全
- 线程级:查询引擎内部用线程池加速SQL解析
通过这个厨房工作流的比喻,你应该能直观理解进程和线程如何在不同粒度上组织计算资源了吧?实际开发中通常需要根据安全性要求、资源类型和性能目标来灵活选择架构。

浙公网安备 33010602011771号