1. 进程与线程:核心差异(基础概念)
| 维度 |
进程 |
线程 |
决策点 |
| 本质 |
资源分配单位(独立虚拟地址空间) |
执行单元(共享进程资源) |
隔离性要求高 → 选进程;性能敏感 → 选线程 |
| 创建开销 |
高(复制页表、文件描述符等) |
低(仅分配栈和寄存器) |
启动频繁任务 → 优先线程 |
| 崩溃影响 |
仅自身终止,不影响其他进程 |
崩溃导致整个进程终止 |
安全关键系统 → 用进程隔离 |
| 典型场景 |
浏览器标签页隔离、沙盒环境 |
Nginx多线程处理请求、GUI事件循环 |
高并发I/O服务 → 线程池优化 |
2. 进程状态:生命周期全景(状态驱动管理)
状态转换逻辑 :新建 → 就绪 → 运行 → [阻塞/终止] → 终止
(关键:状态决定调度策略与操作方式)
| 状态 |
定义 |
触发条件 |
Linux表示 |
关注点 |
| 新建 |
进程创建中(分配PCB) |
fork()系统调用 |
- |
避免进程风暴(如fork爆炸) |
| 就绪 |
资源就绪,等待CPU调度 |
等待时间片分配 |
R |
高CPU利用率 → 优化调度策略 |
| 运行 |
正在CPU执行指令 |
被调度器选中 |
R |
CPU瓶颈 → 检查top的%CPU |
| 阻塞 |
等待外部事件(I/O/信号量) |
磁盘读取、网络请求未完成 |
D(不可中断) S(可中断) |
高I/O等待 → 用异步IO(如epoll) |
| 终止 |
执行结束或被强制终止 |
pkill,killall或kill -9 |
Z(僵尸) |
僵尸进程 → 必须用wait()回收 |
| 挂起 |
暂停执行(换出内存) |
kill -STOP或内存不足 |
T |
调试时暂停进程 |
3. 进程管理命令:状态操作实战(命令驱动状态)
| 命令 |
核心作用 |
关联状态 |
典型场景 |
技巧 |
ps aux |
查看实时状态(含状态字段) |
显示R/S/D/Z/T |
`ps aux |
grep nginx` → 检查进程状态 |
top -o %CPU |
实时监控资源与状态 |
动态更新运行/阻塞 |
排查CPU瓶颈(%CPU高且状态为R) |
按Shift+P按CPU排序 |
kill -9 PID |
强制终止进程(无视状态) |
终止运行/阻塞状态 |
进程卡死时快速回收 |
仅作最后手段(避免数据丢失) |
bg/fg |
作业前台/后台切换(状态转换) |
转换前台→后台/反之 |
Ctrl+Z挂起后→ bg 1%转后台 |
后台任务需nohup保活(终端关闭不终止) |
nohup ./script.sh & |
使进程脱离终端独立运行 |
保持后台状态 |
长任务(如数据处理) |
避免&导致终端关闭终止进程 |
4. 前台/后台作业:作业调度实践(状态操作子集)
| 类型 |
状态本质 |
关键约束 |
转换逻辑 |
| 前台作业 |
占用终端,阻塞交互 |
终端关闭 → 进程终止 |
启动:./script.sh 挂起:Ctrl+Z → 转为阻塞状态 |
| 后台作业 |
独立运行,不占用终端 |
无终端输入,需nohup保活 |
启动:./script.sh & 转前台:fg %1 → 转为运行状态 |
避坑:
- 后台任务必须用
nohup或screen,否则终端关闭后进程被SIGHUP终止。
bg仅转换作业状态,不解决终端依赖问题。
5. IPC与RPC:进程间通信(状态外延)
核心区别:IPC是本地进程通信,RPC是跨网络的远程调用。
| 机制 |
原理 |
实现技术 |
选择依据 |
| IPC |
基于内核共享资源(无网络开销) |
共享内存 + 信号量<br>消息队列 |
本地模块通信(如微服务内部) → 首选共享内存(性能最优) |
| RPC |
网络封装远程调用(抽象协议) |
gRPC(Protobuf序列化)<br>Thrift |
跨机房服务调用(如电商下单系统) → 首选gRPC(高效、强类型) |
为什么不用IPC做跨机通信?
IPC依赖本地文件系统/内核,无法穿透网络 → RPC通过TCP/HTTP解决网络层问题。
6. 决策:技术选型全景图(终极指南)
| 场景 |
方案 |
为什么? |
避坑提示 |
| 安全隔离(如支付系统) |
进程 + 容器化 |
进程崩溃不扩散,容器提供额外隔离 |
避免用线程做安全边界 |
| 高并发I/O(如Web服务) |
线程池 + 异步IO(epoll) |
线程共享资源减少上下文切换,异步避免阻塞 |
线程数 = CPU核心数 × 2 |
| 跨机房数据同步 |
RPC(gRPC) |
网络透明化调用,Protobuf高效序列化 |
避免用IPC做远程通信 |
| 本地模块高效协作 |
共享内存 + 信号量 |
0拷贝传输,比消息队列快10倍+ |
需处理同步(信号量/互斥锁) |
| 长任务后台运行 |
nohup + & + 日志重定向 |
终端关闭不终止,日志独立存储 |
用nohup ./script.sh > log.txt 2>&1 & |