1、处理机调度的3个层次
要做什么 | 调度发生在 | 发生频率 | 对进程状态的影响 | |
---|---|---|---|---|
高级调度(作业调度) | 按照某种规则,从后备队列中选择合适的作业将其调入内存,并为其创建进程 | 外存->内存 (面向作业) | 最低 | 无->创建态->就绪态 |
中级调度(内存调度) | 按照某种规则,从挂起队列中选择合适的进程将其数据调回内存 | 外存->内存 (面向进程) | 中等 | 挂起态->就绪态(或者是阻塞挂起->阻塞态) |
低级调度(进程调度) | 按照某种规则,从就绪队列中选择一个进程为其分配处理机 | 内存->CPU | 最高 | 就绪态->运行态 |
高级调度(作业调度)
由于内存空间有限,有时无法将用户提交的作业全部放入内存,因此就需要确定某种规则来决定将作业调入内存的顺序。
中级调度(内存调度)
引入了虚拟存储技术之后,可将暂时不能运行的进程调至外存等待。等它重新具备了运行条件且内存又稍有空闲时,再重新调入内存,提高内存利用率和系统吞吐量。
暂时调到外存等待的进程状态为挂起状态。值得注意的是,PCB并不会一起调到外存,而是会常驻内存。PCB中会记录进程数据在外存中的存放位置,进程状态等信息,操作系统通过内存中的PCB来保持对各个进程的监控、管理。被挂起的进程PCB会被放到的挂起队列中。
一个进程可能会被多次调出、调入内存,因此中级调度发生的频率要比高级调度更高。
低级调度(进程调度)
其主要任务是按照某种方法和策略从就绪队列中选取一个进程,将处理机分配给它。进程调度是操作系统中最基本的一种调度,在一般的操作系统中都必须配置进程调度。进程调度的频率很高,一般几十毫秒一次。
进程调度的时机
进程调度的方式
-
非剥夺调度方式,又称非抢占方式。即,只允许进程主动放弃处理机。在运行过程中即便有更紧迫的任务到达,当前进程依然会继续使用处理机,直到该进程终止或主动要求进入阻塞态。
实现简单,系统开销小但是无法及时处理紧急任务,适合于早期的批处理系统 -
剥夺调度方式,又称抢占方式。当一个进程正在处理机上执行时,如果有一个更重要或更紧迫的进程需要使用处理机,则立即暂停正在执行的进程,将处理机分配给更重要紧迫的那个进程。
可以优先处理更紧急的进程,也可实现让各进程按时间片轮流执行的功能(通过时钟中断)。适合于分时操作系统、实时操作系统
2、调度算法的评价指标
- CPU利用率:指CPU “忙碌”的时间占总时间的比例。
- 系统吞吐量:单位时间内完成作业的数量
- 周转时间,是指从作业被提交给系统开始,到作业完成为止的这段时间间隔。
- 平均周转时间=各作业周转时间之和 / 作业数
- 带权周转时间=作业周转时间 / 作业实际运行的时间
- 平均带权周转时间=各作业带权周转时间之和 / 作业数
- 等待时间,指进程或作业处于等待处理机状态时间之和,等待时间越长,用户满意度越低。
- 响应时间,指从用户提交请求到首次产生响应所用的时间。
3、调度算法
先来先服务
适合长作业和CPU繁忙型作业(需要大量的CPU时间进行计算的作业)的调度,但不利于短作业,因为短作业必须一直等待前面的长作业执行完毕才能执行,造成了短作业等待时间过长。
短作业(进程)优先
适合短作业。该算法对长作业不利。完全未考虑作业的紧迫程度,不能保证紧迫性作业(进程)会被及时处理。
高优先权优先
-
非抢占式优先权算法:系统一旦把处理机分配给就绪队列中优先权最高的进程后,该进程便一直执行下去,直至完成;或因发生某件事件使该进程放弃处理机时,系统方可再将处理机重新分配给另一优先权最高的进程。
-
抢占式优先权算法:在其执行期间又出现了另一个其优先权更高的进程,进程调度程序就立即停止当前进程的执行,重新将处理机分配给新到的优先权最高的进程。
-
高响应比优先调度算法:HRRN为每个作业引入动态优先权,使作业的优先级随着等待时间的增加而提高:优先权 =(等待时间+要求服务时间)/要求服务时间= 响应时间 / 要求服务时间。
如何设置优先级
- 系统进程优先级 > 用户进程
- 前台进程优先级 > 后台进程
- I/O繁忙型进程优先级 > CPU繁忙型 I/O设备和CPU可以并行工作,越早执行I/O繁忙型进程,就能越早的让IO设备投入工作
基于时间片的轮转
-
时间片轮转法:系统将所有的就绪进程按先来先服务(FCFS)的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。当执行的时间片用完时进程中断,并将它送往就绪队列的末尾。
-
多级反馈队列调度算法(公认的较好的进程调度算法):设置多个就绪队列,并为各个队列设置不同的优先级。优先级依次降低。每个队列中进程的时间片大小也各不相同,在优先权越高的队列中,每个进程所规定的执行时间片就越小,后面的队列时间片就比上一个队列时间片长一倍。当一个进程进来时,先放入第一队列末尾,如果在时间片内没有执行完,就下放到第二个队列末尾,依次类推……。仅当第1~(i-1)队列均空闲时,才会调度第i队列中的进程运行。当有高于当前运行的进程进入时,系统将抢占当前进程时间片,将其放入他原来在的队列尾而不是下一层队列,让高优先级程序先运行。