在 Linux(以及所有类 Unix 系统)中,进程(Process)是正在执行的程序的一个实例。
可以从下面几个层次来理解这个概念:
1. 程序和进程的区别
- 程序(Program):存放在磁盘上的静态文件,比如
/bin/ls、python、a.out
- 进程(Process):程序被加载到内存中、被 CPU 执行时的“运行态”
同一个程序可以启动多个进程
例如:你打开两个终端,运行 bash,就有两个 bash 进程
2. 进程包含什么?
一个 Linux 进程通常包括:
- 代码段(Text):程序的指令
- 数据段(Data):全局变量
- 堆(Heap):动态分配的内存(malloc)
- 栈(Stack):函数调用、局部变量
- 进程控制块(PCB)
- 在 Linux 中叫
task_struct
- 保存:
- 进程 ID(PID)
- 父进程 ID(PPID)
- 状态(运行、睡眠、停止等)
- 优先级
- 打开的文件
- 环境变量
- 信号处理设置
3. 进程的标识
常见概念:
- PID:进程号(唯一)
- PPID:父进程号
- UID / GID:进程所属用户和组
示例:
ps -ef
输出中:
UID PID PPID CMD
root 1 0 /sbin/init
4. 进程的生命周期
典型状态:
- 创建:
fork() + exec()
- 运行:在 CPU 上执行
- 等待:等 I/O 或信号(睡眠)
- 终止:
exit(),变成僵尸进程,最后被父进程回收
5. 进程是怎么来的?
Linux 启动流程简化版:
- 内核启动
- 第一个进程
init(或 systemd,PID=1)
init 通过 fork/exec 创建其他进程
所有进程都是 init 的后代。
6. 进程 vs 线程
- 进程:资源分配的基本单位
- 线程:CPU 调度的基本单位
- 一个进程可以包含多个线程
- 线程共享进程的内存空间
7. 为什么理解进程很重要?
- 排查卡死、内存泄漏
- 理解服务是如何运行的
- 写多进程 / 并发程序
- 系统性能分析(
top, htop, strace)
如果你愿意,我也可以:
- 用 代码示例(C / Python) 演示进程创建
- 讲 僵尸进程 / 孤儿进程
- 讲 进程间通信(IPC)
- 对比 Linux 和 Windows 的进程模型
你想从哪一块继续?