操作系统原理与设计(6)调度的概念、层次和切换过程
本系列笔记整理自 https://www.bilibili.com/video/BV1YE411D7nH
个人认为讲解比较清晰,容易理解。
一、调度的基本概念和层次
1.1 调度的基本概念
什么是调度?我们为什么需要调度?我们知道计算机中有许多任务,但资源有限,很多事情没法同时处理。这就需要确定某种规则来决定处理这些任务的顺序,这就是“调度”要研究的问题。
1.2 调度的三个层次
调度可以分为三个层次,分别是高级调度、低级调度。下面我们分开讲解这几个概念。
1.2.1 高级调度
作业在计算机中指的是一个具体的任务。当用户向系统同时提交多个作业时,操作系统就要按照一定的原则从外存的作业后备队列中挑选一个作业调入内存,并创建进程,这就是高级调度。每个作业只调入一次,调出一次。作业调入时会建立 PCB,调出时撤销 PCB。
Tip: 内存空间有限,有时无法将用户提交的作业全部放入内存,这时就会准备一个作业后备队列在外存中。当内存空间足够时才会将一定的作业调入内存。
1.2.2 低级调度
低级调度又称进程调度、处理机调度,是按照某种策略从就绪队列中选取一个进程,将处理机分配给它。从这里我们可以知道我们所要学习的进程调度时系统中最基本的一种调度,且进程调度的频率很高,一般几十毫秒就会进行一次。
1.2.3 中级调度
正如我们上面所说,内存空间不足时,计算机会将某些进程的数据调出外存,直到内存空闲或者进程需要运行时再重新调入内存。这些暂时调到外存的进程状态被称为挂起状态。被挂起的进程 PCB 会被组织成挂起队列。而中级调度指的就是按照某种策略将哪个处于挂起状态的进程重新调入内存。
以上就是调度的三个层次,这里我们整理一下三种调度的区别和联系:

二、进程调度的时机、切换与过程的调度方式
2.1 进程调度的时机
什么时候需要进程调度?什么时候不能进行进程调度呢?一般而言,我们可以认为当前运行的进程主动放弃处理机或者被动放弃处理机时就需要进行进程调度。
比如说,如果当一个进程正常终止,或运行过程发生异常而终止,抑或是进程主动请求阻塞(等待 I/O 等)时,当前进程就是在主动放弃处理机。如果分给进程的时间片用完了,或是有更紧急的事需要处理(I/O 中断等),抑或是有更高优先级的进程进入就绪队列时,进程就会被动放弃处理机。
但有些时候是不适合进行进程调度的!比如说之前我们已经讲过的在处理中断的过程中,往往是不适合进行调度的。更显然的情况就是在原子操作过程中(原语)。原子操作不可中断,要一气呵成,这几乎已经是原子的定义了,当然也不能进行进程调度。
另外还有一种情况不太好理解,我们这里单独来说就是进程在操作系统的内核程序临界区中时不能进行进程调度。
【补充】一些概念补充在这里。
临界资源:一个时间段内只允许一个进程使用的资源。各进程需要互斥地访问临界资源。
临界区:用来访问临界资源的那段代码。
内核程序临界区一般是用来访问某种内核数据结构的,比如进程的就绪队列。这时如果不尽快释放这部分临界资源的话,可能会导致内核中其它管理工作。比如本来应该进入运行态的程序无法被访问。但是有一些临界区只是普通临界区,里面的资源影响并不大,因此就可以在访问时进行调度与切换。
2.2进程调度的方式
由于某些操作系统要求进程只能主动放弃处理机,不能被动放弃处理机,因此进程调度的方式可以分为两类:一种是非剥夺调度方式,又称非抢占方式。即,只允许进程主动放弃处理机。在运行过程中即便有更紧迫的任务到达,当前进程依旧会继续使用处理机。另一种是剥夺调度方式,又称抢占方式。当一个进程在处理机上运行时,如果有更重要的进程需要使用处理机的话,则立即暂停正在执行的进程,将处理机分配给更紧迫的进程。
2.3 进程的切换与过程
进程调度从狭义上讲指的是从就绪队列中选取一个要运行的进程。这个进程可能是刚刚暂停执行的进程,也可能是另一个进程。在完成后一个的过程中我们就需要进程切换,也就是说进程切换指的是一个进程让出处理机,由另一个进程占用处理机的过程。但广义的进程调度包含了这两部分。
进程切换的过程主要是为了完成对原来运行进程的各种数据的保存,和对新的进程各种数据的恢复。不过我们要清楚进程切换是比较耗时间的,所以我们的调度算法应该尽量避免过于频繁的进程切换。