一、简述
在单核系统下,所谓的调度问题:
- 选择下一个要运行的进程或者线程是哪一个。
所谓单核系统,就是计算机只有一个CPU。在任意时刻,只会执行一条机器指令,每个线程只有获得CPU的使用权才能执行指令。
所谓的多线程并行,从宏观上看,各个线程轮流获得CPU的使用权,分别执行各自的任务。
线程的调度与进程类似,对于按内核级别的调度,与线程所属的进程基本没有关系。
进程切换的代价是比较大的,包括用户态到内核态的切换、保存当前的状态、内存映像的改变、调度程序以及载入新进程的状态。另外,会导致高速缓存的失败。
调度程序要考虑的要素:
- 进程是CPU密集型还是I/O密集型。CPU密集型可能会长期占用CPU,而I/O密集型可能会需要尽快运行,并且很快会阻塞。
- 何时调度。创建进程、进程退出、进程阻塞以及I/O中断发生。
- 是否支持抢占。支持抢占的调度,可以不必等待当前进程运行或阻塞,直接上CPU运行。
二、调度算法的分类
不同的环境需要不同的调度算法那,也需要不同的考量指标。
- 批处理。批处理系统下,不需要特别快的响应速度,所以可以考虑非抢占以及每个进程都有长时间的抢占算法。指标主要是:吞吐量、周转时间以及CPU利用率。
- 交互式。交互式系统下,抢占是必须的,因为操作者会希望比较快的得到响应。考虑的指标主要是最小响应时间、均衡性。
- 实时。实时系统下,最重要的是满足截止时间要求,即在一定的时间内完成任务。
三、批处理系统中的调度
- 先来先服务(first-come-first-serve)。最简单的方式,非抢占式的先来先服务,从字面意思就可以看出,把任务作为一个队列,先来先服务。缺点是,无法体现任务的轻重缓急,达不到理想的指标性能。
- 最短作业优先。非抢占式下,即当一个任务完成时,从任务队列中挑选最短的一个作业执行。相对于先来先服务,提高了一些性能。运行时间必须提前掌握。
- 最短剩余时间优先。即最短作业优先的抢占版本。调度程序总是选择剩余运行时间最短的作业执行。每当一个新的作业到达,如果运行时间比当前进程的剩余运行时间短,就挂起当前进程并切换到新的进程。
四 、交互式系统中的调度
- 轮转调度。最简单且最公平的方法,给每个进程分配一个时间片。当时间片耗尽时,进程会下CPU并加入到就绪队列的队尾。问题的关键是选择合适的时间片。
- 优先级调度。进程有轻重缓急,于是给进程设置不同的优先级,每次调度优先级最高的进程运行。当然,这样可能会导致优先级低的进程饥饿。解决方法时,实行奖惩措施。高优先级进程耗尽时间片会降低它的优先级。
- 多级队列。给不同优先级的进程队列,设置不同单位的时间片。同时,设置不同单位的时间片。同时,也实行奖惩机制,耗尽时间片会改变进程的队列级别。
五、线程的调度
线程的调度,取决于支持的是内核级线程还是用户级线程。
对于用户级线程,内核不知道线程的存在,就给了进程很大的自主权。内核只是调度进程,进程中的调度程序选择哪个线程来运行。
对于内核级线程,线程的调度就交给了系统完成。
参考文献:
[1] 百度百科-线程调度
[2] 操作系统学习笔记(三) 进程和线程的调度