一、进程基础概念
1.1 进程定义
1.2 进程描述符(task_struct)
- current宏:查找当前正在运行进程的进程描述符
- 硬件体系结构差异:有的用专用寄存器存放指针,有的通过计算偏移间接查找
1.3 进程标识(PID)
- 默认最大值32768(short int最大值),兼容旧版UNIX/Linux
- 可通过
/proc/sys/kernel/pid_max修改上限
1.4 内存分配机制
- slab分配器:预先分配和重复使用task_struct,避免动态分配的资源消耗
二、进程类型
2.1 用户进程
2.2 守护进程
2.3 批处理进程
三、进程创建
3.1 创建步骤
3.2 进程队列管理
四、进程队列
4.1 运行队列
4.2 等待队列
五、进程状态
5.1 五种基本状态
| | |
|---|
| | |
| | |
| | |
| | |
| TASK_STOPPED / TASK_TRACED | |
5.2 状态转换流程
就绪态 → 运行态 → 睡眠态(可中断/不可中断)→ 就绪态 → 运行态 → 僵尸态 → 销毁
5.3 进程查看命令
- STAT字段含义:R(运行)、S(睡眠)、D(不可中断睡眠)、Z(僵尸)、T(停止)
- 组合状态:S+(前台睡眠)、Sl(多线程睡眠)、Ss(会话首进程睡眠)等
六、进程调度
6.1 基本概念
6.2 时间片机制
6.3 多任务模式
- 抢占式多任务:由调度程序决定何时停止进程(Linux采用)
七、虚拟内存
7.1 基本概念
- 提供比物理内存大得多的虚拟空间(32位系统为4GB)
7.2 地址空间划分
7.3 地址映射机制
- 段机制:逻辑地址 → 线性地址,隔离用户数据和系统数据
- 页机制:线性地址 → 物理地址,页大小通常为4KB
7.4 特权切换
八、进程控制编程
8.1 启动进程
execl、execv、execle、execve、execlp、execvp
8.2 创建进程
getpid() / getppid():获取当前进程ID / 父进程ID
8.3 等待进程
8.4 终止进程
- 正常终止(5种):
exit、_exit、return、被信号终止等 - 异常终止(3种):
SIGILL、SIGABRT、SIGSEGV、SIGBUS等
8.5 守护进程
- 创建步骤:fork、setsid、重定向标准输入输出、关闭文件描述符
九、进程间同步机制
9.1 文件锁
9.2 线程锁(细粒度控制)
9.3 锁的粒度
十、进程间通信(IPC)
10.1 通信方式对比
10.2 管道
- 无名管道(Anonymous Pipe):亲缘进程间,单向,先进先出
- 命名管道(Named Pipe / FIFO):任意进程间,有文件名
- 标准流管道(Standard Stream Pipe):基于标准输入输出
10.3 消息队列
- API:
msgget(创建)、msgsnd(发送)、msgrcv(接收)、msgctl(控制)
10.4 信号
- 处理方式:默认处理、忽略信号、捕捉信号(自定义处理函数)
- 常用信号:
SIGINT、SIGTERM、SIGKILL、SIGSEGV、SIGCHLD、SIGALRM等 - 相关函数:
signal()、sigaction()、kill()、raise()、alarm()、pause()、abort()
10.5 信号量
- 操作:P操作(wait/等待)、V操作(signal/释放)
- 操作信号量:等待(
sem_wait)、释放(sem_post)
10.6 共享内存
十一、综合应用要点
- 进程创建 → 调度执行 → 同步互斥 → 通信协作 → 终止回收
- 不同IPC方式的选择依据:数据量、速度要求、进程关系、是否需要跨网络