
📚 目录
-
-
2.1 先来先服务(FCFS)
-
2.2 短作业优先(SJF)
-
2.3 时间片轮转(RR)
-
2.4 优先级调度(PS)
-
2.5 多级反馈队列(MLFQ)
-
1. 任务调度算法简介
任务调度算法是操作系统的核心组成部分,负责决定CPU如何分配时间片给多个进程。其主要目标是:
-
⏳ 公平性:确保每个进程都能获得CPU时间
-
🚀 高效性:最大化系统吞吐量
-
⚖️ 响应性:快速响应高优先级任务
2. 经典调度算法详解
2.1 先来先服务(FCFS)
特点:
-
非抢占式调度
-
简单易实现
-
可能导致“护航效应”(长进程阻塞短进程)
示例:
// FCFS伪代码
queue = new Queue();
while (process in ready_queue) {
current = queue.dequeue();
execute(current);
}
计算公式:
-
周转时间 = 完成时间 - 到达时间
-
带权周转时间 = 周转时间 / 服务时间
2.2 短作业优先(SJF)
特点:
-
分为非抢占式(SJF)和抢占式(SRTF)
-
最小化平均等待时间
-
可能导致长作业饥饿
流程图:
是
否
新进程到达
是否有更短作业?
抢占当前进程
继续执行当前进程
2.3 时间片轮转(RR)
特点:
-
每个进程分配固定时间片
-
适用于分时系统
-
上下文切换开销较大
关键参数:
-
时间片大小(通常为10-100ms)
-
就绪队列管理策略
2.4 优先级调度(PS)
特点:
-
静态优先级 vs 动态优先级
-
可能导致优先级反转问题
-
解决方案:优先级继承、老化技术
示例:
# 动态优先级调整 def adjust_priority(): for p in processes: if p.wait_time > threshold: p.priority += 1
2.5 多级反馈队列(MLFQ)
特点:
-
结合RR和优先级调度的优点
-
现代操作系统常用算法(如Linux CFS)
队列设计:
| 队列级别 | 时间片大小 | 调度策略 |
|---|---|---|
| 0 | 8ms | 抢占式RR |
| 1 | 16ms | 非抢占式FCFS |
| 2 | 32ms | 后台批处理 |
3. 调度算法对比与选择
| 算法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| FCFS | 批处理系统 | 实现简单 | 护航效应严重 |
| SJF | 科学计算 | 平均等待时间最短 | 长作业可能饥饿 |
| RR | 分时系统 | 响应时间有保障 | 上下文切换开销大 |
| MLFQ | 通用操作系统 | 平衡响应与吞吐量 | 参数配置复杂 |
4. 现代操作系统中的调度实践
Linux CFS调度器
-
采用红黑树管理进程
-
虚拟运行时间计算: $$ vruntime = \frac{实际运行时间 \times 1024}{权重} $$
Windows调度器
-
基于优先级的抢占式调度
-
实时线程优先级(16-31)
-
动态提升前台程序优先级
5. 面试常见问题
-
周转时间 vs 响应时间的区别?
-
如何解决优先级反转问题?
-
优先级继承协议
-
优先级天花板协议
-
-
为什么说SJF是最优的?
-
数学证明:通过交换论证法可证其平均等待时间最短
-
-
多核调度面临的挑战?
-
缓存亲和性问题
-
负载均衡策略
-
📌 小贴士:理解调度算法的最佳方式是动手实现模拟器!推荐使用Python编写进程调度模拟程序,可视化不同算法的执行过程。需要代码示例可以在评论区留言哦~
**文章亮点说明**: 1. 采用分层目录结构,支持锚点跳转 2. 融合代码示例、数学公式和流程图 3. 添加实际系统案例(Linux/Windows) 4. 包含面试常见考点总结 5. 使用emoji和视觉元素增强可读性 符合优快云技术博客的典型风格,适合作为操作系统学习的参考资料。需要补充代码实现细节或扩展某个算法解析,可以随时留言讨论!
727



被折叠的 条评论
为什么被折叠?



