round-robin(RR)
公平地, 轮流的为各个进程服务,
让每个进程在一定时间间隔都可以得到响应
(周期响应)
按照各个进程到达就绪队列的顺序, 轮流让各个进程执行一个时间片
如果进程未在一个时间片内执行完, 则剥夺处理机, 将进程重新放入就绪队列末尾重新排队
例如100ms为一个时间片, 则处理机一次为每个进程服务100ms,
如果在这100ms内没有执行完, 则处理机转而为其他进程服务, 该进程下处理机, 放入就绪队列队尾, 重新排队等待被处理机服务
只用于进程调度, 针对进程, 只有在作业放入了内存建立了相应的进程后, 才会分配处理机时间片
属于抢占式算法
(如果一个时间片内进程没有执行完则剥夺处理机)
通过时钟装置发出时钟中断来通知cpu, 时间片已到
常用于分时系统, 更注重"响应时间"
优点:
公平, 响应快, 适用于分时系统
缺点:
进程切换频率高, 有一点开销,
不区分任务的紧急程度
不会导致饥饿
需要选择合适的时间片
考虑如果每个进程都可以在一个时间片内完成?
那么时间片轮转方法变成了先来先服务算法
根据时间片轮转算法, 第二个进程被响应的时间为第一个进程执行完或执行一个时间片
如果时间片过大, 可能某些进程的响应时间过大, 例如键盘输入, 时间片为10秒, 你可能需要等待10秒才会被响应
同样的时间片也不能太小, 太小会频繁切换进程, 导致进程切换开销较大, 处理机效率不高
随着计算机发展, 特别是实时操作系统的出现
越来越多的地方需要根据任务的紧急程度来决定处理程序
各个作业/进程有各自的优先级, 调度时选择优先级最高的
既可用于作业调度
也可用于进程调度
(还可以用于I/O调度)
有抢占式和非抢占式版本
非抢占式:
进程主动放弃处理机时进行调度
抢占式
在就绪队列发生变化时, 检查判断是否需要发生抢占
就绪队列未必只有一个, 可以按照不同的优先级来组织
也可以选择将优先级高的进程排在队头, 这样每次只需要提取队头进程
根据优先级初次确定后是否还可以动态改变, 可以将优先级分为静态优先级和动态优先级两种
静态优先级:
创建进程时确定, 确定后不改变
动态优先级:
创建进程时初次确定, 之后根据算法设定的某个角度进行动态的调整优先级
合理地确定进程的优先级? 一般来说:
1 系统进程优先级 高于 用户进程
2 前台进程 高于后台进程
3 操作系统更偏好I/O型进程(或称为I/O繁忙型)--------(与I/O型进程相对的是计算型进程, 或称CPU繁忙型进程)
何时调整优先级? 例如:
优缺点:
可能会发生饥饿
上题中的优先级数与优先级的关系, 要看具体题目给的具体情况, 可能按优先级数大的优先级高, 也可能是优先级数小的优先级高
结合多种算法, 折中
算法:
设置多级就绪队列, 各个队列优先级从高到底, 时间片从小到大
新进程放入第1级队列, 按FCFS排队等待分配时间片
如果进程时间片用完仍未结束, 则将其放入下一级队列末尾
如果当前执行队列是最下级队列, 则将时间片用完未完成的进程放入当前队尾
如果当前队列已空, 执行下一级队列
如果当前队列的上一级队列出现新进程, 则当前执行进程中断, 从新进程的队列开始执行
由上述算法的简述可见, 该算法为抢占式算法
在实现上也可以不完全遵从上述算法的简述, 可能将其改造为非抢占式算法,
但考试认准上述算法简述, 并认为该算法为抢占式算法
用于进程
优缺点:
上述SPF的优点具体的表现其实是多级队列各个队列的时间片逐渐增大,
先执行上面的队列(相当于先执行用时少的), 再执行下面的队列(再执行用时多的)
同时避免了SPF中可能出现的进程对所需时间的造假
对于上节提到的CPU密集型进程, 可以单独设置其执行完放入原队列的队伍, 从而保持其的高优先级