1. 批处理系统
1.1 先来先服务(FCFS)
- 当一个进程就绪后,就加入就绪队列。CUP会根据进入就绪队列的先后顺序依次执行各个进程。
- 不利于短作业以及IO繁忙的作业,如果短作业后加入队列则需要等待好久
- 可以用于作业调度也可以用于进程调度
1.2 短作业优先(SJF)
- 每次开始调度进程时,选择作业执行时间最短的那个进程进行执行。
- 通常后来的短作业不可抢占正在执行的作业
- 缩短了作业的等待时间,提高了系统的吞吐量
- 对长作业不利,可能会陷入饿死状态,而且难以估计作业执行时间
1.2 最短剩余作业优先
- 短作业优点的可抢占情况。
- 若在执行过程中来了一个执行时间更短的进程,则抢断当前执行的进程,让这个更短的运行
2. 交互式系统
2.1 时间片轮转法
- 主要用于分时系统。也是将就绪进程依次放入就绪队列。实行先来先服务原则
- 但是每个进程只允许一个时间片就切换
- 进程可以在这个时间片内主动放弃使用CPU,而不必要等时间片用完
- 如果时间片设置的过短,则会造成进程频繁切换,产生系统开销
- 若时间片过长,就退化为了先来先服务
2.2 优先级调度算法
- 根据进程的优先级进行调度
2.3 多级反馈优先队列
- 设计多个就绪队列,分别赋予不同的优先级,如依次降低优先级,优先级越高的队列获得执行时间片就越长 (但优先级越高的队列,时间片越小)
- CPU选择先按照优先级选择队列,再按照队列进行FCFS调度选择进程
- 当有新进程进入提交后,先放入优先级最高的队列队尾,一个时间片还没运行玩就降级到下一个优先级队列中去
- 仅当优先级较高的队列为空时,才调度优先级较低的队列中的进程执行,如果此时有新的进程加入优先级高的队列,则抢先执行新新进程,并把被抢断的进程放到原队列的队尾
- 提高了系统吞吐率和也照顾了短进程和IO型进程
2.4 高响应比优先
- 主要用于作业调度。
- 是对先来先服务和短作业优先调度的一种综合平衡
- 首先会优先执行短作业,但是如果长作业等待时间过长就执行长作业
- 通过计算每个作业的响应比,从中选择响应比最高的作业进行运行。
- 响应比:(等待时间+要求服务的时间)/ 要求服务的时间
一些基本概念
- 运行时间:作业需要运行的时间
- 周转时间:作业完成时间点 — 作业提交时间点
- 等待时间:周转时间 — 运行时间
- 响应时间:首次产生响应的时间点 — 作业提交时间点
- 带权周转时间:周转时间/运行时间
3. Linux中的进程调度算法
void Schedule(void) {
while (1) {
c = -1; next = 0; i = NR_TASKS;
p = &task[NR_TASKS];
while (--i){
if (p->state == TASK_RUNNING && p->counter > c) {
c = p->counter; next = i;
}
}
if (c) break;
for (p = &LAST_TASK; p > &FIRST_TASK; --p) {
p->counter = p->counter >> 1 + p->priority;
}
}
switch_to(next);
}
- counter:即代表了任务的优先级,有代表任务的时间片大小
- 首先会在就绪任务中选择优先级最大的任务执行,它的时间片也是counter值
- 若就绪任务中的所有的counter都为0(就绪任务的时间片都用完了),将所有任务的counter先除以2再加上一个初始值priority。
- 这样做阻塞的任务它的优先级会越来越大,当阻塞任务停止阻塞,它会优先被执行
- 而且阻塞任务优先级最高趋近与2*priority