【哈工大李治军操作系统听课笔记】L14 CPU调用策略

1.PC机上CPU调度的三个基本准则

任务周转时间:即任务从新建进入操作系统到该任务完成离开操作系统所经历的全部时间
任务是响应时间:即从用户向某个程序发起一个交互操作到该任务相应这个操作之间经历的时间,例如单击菜单到菜单弹出这段时间
系统吞吐量:即一段时间区域内计算机系统能完成的任务总数

2.若干CPU调度的基本算法

**前置知识:**如果操作系统支持线程,线程就是CPU调度的基本单位,否则进程就是CPU调度的基本单位。所以本节给出的调度方法既适用于线程也适用于进程,因此一下统一使用“任务”这个概念来论述CPU调度,根据上下文,这个任务可以是进程也可以是线程。

  • 先来先服务调度(first come first service,FCFS)

这是非常简单的调度算法,就是选择就绪队列头部的那个任务调度执行。处理器会被分配给最先进入就绪队列的任务。该任务一但获得CPU的使用权,就会一直执行到任务结束或阻塞时才结束。这种任务按照时间顺序来使用,非抢占内存的方式,公平公正,实现起来也相对简单;但是算法的实际效果不佳,比如在长任务后的短任务,必须等到长任务执行完毕后才能执行,不利于有效的提升用户体验。
【哈工大李治军操作系统听课笔记】L14 CPU调用策略_第1张图片

  • 最短作业优先调度(shortest job first,SJF)

该算法思想很简单,就是按照任务执行的时间从小到大排序,让任务按照这个顺序依次调度执行。但SJF调度其实只有理论意义,实际环境的工作中,一般使用最短剩余时间优先调度(shortest remaining time first,SRTF)算法。其工作原理是,每次新任务到达的时候,选择当前剩余执行时间最短的那个任务调度执行。
这是一种抢占式调度,只要有新任务出现,就有可能出现这个任务抢占当前任务的CPU。该算法虽然可获得较好的调度性能,用户体验也有所提升,但是难以准确的知道下一个CPU的执行期,只能根据每一个任务的执行历史来预测;不知道任务的具体执行时间,它的优先级还有可能继续改变,所以仍然有所缺陷。

【哈工大李治军操作系统听课笔记】L14 CPU调用策略_第2张图片

  • 轮转调度(round-robin,RR)

将一段时间等分地分割给每个任务,即给每个任务分配一个执行时间片,当前任务地时间片用完地时候就切换到下一个任务,下一个任务的时间片用完时再切换,这样一段时间内就可以让所有任务都有机会运行。从而可以提高任务的相应时间(相应时间是某个任务从收到用户操作到这个任务相应操作的时间)。
分配给调度上CPU的任务,确定了允许该任务运行的时间长度。每个任务会被分配一个时间片,在这个时间片的时间段内,允许任务运行;如果在时间片结束时该任务还在运行,就会剥夺该任务的CPU并分配给另一个进程;如果该任务在时间片结束前终止或者阻塞,则CPU会立即完成任务并进行切换。
【哈工大李治军操作系统听课笔记】L14 CPU调用策略_第3张图片

通过对操作系统参数的合理设计,RR调度算法可以保证用户的响应时间,因此RR调度也是交互式调度任务的解决方案。但是由于进程的切换,时间片轮转法要花费较多的内存开销,而且对于彼此进程间相差较大的有利,而对于进程大小相似或相同的则不利。

  • 多级队列调度(multilevel queue scheduling)

SRTF调度可以处理非交互式任务,RR可以处理交互式任务,但是操作系统中一般既有交互任务又有非交互任务。要同时处理这两种任务类型,就要使用多个队列帮助。
一个很自然的想法就是引入两个就绪队列,即交互任务队列和非交互任务队列。由于交互任务是要和用户进行交互操作的,因此称为前台队列,相应地非交互任务成为后台队列。前台队列采用RR调度,后台队列采用SRTF调度。前台队列需要不断轮询以缩短系统的响应时间,后台任务则专注处理那些不需要交互的任务。前台任务具有更高的优先级,会优先于后台任务执行。
【哈工大李治军操作系统听课笔记】L14 CPU调用策略_第4张图片

  • 多级反馈队列调度(multilevel feedback queue scheduling)

首先由于多级队列中往往会选择等待轮询前台队列,如果前台队列空了才会执行后台队列中的任务,但这样很可能导致后台队列中的任务饥饿,所以单纯使用SRTF管理后台队列是不现实的,实际上后台队列也应该按照RR来调度,以保证后台队列也不会饿死。

另外由于前后台任务并不是一成不变的,有些后台任务也需要接受用户交互,如编译任务看似是后台任务,但是编译过程中也可能要用Ctrl+C命令来中断编译。因此多级队列调度中的任务类型不应该是在任务创建时就固定下来的,而是根据任务执行过程来具体动态调整。这也就是多级反馈队列调度中反馈要表达的含义。

比较常见的动态调整思路是根据I/O动态调整的方案。因为I/O操作是区分前后台任务的一个典型特征。交互的含义就是“和用户通过I/O操作进行过交互”。所以如果一个任务最近一段时间发生了I/O操作,就可以认为其是前台任务,放入高优先级队列中。否则就是后台任务。通常I/O操作会引起阻塞,所以识别I/O操作的方法就是记录阻塞态。

另一个动态调整思路是按照执行时长进行动态调整。如果一个任务在执行完一个时间片后仍要继续执行,说明该任务没有执行完成。根据局部性原理,可以认为其是一个较长的任务。此时就会降低这个任务的优先级并且加长任务的时间片。这样的动态调整策略近似实现了最短剩余时间调度,而且不需要对未来要执行的任务时长进行预测。
【哈工大李治军操作系统听课笔记】L14 CPU调用策略_第5张图片

多级反馈队列调度近似实现了SRTF,可以降低任务周转时间。又由于多级反馈队列核心调度方式是RR,保证了任务的响应时间。多级反馈队列中的动态调整策略又可以将多种任务有机组合,并且解决了SRTF的任务时长预测问题。因此多级反馈队列比较适合在PC机等通用操作系统上工作。

你可能感兴趣的:(操作系统专栏,操作系统,笔记)