[toc]
4.1 调度的概念#
从就绪队列中选一个进程分配给处理机
处理机调度是操作系统进行多道程序运行的核心
4.1.1 三级调度#
操作系统中有三种调度:
- 作业调度(外存到内存)
属于一种高级调度
从外存队列中选一批作业进入内存进行执行。
可以理解为有人一次性执行了10000个脚本,这时候的脚本作业是有调度机制的,没法一次性全部加载到内存中执行。 - 内存调度(外存->内存)
就是决定将哪个挂起状态的进程从外存重新调回内存。 但是此时还没开始跑任务,只是从外存切换到内存就绪队列 - 进程调度(内存->CPU)
从内存就绪队列中选择进程, 进行执行。
分别是从高级到低级, 频率从低到高
4.1.2 常见调度方式#
剥夺式调度: 按优先级、短时间、时间片进行抢占式调度,会强制暂停某些进程
非剥夺调度: 当某个进程完成,或者出现阻塞,才会重新分配CPU。 不可用于分时和实时系统。
linux属于剥夺还是费伯多?
4.1.3 调度系统设计的评价准则#
CPU利用率: CPU运行时间/ 空闲时间加运行时间
系统吞吐量: 单位时间内完成的作业数量
周转时间: 从提交到作业完成的时间, 包括了等待\IO等
等待时间: 在就绪队列中等待的时间之和
响应时间: 从提交请求到系统首次擦还是你哼响应的时间。
4.2 进程调度算法#
4.2.1 FCFS先来先服务#
- 不可抢占式
- 用于作业调度和进程调度
- 有利于CPU繁忙作业,即基本都在高强度计算,不会有IO操作等。这时候一般不允许抢占。
4.2.2 短作业优先#
- 从优先就绪队列中选择 预估运行时间最短的作业
- 可能导致长作业的饥饿
- 但是能让 平均等待时间最短, 但一般不考虑这个
4.2.3 优先级调度算法#
- 选择优先级最高的作业运行
- 有2种优先级判断方式:
- 静态优先:进程创建时已经决定了优先级
- 动态优先: 根据CPU占有时间、等待时间,判断他是否属于IO繁忙,并调整优先级
4.2.4 高相应比优先#
- 相应比= (等待时间+ 估计运行时间) / 估计运行时间
这样等待的越久,就越有可能出队,避免4.2.2中的长作业饥饿
4.2.5 时间片轮转#
- 时间片用完,立刻切换到下一个进程
- 时间片的长短,取决于系统的处理能力、队列中的进程数量、系统响应时间
4.2.6 多级反馈队列调度算法#
- 设置多个不同优先级的队列。
- 队列优先级越高, 运行的时间片就越小
- 每当有一个作业跑完1次时间片,就放到下一级队列(相当于降低优先级)
- 当新进程进入,默认放入高优先级队列。对于短作业而言可以立刻响应,而他如果是长作业,则会逐步降低优先级。
- 相当于结合了短作业优先、 优先级调度、 时间片3个算法的优势
4.2.7 linux和windows中的调度算法#
Linux 标准内核实现两个调度类:采用 CFS 调度算法的默认调度类和实时调度类.
CFS 调度程序并不采用严格规则来为一个优先级分配某个长度的时间片,而是为每个任务分配一定比例的 CPU 处理时间。每个任务分配的具体比例是根据友好值来计算的。友好值的范围从 -20 到 +19,数值较低的友好值表示较高的相对优先级。具有较低友好值的任务,与具有较高友好值的任务相比,会得到更高比例的处理器处理时间。默认友好值为 0。