为什么要进行处理机调度
如果没有处理机调度,则意味着必须等待当前进程执行完毕后下一进程才能执行,而进程常需等待外设的输入,I/O的速度相比处理机是非常慢的,因此这会对处理机资源造成严重浪费。引入调度后,可在运行进程等待输入时把处理机调度给其他进程,从而提高处理机的利用率。
调度的层次
三级调度
- 作业调度(高级)
在外存的作业中挑选一个或多个作业,给它们分配内存、I/O设备等资源,并建立相应的进程。 - 内存调度(中级)
把暂时不能运行的进程调至外存等待(挂起态),当它们重新具备运行条件且内存空闲时,由中级调度来把这些就绪进程重新调入内存,并修改为就绪态,挂在就绪队列上等待。 - 进程调度(低级)
从就绪队列选取一个进程把处理机分配给它。
三级调度的联系
- 作业调度从外存的后备队列选择一批作业进入内存,为它们建立进程,为进程活动做准备,频率最低。
- 进程调度从就绪队列选出一个进程把其改为运行态,分配给它CPU,频率最高。
- 中级调度为了提高内存的利用率和系统吞吐量,系统把暂时不能运行的进程挂起来,中级调度又选择具备条件的进程将其唤醒。
进程调度方式
- 非剥夺调度方式(非抢占式)
一旦把一个CPU分配给一个进程,该进程就会保持CPU直到终止或转化为等待态。这种方式实现简单、系统开销小,适用于大多数批处理系统,但不能用于分时系统和实时系统。 - 剥夺调度方式(抢占式)
若有优先级更高的进程需要使用处理机,则立即暂停正在执行的进程。这种方式对提高系统吞吐率和响应效率有明显的好处。
调度的评价准则
- CPU利用率
- 系统吞吐量:单位时间内CPU完成的任务数
- 周转时间 = 作业完成时间 - 作业提交时间
- 等待时间:等待处理机状态的时间之和
- 响应时间:用户提交请求到系统首次产生响应所用的时间
典型的调度算法
- 先来先服务调度算法(FCFS)
既可用于作业调度,又可用于进程调度。非抢占式。算法简单,效率低,相比SJF和高响应比算法对于短作业不利,有利于CPU繁忙型作业,但不利于I/O繁忙型作业。 - 短作业优先调度算法(SJF)
短作业优先(SJF)算法从后备队列选择一个或多个估计运行时间最短的作业,将它们调入内存;短进程优先(SPF)调度算法从就绪队列选择一个估计运行时间最短的进程,将处理机分配给它。非抢占式。该算法对长作业不利(饥饿现象),不能保证紧迫性作业会被及时处理,但是平均等待时间、平均周转时间最少。 - 高响应比优先调度算法(对FCFS和SJF算法的综合平衡)
响 应 比 = 等 待 时 间 + 要 求 服 务 时 间 要 求 服 务 时 间 响应比=\frac{等待时间+要求服务时间}{要求服务时间} 响应比=要求服务时间等待时间+要求服务时间主要用于作业调度,每次调度前先计算每个作业的响应比,选出响应比最高的作业投入运行。根据公式可知
①作业等待时间相同,短作业的要求服务时间短,响应比更高,有利于短作业
②要求服务时间相同,等待时间越长,响应比越高,实现了先来先服务。
③对于长作业,等待时间越长,响应比越高,因此也可以获得处理机,解决了饥饿状态。 - 优先级调度算法
既可用于作业调度,又可用于进程调度。根据优先级更高进程是否可抢占正在执行的进程,分为抢占式和非抢占式两种。根据进程创建后优先级是否可以改变分为静态优先级和动态优先级。一般优先级的设计遵守下列原则:
① 系统进程 > 用户进程
② 交互型进程 > 非交互型进程
③ I/O型进程 > 计算型进程 - 时间片轮转调度算法
主要用于分时系统,先来先服务原则,但仅运行一个时间片,时间到后如果进程未完成,则重新返回就绪队列末尾排队。 - 多级反馈队列调度算法(融合了前几钟算法的优点)
①设置多个就绪队列,赋予各个队列不同的优先级,第1级队列优先级最高,随后依次递减。
②各个队列时间片大小不同,优先级越高,时间片越小
③一个进程进入内存后,首先都放入第1级的队列末尾,队列内部采用FCFS原则,一次调度未完成的进程转入下一级队列的末尾,直到第n级队列(无法再降,就一直留在最低优先级的队列直到运行结束)。
④抢占式调度,永远运行优先级更高的队列,直到该队列空才会运行下一级队列。
优势:对于这种算法,短作业优先,周转时间短,长作业经过前面几个队列也得到部分执行,不会长期得不到处理。
调度的时机、切换和过程
不能进行调度的三种情况
- 在处理中断过程中
- 进程处于操作系统内核程序临界区
- 原子操作过程中
应该进行调度和切换的情况
- 当前进程无法继续运行
- 中断处理结束或自陷处理结束后