调度算法的学习
先来先服务
什么是 FCFS?
顾名思义,就是:
哪个进程最先到达,就最先被CPU执行,执行完了才轮到下一个。
就像你去饭堂排队,谁先排队,谁先打饭,排在后面的只能等前面的一个一个处理完。
🧠 工作流程(通俗解释)
-
进程到达系统,按顺序排队(就像排队打饭)
-
CPU从队头选一个进程运行
-
一旦开始运行,就不打断,直到运行完
-
然后选下一个进程……
周转时间 = 完成时间 - 到达时间
从进程提交到系统,到它完全执行完毕,花了多久。
等待时间 = 周转时间 - 执行时间(服务时间)
一个进程在就绪队列中“白等”的时间,不包括它真正执行的那段时间。
进程 | 到达时间 | 服务时间(执行时间) | 完成时间 | 周转时间 | 等待时间 |
---|---|---|---|---|---|
P1 | 0 | 5 | 5 | 5 | 5 - 5 = 0 |
P2 | 1 | 3 | 8 | 7 | 7 - 3 = 4 |
P3 | 2 | 1 | 9 | 7 | 7 - 1 = 6 |
短作业优先
什么是短进程优先算法(SJF)?
SJF 是一种优先让“执行时间短”的进程先执行的调度算法。
也就是说:
🕐 谁的任务短,就让谁先跑!
🧠 举个直观的例子:
你排队吃饭的时候,如果队伍中有人只要打一瓶水,而你要点三个菜五个包子,食堂阿姨就说:
👉“打水的先来,快得很!”
这就类似于短进程优先。
举个调度例子:
进程 | 到达时间 | 执行时间(服务时间) |
---|---|---|
P1 | 0 | 7 |
P2 | 2 | 4 |
P3 | 4 | 1 |
P4 | 5 | 4 |
按 非抢占式SJF 排序:
P1——>P3——>P2——>P4
SJF 有两种类型:
类型 | 描述 |
---|---|
非抢占式 SJF | 一旦进程开始执行,就不会中途被打断。 |
抢占式 SJF(也叫 SRTF) | 如果来了一个更短的任务,就会打断当前进程,把短的插进去。 |
高响应比优先算法
时间片轮转算法
优先级调度算法
非抢占
抢占
什么是多级队列调度算法?
多级队列调度算法(Multilevel Queue Scheduling):
把就绪的进程按类型或优先级分到多个队列中,不同的队列可以使用不同的调度算法,队列之间也有自己的优先级顺序。
📘 通俗比喻:
想象一个医院分诊系统:
-
急诊队列(优先处理)
-
普通门诊队列
-
体检排队队列(最慢)
每类病人排在不同窗口,窗口之间优先级也不一样 —— 这就像多级队列调度。
🧠 多级队列的结构:
通常会分为几种队列,比如:
队列名 | 进程类型 | 可能的调度算法 |
---|---|---|
高优先级队列 | 系统进程 / 前台任务 | 时间片轮转 |
中等优先级队列 | 一般用户进程 | 先来先服务 |
低优先级队列 | 后台进程 / 守护进程 | 最短作业优先 |
多级队列调度的特点:
特点 | 描述 |
---|---|
🧊 队列之间不混合 | 进程一旦进某个队列,不跨队列移动(固定多级队列) |
⏫ 队列有优先级 | 高优先级队列先调度,低的要等 |
🧠 每个队列可用不同算法 | 某队列用先来先服务,另一个用时间片轮转 |
💼 分类清晰 | 根据进程“类型”或“服务级别”分类管理 |
举个例子(3个队列):
队列名 | 进程类型 | 调度方式 |
---|---|---|
Q0(最高) | 系统前台进程 | 时间片轮转 |
Q1(中等) | 用户一般进程 | 先来先服务 |
Q2(最低) | 后台维护进程 | 短作业优先 |
系统调度时先看 Q0,有进程就只跑 Q0,Q0 空了才看 Q1,以此类推。