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 & |