进程管理的详细总结
目录
1. 进程状态(Process States)
五大基本状态
现代操作系统的扩展状态
2. 进程调度算法(Scheduling Algorithms)
(1)先来先服务(FCFS)
(2)最短作业优先(SJF)
(3)优先级调度(Priority)
(4)时间片轮转(Round Robin, RR)
(5)多级反馈队列(MLFQ)(现代系统常用)
3. 进程同步(Process Synchronization)
(1)临界区问题(Critical Section)
(2)同步机制
(3)经典问题
4. 死锁(Deadlock)
(1)死锁的四个必要条件
(2)死锁处理策略
(3)实际系统中的解决方案
关键对比与总结
现代演进方向
==
1. 进程状态(Process States)
五大基本状态
状态 | 描述 | 转换条件 |
---|---|---|
新建 | 进程刚被创建(如fork() ),尚未分配资源。 | → 就绪(资源就绪后由调度器分配CPU时间) |
就绪 | 进程已获得除CPU外的所有资源,等待被调度。 | → 运行(被调度器选中) |
运行 | 进程占用CPU执行指令。 | → 就绪(时间片用完)→ 阻塞(等待I/O/信号量等事件) |
阻塞 | 进程因等待事件(如I/O完成、锁释放)暂停执行。 | → 就绪(事件发生后被唤醒) |
终止 | 进程执行完毕或被强制终止(如exit() ),资源被回收。 | 无 |
现代操作系统的扩展状态
- 挂起(Suspend):进程被换出到磁盘(如Linux的
TASK_STOPPED
)。 - 僵尸(Zombie):子进程终止但父进程未调用
wait()
,保留PCB供父进程读取退出状态。
2. 进程调度算法(Scheduling Algorithms)
(1)先来先服务(FCFS)
- 规则:按进程到达顺序分配CPU。
- 特点:
- 非抢占式:当前进程运行到结束或阻塞。
- ** convoy效应**:短进程可能因长进程阻塞而等待过久。
- 适用场景:批处理系统。
(2)最短作业优先(SJF)
- 规则:优先调度预计执行时间最短的进程。
- 变种:
- 抢占式(SRTN):新进程到达时,若其执行时间比当前剩余时间更短,则抢占CPU。
- 缺点:需要预知进程运行时间(实际通过历史数据预测)。
(3)优先级调度(Priority)
- 规则:按优先级分配CPU,优先级可静态(固定)或动态(随等待时间调整)。
- 问题:饥饿(低优先级进程长期得不到执行)。
- 解决方案:老化(Aging),逐步提高等待进程的优先级。
(4)时间片轮转(Round Robin, RR)
- 规则:每个进程分配固定时间片(如10ms),超时后放入就绪队列尾部。
- 关键参数:
- 时间片大小:过长退化为FCFS,过短增加上下文切换开销。
- 适用场景:分时系统(如Linux默认的CFS调度器改进版)。
(5)多级反馈队列(MLFQ)(现代系统常用)
- 规则:
- 多个优先级队列,高优先级队列时间片更短。
- 新进程进入最高优先级队列,若时间片用完未结束则降级。
- 低优先级队列中的进程可被提升优先级(防止饥饿)。
- 优势:平衡响应时间(短作业优先)和吞吐量(长作业不饿死)。
3. 进程同步(Process Synchronization)
(1)临界区问题(Critical Section)
- 核心要求:
- 互斥:同一时间仅一个进程进入临界区。
- 前进:无进程在临界区时,其他进程可竞争进入。
- 有限等待:进程等待进入临界区的时间必须有限。
(2)同步机制
机制 | 原理 | 示例 |
---|---|---|
信号量 | 计数器+等待队列,通过P() (申请资源)和V() (释放资源)操作。 | semaphore mutex = 1; (互斥锁) |
管程 | 高级抽象,封装共享变量和操作(如Java的synchronized )。 | 条件变量(wait() /signal() ) |
原子指令 | 硬件支持(如CAS, TAS),实现无锁数据结构。 | xchg 指令实现自旋锁 |
(3)经典问题
- 生产者-消费者:通过信号量解决缓冲区同步。
- 读者-写者:读写锁(读者可并发,写者需独占)。
- 哲学家就餐:避免死锁(如限制最多4人拿筷子)。
4. 死锁(Deadlock)
(1)死锁的四个必要条件
- 互斥:资源一次只能被一个进程占用。
- 占有并等待:进程持有资源的同时等待其他资源。
- 非抢占:已分配的资源不能被强制剥夺。
- 循环等待:存在进程资源的环形等待链(如P1等P2的资源,P2等P1的资源)。
(2)死锁处理策略
策略 | 方法 | 缺点 |
---|---|---|
预防 | 破坏四个必要条件之一(如资源一次性分配)。 | 资源利用率低 |
避免 | 动态检查资源分配状态(如银行家算法)。 | 计算开销大,需预知最大需求 |
检测与恢复 | 定期检测死锁(如资源分配图),通过终止进程或回滚恢复。 | 恢复可能导致数据丢失 |
忽略 | 如Linux/Windows默认策略,假设死锁概率低。 | 适用于通用系统 |
(3)实际系统中的解决方案
- 锁顺序:所有进程按固定顺序申请资源(破坏循环等待)。
- 超时机制:获取锁超时后释放已持有资源(如数据库死锁检测)。
关键对比与总结
概念 | 核心目标 | 典型实现 |
---|---|---|
进程调度 | 公平性 vs 吞吐量 vs 响应时间 | Linux CFS(基于虚拟时间片) |
进程同步 | 安全访问共享资源 | 互斥锁(pthread_mutex_t ) |
死锁避免 | 平衡安全性与效率 | 开发规范(如锁顺序约定) |
现代演进方向
- 实时调度:优先级反转解决方案(如优先级继承)。
- 无锁编程:基于CAS的并发数据结构(如Redis的跳表)。
- 分布式死锁检测:适用于微服务架构(如两阶段提交的超时回滚)。
理解这些机制有助于设计高并发、低延迟的系统,并避免常见陷阱(如死锁、竞态条件)。